From 251ddb8ff8cb0436fa39f76df522dcfe15c32c38 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Mon, 10 Nov 2025 10:36:13 +1100 Subject: [PATCH] Rearchitecture for v0.4.0 (#197) * feat: database redist support * feat: rearchitecture of database schemas, migration reset, and #180 * feat: import redists * fix: giantbomb logging bug * feat: partial user platform support + statusMessage -> message * feat: add user platform filters to store view * fix: sanitize svg uploads ... copilot suggested this I feel dirty. * feat: beginnings of platform & redist management * feat: add server side redist patching * fix: update drop-base commit * feat: import of custom platforms & file extensions * fix: redelete platform * fix: remove platform * feat: uninstall commands, new R UI * checkpoint: before migrating to nuxt v4 * update to nuxt 4 * fix: fixes for Nuxt v4 update * fix: remaining type issues * feat: initial feedback to import other kinds of versions * working commit * fix: lint * feat: redist import --- .github/workflows/release.yml | 4 +- app.vue => app/app.vue | 0 {assets => app/assets}/core.scss | 0 {assets => app/assets}/tailwindcss.css | 2 +- .../components}/AccountSidebar.vue | 0 .../components}/AddLibraryButton.vue | 0 .../components}/Auth/OpenID.vue | 0 .../components}/Auth/Simple.vue | 4 +- .../components}/CarouselPagination.vue | 0 .../components}/Directory/Library.vue | 0 .../components}/Directory/News.vue | 0 {components => app/components}/DropLogo.vue | 0 .../components}/DropWordmark.vue | 0 {components => app/components}/EmojiText.vue | 0 .../components}/GameCarousel.vue | 2 +- .../components}/GameEditor/Metadata.vue | 16 +- app/components/GameEditor/Version.vue | 285 + {components => app/components}/GamePanel.vue | 2 +- .../components}/GameSearchResultWidget.vue | 2 +- .../components}/Icons/DiscordLogo.vue | 0 .../components}/Icons/GamepadIcon.vue | 0 .../components}/Icons/GithubLogo.vue | 0 .../components}/Icons/LinuxLogo.vue | 0 .../components}/Icons/MacLogo.vue | 0 app/components/Icons/Platform.vue | 26 + .../components}/Icons/SSOLogo.vue | 0 .../Icons/SimpleAuthenticationLogo.vue | 0 .../components}/Icons/WindowsLogo.vue | 0 app/components/Import/Game.vue | 238 + app/components/Import/Redist.vue | 336 + .../components}/LanguageSelector.vue | 0 .../components}/LanguageSelectorListbox.vue | 2 +- {components => app/components}/LogLine.vue | 2 +- .../components}/Modal/AddCompanyGame.vue | 10 +- .../components}/Modal/CreateCollection.vue | 6 +- .../components}/Modal/CreateCompany.vue | 2 +- .../components}/Modal/CreateTag.vue | 2 +- .../components}/Modal/CreateToken.vue | 0 .../components}/Modal/DeleteCollection.vue | 6 +- .../components}/Modal/DeleteNews.vue | 4 +- .../components}/Modal/DeleteUser.vue | 6 +- .../components}/Modal/UploadFile.vue | 2 +- .../components}/MultiItemSelector.vue | 0 .../components}/NewsArticleCreateButton.vue | 4 +- .../components}/NotificationItem.vue | 2 +- .../components}/OptionWrapper.vue | 0 .../components}/PanelWidget.vue | 0 .../components}/PieChart/PieChart.vue | 0 .../components}/PieChart/PieSlice.vue | 0 .../components}/PieChart/types.d.ts | 0 .../components}/PieChart/utils.ts | 0 .../components}/PlatformSelector.vue | 53 +- app/components/PreloadSelector.vue | 120 + .../components}/ProgressBar.vue | 0 .../components}/RankingList.vue | 0 app/components/RedistEditor/Metadata.vue | 14 + .../components}/RelativeTime.vue | 0 .../components}/Setup/Account.vue | 0 .../components}/Setup/Library.vue | 0 .../components}/SkeletonCard.vue | 0 .../components}/SourceOptions/Filesystem.vue | 0 .../SourceOptions/FlatFilesystem.vue | 0 .../components}/SourceTable.vue | 6 +- {components => app/components}/StoreView.vue | 14 +- {components => app/components}/TaskWidget.vue | 2 +- .../components}/TileWithLink.vue | 0 {components => app/components}/UserFooter.vue | 0 {components => app/components}/UserHeader.vue | 0 .../UserHeader/NotificationWidgetPanel.vue | 2 +- .../components}/UserHeader/UserWidget.vue | 2 - .../components}/UserHeader/Widget.vue | 0 .../composables}/collection.ts | 2 +- .../composables}/current-page-engine.ts | 0 {composables => app/composables}/news.ts | 2 +- .../composables}/notifications.ts | 2 +- {composables => app/composables}/objects.ts | 0 app/composables/platform.ts | 36 + {composables => app/composables}/request.ts | 7 +- {composables => app/composables}/store.ts | 1 + {composables => app/composables}/task.ts | 2 +- {composables => app/composables}/types.ts | 8 +- {composables => app/composables}/user.ts | 2 +- {composables => app/composables}/users.ts | 4 +- {composables => app/composables}/ws.ts | 2 +- error.vue => app/error.vue | 2 + {layouts => app/layouts}/admin.vue | 2 - {layouts => app/layouts}/default.vue | 4 +- .../middleware}/require-user.global.ts | 0 {pages => app/pages}/account.vue | 0 {pages => app/pages}/account/devices.vue | 0 {pages => app/pages}/account/index.vue | 0 .../pages}/account/notifications.vue | 2 +- {pages => app/pages}/account/security.vue | 0 {pages => app/pages}/account/settings.vue | 0 {pages => app/pages}/account/tokens.vue | 2 +- {pages => app/pages}/admin/index.vue | 4 +- .../pages/admin/library/g}/[id]/import.vue | 530 +- .../pages/admin/library/g}/[id]/index.vue | 69 - app/pages/admin/library/import.vue | 357 ++ {pages => app/pages}/admin/library/index.vue | 188 +- app/pages/admin/library/r/[id]/import.vue | 478 ++ app/pages/admin/library/r/[id]/index.vue | 85 + .../pages}/admin/library/sources/index.vue | 39 +- .../admin/metadata/companies/[id]/index.vue | 2 +- .../pages}/admin/metadata/companies/index.vue | 2 +- {pages => app/pages}/admin/metadata/index.vue | 0 {pages => app/pages}/admin/metadata/tags.vue | 2 +- {pages => app/pages}/admin/settings.vue | 0 {pages => app/pages}/admin/settings/index.vue | 2 +- .../pages}/admin/settings/tokens.vue | 2 +- .../pages}/admin/task/[id]/index.vue | 0 {pages => app/pages}/admin/task/index.vue | 8 +- .../pages}/admin/users/auth/index.vue | 2 +- .../pages}/admin/users/auth/simple/index.vue | 4 +- {pages => app/pages}/admin/users/index.vue | 3 +- {pages => app/pages}/auth/register.vue | 4 +- {pages => app/pages}/auth/signin.vue | 3 +- .../pages}/client/authorize/[id].vue | 8 +- {pages => app/pages}/client/code/index.vue | 8 +- {pages => app/pages}/community.vue | 0 {pages => app/pages}/index.vue | 0 {pages => app/pages}/library.vue | 0 .../pages}/library/collection/[id]/index.vue | 3 +- .../pages}/library/game/[id]/index.vue | 0 {pages => app/pages}/library/index.vue | 2 +- {pages => app/pages}/news.vue | 0 {pages => app/pages}/news/[id]/index.vue | 2 +- {pages => app/pages}/news/index.vue | 2 +- {pages => app/pages}/setup.vue | 6 +- {pages => app/pages}/store/[id]/index.vue | 37 +- {pages => app/pages}/store/c/[id]/index.vue | 0 {pages => app/pages}/store/index.vue | 0 {pages => app/pages}/store/t/[id]/index.vue | 0 {plugins => app/plugins}/error-handler.ts | 0 {plugins => app/plugins}/vuedraggable.ts | 0 {utils => app/utils}/array.ts | 0 {utils => app/utils}/colors.ts | 0 {utils => app/utils}/parseTaskLog.ts | 2 +- {utils => app/utils}/tuple.ts | 0 changelog.md | 544 -- composables/icons.ts | 8 - eslint.config.mjs | 1 + i18n/locales/de.json | 2 +- i18n/locales/en_pirate.json | 2 +- i18n/locales/en_us.json | 12 +- i18n/locales/fr.json | 2 +- nuxt.config.ts | 19 +- package.json | 8 +- pages/admin/library/import.vue | 414 -- pnpm-lock.yaml | 5566 +++++++---------- pnpm-workspace.yaml | 8 +- .../migration.sql | 25 - .../migration.sql | 9 - .../migration.sql | 76 - .../migration.sql | 24 - .../migration.sql | 16 - .../migration.sql | 12 - .../migration.sql | 2 - .../20241007065541_add_client/migration.sql | 15 - .../migration.sql | 19 - .../migration.sql | 12 - .../migration.sql | 25 - .../migration.sql | 25 - .../migration.sql | 12 - .../migration.sql | 18 - .../migration.sql | 8 - .../migration.sql | 14 - .../migration.sql | 10 - .../migration.sql | 8 - .../migration.sql | 9 - .../migration.sql | 8 - .../migration.sql | 9 - .../migration.sql | 7 - .../migration.sql | 14 - .../migration.sql | 14 - .../migration.sql | 23 - .../migration.sql | 9 - .../migration.sql | 8 - .../migration.sql | 18 - .../migration.sql | 2 - .../migration.sql | 5 - .../migration.sql | 8 - .../migration.sql | 2 - .../migration.sql | 5 - .../migration.sql | 11 - .../migration.sql | 16 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 6 - .../migration.sql | 29 - .../migration.sql | 28 - .../migration.sql | 5 - .../20250128102738_add_news/migration.sql | 16 - .../20250204010021_add_tokens/migration.sql | 15 - .../migration.sql | 5 - .../migration.sql | 8 - .../migration.sql | 14 - .../migration.sql | 20 - .../migration.sql | 52 - .../migration.sql | 8 - .../migration.sql | 8 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 10 - .../migration.sql | 5 - .../migration.sql | 17 - .../migration.sql | 2 - .../migration.sql | 24 - .../migration.sql | 3 - .../migration.sql | 14 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 10 - .../migration.sql | 13 - .../migration.sql | 8 - .../migration.sql | 2 - .../migration.sql | 5 - .../migration.sql | 7 - .../migration.sql | 2 - .../migration.sql | 8 - .../migration.sql | 20 - .../migration.sql | 16 - .../migration.sql | 35 - .../migration.sql | 76 - .../migration.sql | 16 - .../migration.sql | 11 - .../migration.sql | 41 - .../migration.sql | 2 - .../migration.sql | 53 - .../migration.sql | 17 - .../migration.sql | 8 - .../migration.sql | 14 - .../migration.sql | 8 - .../migration.sql | 41 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 5 - .../migration.sql | 14 - .../20250721053514_add_featured/migration.sql | 2 - .../migration.sql | 11 - .../20250721062509_add_pg_trgm/migration.sql | 5 - .../migration.sql | 2 - .../migration.sql | 87 - .../migration.sql | 11 - .../migration.sql | 15 - .../migration.sql | 8 - .../20250906060327_init/migration.sql | 765 +++ .../migration.sql | 15 + .../migration.sql | 21 + .../migration.sql | 20 + .../migration.sql | 8 + .../migration.sql | 20 + .../migration.sql | 8 + .../migration.sql | 41 + .../migration.sql | 15 + .../migration.sql | 18 + .../migration.sql | 17 + prisma/models/app.prisma | 19 +- prisma/models/client.prisma | 2 +- prisma/models/content.prisma | 300 +- prisma/models/metadata.prisma | 180 + prisma/schema.prisma | 9 - server/api/v1/admin/auth/index.get.ts | 6 +- .../v1/admin/auth/invitation/index.delete.ts | 6 +- .../api/v1/admin/auth/invitation/index.get.ts | 8 +- .../v1/admin/auth/invitation/index.post.ts | 8 +- .../api/v1/admin/company/[id]/banner.post.ts | 14 +- .../api/v1/admin/company/[id]/game.delete.ts | 6 +- .../api/v1/admin/company/[id]/game.patch.ts | 6 +- server/api/v1/admin/company/[id]/game.post.ts | 8 +- server/api/v1/admin/company/[id]/icon.post.ts | 14 +- .../api/v1/admin/company/[id]/index.delete.ts | 6 +- server/api/v1/admin/company/[id]/index.get.ts | 6 +- .../api/v1/admin/company/[id]/index.patch.ts | 4 +- server/api/v1/admin/company/index.get.ts | 4 +- server/api/v1/admin/company/index.post.ts | 10 +- server/api/v1/admin/game/[id]/index.delete.ts | 6 +- server/api/v1/admin/game/[id]/index.get.ts | 27 +- server/api/v1/admin/game/[id]/index.patch.ts | 4 +- .../api/v1/admin/game/[id]/metadata.post.ts | 28 +- server/api/v1/admin/game/[id]/tags.patch.ts | 6 +- .../api/v1/admin/game/image/index.delete.ts | 16 +- server/api/v1/admin/game/image/index.post.ts | 18 +- server/api/v1/admin/game/index.get.ts | 4 +- .../api/v1/admin/game/version/index.delete.ts | 11 +- .../api/v1/admin/game/version/index.patch.ts | 53 +- server/api/v1/admin/home/index.get.ts | 10 +- server/api/v1/admin/import/game/index.get.ts | 6 +- server/api/v1/admin/import/game/index.post.ts | 14 +- server/api/v1/admin/import/game/search.get.ts | 8 +- .../api/v1/admin/import/redist/index.get.ts | 3 + .../api/v1/admin/import/redist/index.post.ts | 92 + .../api/v1/admin/import/version/index.get.ts | 42 +- .../api/v1/admin/import/version/index.post.ts | 117 +- .../v1/admin/import/version/preload.get.ts | 30 +- server/api/v1/admin/index.get.ts | 2 +- server/api/v1/admin/library/index.get.ts | 12 +- .../v1/admin/library/sources/index.delete.ts | 8 +- .../api/v1/admin/library/sources/index.get.ts | 6 +- .../v1/admin/library/sources/index.patch.ts | 16 +- .../v1/admin/library/sources/index.post.ts | 18 +- server/api/v1/admin/news/[id]/index.delete.ts | 4 +- server/api/v1/admin/news/[id]/index.get.ts | 4 +- server/api/v1/admin/news/index.get.ts | 8 +- server/api/v1/admin/news/index.post.ts | 14 +- server/api/v1/admin/platforms.get.ts | 11 + .../api/v1/admin/redist/[id]/index.delete.ts | 19 + server/api/v1/admin/redist/[id]/index.get.ts | 38 + .../api/v1/admin/redist/[id]/index.patch.ts | 27 + server/api/v1/admin/redist/index.get.ts | 16 + .../api/v1/admin/settings/dummy-data.get.ts | 4 +- server/api/v1/admin/settings/index.patch.ts | 6 +- server/api/v1/admin/tags/[id]/index.delete.ts | 6 +- server/api/v1/admin/tags/index.get.ts | 4 +- server/api/v1/admin/tags/index.post.ts | 6 +- server/api/v1/admin/task/index.get.ts | 10 +- server/api/v1/admin/task/index.post.ts | 21 +- .../api/v1/admin/token/[id]/index.delete.ts | 10 +- server/api/v1/admin/token/acls.get.ts | 4 +- server/api/v1/admin/token/index.get.ts | 6 +- server/api/v1/admin/token/index.post.ts | 10 +- .../api/v1/admin/users/[id]/index.delete.ts | 10 +- server/api/v1/admin/users/[id]/index.get.ts | 10 +- server/api/v1/admin/users/index.get.ts | 4 +- server/api/v1/auth/index.get.ts | 2 +- server/api/v1/auth/signin/simple.post.ts | 26 +- server/api/v1/auth/signup/simple.get.ts | 12 +- server/api/v1/auth/signup/simple.post.ts | 18 +- .../api/v1/client/auth/callback/index.post.ts | 8 +- server/api/v1/client/auth/code/index.get.ts | 8 +- server/api/v1/client/auth/code/index.post.ts | 10 +- server/api/v1/client/auth/code/ws.get.ts | 6 +- server/api/v1/client/auth/handshake.post.ts | 12 +- server/api/v1/client/auth/index.get.ts | 10 +- server/api/v1/client/auth/initiate.post.ts | 22 +- server/api/v1/client/capability/index.post.ts | 57 +- server/api/v1/client/chunk.get.ts | 20 +- .../v1/client/collection/[id]/entry.delete.ts | 10 +- .../v1/client/collection/[id]/entry.post.ts | 8 +- .../v1/client/collection/[id]/index.delete.ts | 10 +- .../v1/client/collection/[id]/index.get.ts | 10 +- .../client/collection/default/entry.delete.ts | 6 +- .../client/collection/default/entry.post.ts | 6 +- .../v1/client/collection/default/index.get.ts | 4 +- server/api/v1/client/collection/index.get.ts | 4 +- server/api/v1/client/collection/index.post.ts | 6 +- server/api/v1/client/game/[id]/index.get.ts | 8 +- server/api/v1/client/game/manifest.get.ts | 13 +- server/api/v1/client/game/version.get.ts | 15 +- server/api/v1/client/game/versions.get.ts | 28 +- server/api/v1/client/news/[id]/index.get.ts | 4 +- server/api/v1/client/news/index.get.ts | 8 +- server/api/v1/client/object/[id]/index.get.ts | 8 +- .../[gameid]/[slotindex]/index.delete.ts | 18 +- .../saves/[gameid]/[slotindex]/index.get.ts | 18 +- .../saves/[gameid]/[slotindex]/push.post.ts | 18 +- .../api/v1/client/saves/[gameid]/index.get.ts | 12 +- .../v1/client/saves/[gameid]/index.post.ts | 16 +- server/api/v1/client/saves/index.get.ts | 8 +- server/api/v1/client/saves/settings.get.ts | 8 +- server/api/v1/client/user/index.get.ts | 2 +- server/api/v1/client/user/library.get.ts | 4 +- server/api/v1/client/user/webtoken.post.ts | 8 +- server/api/v1/collection/[id]/entry.delete.ts | 10 +- server/api/v1/collection/[id]/entry.post.ts | 8 +- server/api/v1/collection/[id]/index.delete.ts | 12 +- server/api/v1/collection/[id]/index.get.ts | 12 +- .../api/v1/collection/default/entry.delete.ts | 8 +- .../api/v1/collection/default/entry.post.ts | 8 +- server/api/v1/collection/default/index.get.ts | 6 +- server/api/v1/collection/index.get.ts | 4 +- server/api/v1/collection/index.post.ts | 6 +- server/api/v1/companies/[id]/index.get.ts | 8 +- server/api/v1/games/[id]/index.get.ts | 37 +- server/api/v1/index.get.ts | 2 +- server/api/v1/news/[id]/index.get.ts | 6 +- server/api/v1/news/index.get.ts | 10 +- .../api/v1/notifications/[id]/index.delete.ts | 8 +- server/api/v1/notifications/[id]/index.get.ts | 8 +- server/api/v1/notifications/[id]/read.post.ts | 8 +- server/api/v1/notifications/index.get.ts | 6 +- server/api/v1/notifications/readall.post.ts | 6 +- server/api/v1/notifications/ws.get.ts | 6 +- server/api/v1/object/[id]/index.delete.ts | 6 +- server/api/v1/object/[id]/index.get.ts | 8 +- server/api/v1/object/[id]/index.head.ts | 8 +- server/api/v1/object/[id]/index.post.ts | 8 +- .../api/v1/screenshots/[id]/index.delete.ts | 6 +- server/api/v1/screenshots/[id]/index.get.ts | 6 +- .../api/v1/screenshots/game/[id]/index.get.ts | 6 +- .../v1/screenshots/game/[id]/index.post.ts | 10 +- server/api/v1/screenshots/index.get.ts | 4 +- server/api/v1/settings/index.get.ts | 4 +- server/api/v1/setup.post.ts | 8 +- server/api/v1/store/featured.get.ts | 4 +- server/api/v1/store/index.get.ts | 26 +- server/api/v1/store/platforms.get.ts | 17 + server/api/v1/store/tags.get.ts | 4 +- server/api/v1/tags/[id]/index.get.ts | 8 +- server/api/v1/task/index.get.ts | 4 +- server/api/v1/token.get.ts | 2 +- .../api/v1/user/client/[id]/index.delete.ts | 6 +- server/api/v1/user/client/index.get.ts | 4 +- server/api/v1/user/index.get.ts | 2 +- server/api/v1/user/token/[id]/index.delete.ts | 10 +- server/api/v1/user/token/acls.get.ts | 4 +- server/api/v1/user/token/index.get.ts | 6 +- server/api/v1/user/token/index.post.ts | 10 +- server/api/v2/client/chunk.post.ts | 14 +- server/api/v2/client/context.post.ts | 8 +- server/arktype.ts | 4 +- server/internal/acls/descriptions.ts | 6 + server/internal/acls/index.ts | 11 +- server/internal/auth/index.ts | 4 +- server/internal/auth/oidc/index.ts | 6 +- server/internal/clients/ca.ts | 6 +- server/internal/clients/capabilities.ts | 44 +- server/internal/clients/event-handler.ts | 22 +- server/internal/clients/handler.ts | 31 +- .../config/application-configuration.ts | 2 +- server/internal/db/database.ts | 2 +- server/internal/downloads/coordinator.ts | 17 +- server/internal/downloads/manifest.ts | 62 +- server/internal/gamesize/index.ts | 55 +- server/internal/library/REDIST-README.md | 3 + server/internal/library/index.ts | 495 +- server/internal/library/provider.ts | 2 +- .../internal/library/providers/filesystem.ts | 4 +- server/internal/library/providers/flat.ts | 4 +- server/internal/metadata/giantbomb.ts | 6 +- server/internal/metadata/igdb.ts | 8 +- server/internal/metadata/index.ts | 26 +- server/internal/metadata/manual.ts | 2 +- server/internal/metadata/pcgamingwiki.ts | 12 +- server/internal/metadata/steam.ts | 4 +- server/internal/metadata/types.d.ts | 2 +- server/internal/notifications/index.ts | 2 +- server/internal/objects/fsBackend.ts | 10 +- server/internal/objects/objectHandler.ts | 13 +- server/internal/objects/transactional.ts | 2 +- server/internal/platform/link.ts | 47 + server/internal/saves/index.ts | 6 +- server/internal/screenshots/index.ts | 2 +- server/internal/session/index.ts | 2 +- server/internal/tasks/group.ts | 52 +- server/internal/tasks/index.ts | 69 +- server/internal/tasks/registry/debug.ts | 4 +- server/internal/tasks/registry/invitations.ts | 2 +- server/internal/tasks/registry/objects.ts | 4 +- server/internal/tasks/registry/sessions.ts | 2 +- server/internal/tasks/registry/update.ts | 2 +- server/internal/tasks/utils.ts | 58 + server/internal/utils/handlefileupload.ts | 26 +- server/internal/utils/parseplatform.ts | 8 +- server/internal/utils/prioritylist.ts | 3 +- server/plugins/01.system-init.ts | 2 +- server/plugins/02.setup-admin.ts | 4 +- server/plugins/03.metadata-init.ts | 2 +- server/plugins/04.auth-init.ts | 2 +- server/plugins/05.library-init.ts | 42 +- server/routes/auth/callback/oidc.get.ts | 10 +- server/routes/auth/oidc.get.ts | 2 +- server/tasks/dailyTasks.ts | 2 +- server/tsconfig.json | 6 - tsconfig.json | 12 +- 465 files changed, 8029 insertions(+), 7509 deletions(-) rename app.vue => app/app.vue (100%) rename {assets => app/assets}/core.scss (100%) rename {assets => app/assets}/tailwindcss.css (89%) rename {components => app/components}/AccountSidebar.vue (100%) rename {components => app/components}/AddLibraryButton.vue (100%) rename {components => app/components}/Auth/OpenID.vue (100%) rename {components => app/components}/Auth/Simple.vue (96%) rename {components => app/components}/CarouselPagination.vue (100%) rename {components => app/components}/Directory/Library.vue (100%) rename {components => app/components}/Directory/News.vue (100%) rename {components => app/components}/DropLogo.vue (100%) rename {components => app/components}/DropWordmark.vue (100%) rename {components => app/components}/EmojiText.vue (100%) rename {components => app/components}/GameCarousel.vue (97%) rename {components => app/components}/GameEditor/Metadata.vue (98%) create mode 100644 app/components/GameEditor/Version.vue rename {components => app/components}/GamePanel.vue (98%) rename {components => app/components}/GameSearchResultWidget.vue (90%) rename {components => app/components}/Icons/DiscordLogo.vue (100%) rename {components => app/components}/Icons/GamepadIcon.vue (100%) rename {components => app/components}/Icons/GithubLogo.vue (100%) rename {components => app/components}/Icons/LinuxLogo.vue (100%) rename {components => app/components}/Icons/MacLogo.vue (100%) create mode 100644 app/components/Icons/Platform.vue rename {components => app/components}/Icons/SSOLogo.vue (100%) rename {components => app/components}/Icons/SimpleAuthenticationLogo.vue (100%) rename {components => app/components}/Icons/WindowsLogo.vue (100%) create mode 100644 app/components/Import/Game.vue create mode 100644 app/components/Import/Redist.vue rename {components => app/components}/LanguageSelector.vue (100%) rename {components => app/components}/LanguageSelectorListbox.vue (98%) rename {components => app/components}/LogLine.vue (92%) rename {components => app/components}/Modal/AddCompanyGame.vue (96%) rename {components => app/components}/Modal/CreateCollection.vue (94%) rename {components => app/components}/Modal/CreateCompany.vue (98%) rename {components => app/components}/Modal/CreateTag.vue (97%) rename {components => app/components}/Modal/CreateToken.vue (100%) rename {components => app/components}/Modal/DeleteCollection.vue (91%) rename {components => app/components}/Modal/DeleteNews.vue (94%) rename {components => app/components}/Modal/DeleteUser.vue (91%) rename {components => app/components}/Modal/UploadFile.vue (98%) rename {components => app/components}/MultiItemSelector.vue (100%) rename {components => app/components}/NewsArticleCreateButton.vue (99%) rename {components => app/components}/NotificationItem.vue (96%) rename {components => app/components}/OptionWrapper.vue (100%) rename {components => app/components}/PanelWidget.vue (100%) rename {components => app/components}/PieChart/PieChart.vue (100%) rename {components => app/components}/PieChart/PieSlice.vue (100%) rename {components => app/components}/PieChart/types.d.ts (100%) rename {components => app/components}/PieChart/utils.ts (100%) rename {components => app/components}/PlatformSelector.vue (68%) create mode 100644 app/components/PreloadSelector.vue rename {components => app/components}/ProgressBar.vue (100%) rename {components => app/components}/RankingList.vue (100%) create mode 100644 app/components/RedistEditor/Metadata.vue rename {components => app/components}/RelativeTime.vue (100%) rename {components => app/components}/Setup/Account.vue (100%) rename {components => app/components}/Setup/Library.vue (100%) rename {components => app/components}/SkeletonCard.vue (100%) rename {components => app/components}/SourceOptions/Filesystem.vue (100%) rename {components => app/components}/SourceOptions/FlatFilesystem.vue (100%) rename {components => app/components}/SourceTable.vue (96%) rename {components => app/components}/StoreView.vue (97%) rename {components => app/components}/TaskWidget.vue (96%) rename {components => app/components}/TileWithLink.vue (100%) rename {components => app/components}/UserFooter.vue (100%) rename {components => app/components}/UserHeader.vue (100%) rename {components => app/components}/UserHeader/NotificationWidgetPanel.vue (95%) rename {components => app/components}/UserHeader/UserWidget.vue (97%) rename {components => app/components}/UserHeader/Widget.vue (100%) rename {composables => app/composables}/collection.ts (97%) rename {composables => app/composables}/current-page-engine.ts (100%) rename {composables => app/composables}/news.ts (94%) rename {composables => app/composables}/notifications.ts (83%) rename {composables => app/composables}/objects.ts (100%) create mode 100644 app/composables/platform.ts rename {composables => app/composables}/request.ts (92%) rename {composables => app/composables}/store.ts (78%) rename {composables => app/composables}/task.ts (97%) rename {composables => app/composables}/types.ts (71%) rename {composables => app/composables}/user.ts (84%) rename {composables => app/composables}/users.ts (83%) rename {composables => app/composables}/ws.ts (95%) rename error.vue => app/error.vue (99%) rename {layouts => app/layouts}/admin.vue (98%) rename {layouts => app/layouts}/default.vue (87%) rename {middleware => app/middleware}/require-user.global.ts (100%) rename {pages => app/pages}/account.vue (100%) rename {pages => app/pages}/account/devices.vue (100%) rename {pages => app/pages}/account/index.vue (100%) rename {pages => app/pages}/account/notifications.vue (98%) rename {pages => app/pages}/account/security.vue (100%) rename {pages => app/pages}/account/settings.vue (100%) rename {pages => app/pages}/account/tokens.vue (99%) rename {pages => app/pages}/admin/index.vue (97%) rename {pages/admin/library => app/pages/admin/library/g}/[id]/import.vue (55%) rename {pages/admin/library => app/pages/admin/library/g}/[id]/index.vue (51%) create mode 100644 app/pages/admin/library/import.vue rename {pages => app/pages}/admin/library/index.vue (69%) create mode 100644 app/pages/admin/library/r/[id]/import.vue create mode 100644 app/pages/admin/library/r/[id]/index.vue rename {pages => app/pages}/admin/library/sources/index.vue (94%) rename {pages => app/pages}/admin/metadata/companies/[id]/index.vue (99%) rename {pages => app/pages}/admin/metadata/companies/index.vue (98%) rename {pages => app/pages}/admin/metadata/index.vue (100%) rename {pages => app/pages}/admin/metadata/tags.vue (97%) rename {pages => app/pages}/admin/settings.vue (100%) rename {pages => app/pages}/admin/settings/index.vue (98%) rename {pages => app/pages}/admin/settings/tokens.vue (99%) rename {pages => app/pages}/admin/task/[id]/index.vue (100%) rename {pages => app/pages}/admin/task/index.vue (97%) rename {pages => app/pages}/admin/users/auth/index.vue (99%) rename {pages => app/pages}/admin/users/auth/simple/index.vue (99%) rename {pages => app/pages}/admin/users/index.vue (98%) rename {pages => app/pages}/auth/register.vue (98%) rename {pages => app/pages}/auth/signin.vue (94%) rename {pages => app/pages}/client/authorize/[id].vue (97%) rename {pages => app/pages}/client/code/index.vue (96%) rename {pages => app/pages}/community.vue (100%) rename {pages => app/pages}/index.vue (100%) rename {pages => app/pages}/library.vue (100%) rename {pages => app/pages}/library/collection/[id]/index.vue (96%) rename {pages => app/pages}/library/game/[id]/index.vue (100%) rename {pages => app/pages}/library/index.vue (98%) rename {pages => app/pages}/news.vue (100%) rename {pages => app/pages}/news/[id]/index.vue (99%) rename {pages => app/pages}/news/index.vue (98%) rename {pages => app/pages}/setup.vue (97%) rename {pages => app/pages}/store/[id]/index.vue (92%) rename {pages => app/pages}/store/c/[id]/index.vue (100%) rename {pages => app/pages}/store/index.vue (100%) rename {pages => app/pages}/store/t/[id]/index.vue (100%) rename {plugins => app/plugins}/error-handler.ts (100%) rename {plugins => app/plugins}/vuedraggable.ts (100%) rename {utils => app/utils}/array.ts (100%) rename {utils => app/utils}/colors.ts (100%) rename {utils => app/utils}/parseTaskLog.ts (90%) rename {utils => app/utils}/tuple.ts (100%) delete mode 100644 changelog.md delete mode 100644 composables/icons.ts delete mode 100644 pages/admin/library/import.vue delete mode 100644 prisma/migrations/20240928081254_create_user_and_auth_mechanisms/migration.sql delete mode 100644 prisma/migrations/20240928085121_move_to_json_for_credentials/migration.sql delete mode 100644 prisma/migrations/20240929000950_add_game_data/migration.sql delete mode 100644 prisma/migrations/20240929010842_updates_to_metadata_schema/migration.sql delete mode 100644 prisma/migrations/20241004020835_unique_constraints/migration.sql delete mode 100644 prisma/migrations/20241004025235_add_dev_pub_websites/migration.sql delete mode 100644 prisma/migrations/20241007043002_add_user_admin/migration.sql delete mode 100644 prisma/migrations/20241007065541_add_client/migration.sql delete mode 100644 prisma/migrations/20241008062519_remove_shared_token_and_add_last_connected/migration.sql delete mode 100644 prisma/migrations/20241009032354_add_account_details/migration.sql delete mode 100644 prisma/migrations/20241010062956_add_constraints/migration.sql delete mode 100644 prisma/migrations/20241010095344_various_fixes/migration.sql delete mode 100644 prisma/migrations/20241010104439_added_original_query_field/migration.sql delete mode 100644 prisma/migrations/20241010104722_fix_unique_constraints/migration.sql delete mode 100644 prisma/migrations/20241011035227_add_droplet_manifest_to_game_versions/migration.sql delete mode 100644 prisma/migrations/20241011093950_update_game_images_system/migration.sql delete mode 100644 prisma/migrations/20241011101243_revert_banner_system/migration.sql delete mode 100644 prisma/migrations/20241011103116_add_cover_image/migration.sql delete mode 100644 prisma/migrations/20241014052934_add_delta_and_order/migration.sql delete mode 100644 prisma/migrations/20241014053941_remove_version_order/migration.sql delete mode 100644 prisma/migrations/20241025091103_add_invitations/migration.sql delete mode 100644 prisma/migrations/20241102000813_create_application_configuration/migration.sql delete mode 100644 prisma/migrations/20241105221904_different_client_capabilities/migration.sql delete mode 100644 prisma/migrations/20241105222110_trackable_names_for_capabilities/migration.sql delete mode 100644 prisma/migrations/20241105225732_peer_api_configuration/migration.sql delete mode 100644 prisma/migrations/20241105230021_move_to_endpoint_configuration/migration.sql delete mode 100644 prisma/migrations/20241107080421_add_expiry_for_invitations/migration.sql delete mode 100644 prisma/migrations/20241116053120_add_notifications/migration.sql delete mode 100644 prisma/migrations/20241116054212_add_created_time_stamp_to_notifications/migration.sql delete mode 100644 prisma/migrations/20241122215933_add_created_timestamps_for_games/migration.sql delete mode 100644 prisma/migrations/20241124042825_add_released_date_for_the_game/migration.sql delete mode 100644 prisma/migrations/20241223022005_add_umu_id_to_game_version/migration.sql delete mode 100644 prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql delete mode 100644 prisma/migrations/20241223100418_update_to_prisma_6/migration.sql delete mode 100644 prisma/migrations/20241226065709_rename_custom_to_manual/migration.sql delete mode 100644 prisma/migrations/20241226230207_add_image_carousel/migration.sql delete mode 100644 prisma/migrations/20241227033610_move_image_carousel_to_image_ids/migration.sql delete mode 100644 prisma/migrations/20241230053403_add_args_and_only_setup/migration.sql delete mode 100644 prisma/migrations/20250103202348_add_collections/migration.sql delete mode 100644 prisma/migrations/20250109005948_use_collection_entry_to_ensure_unique_games/migration.sql delete mode 100644 prisma/migrations/20250128060446_casacad_e_delete_for_collection_entries/migration.sql delete mode 100644 prisma/migrations/20250128102738_add_news/migration.sql delete mode 100644 prisma/migrations/20250204010021_add_tokens/migration.sql delete mode 100644 prisma/migrations/20250204020918_add_collection_entry_casacade_delete/migration.sql delete mode 100644 prisma/migrations/20250208004345_add_api_token_name/migration.sql delete mode 100644 prisma/migrations/20250208005625_add_id_to_token/migration.sql delete mode 100644 prisma/migrations/20250211230021_ensure_non_null_launch_and_setup_commands/migration.sql delete mode 100644 prisma/migrations/20250309234300_news_articles/migration.sql delete mode 100644 prisma/migrations/20250309234801_make_tags_unique/migration.sql delete mode 100644 prisma/migrations/20250309234846_make_tokens_unique/migration.sql delete mode 100644 prisma/migrations/20250311073601_add_macos_as_a_platform/migration.sql delete mode 100644 prisma/migrations/20250312230736_add_metadata_providers_to_appconfig/migration.sql delete mode 100644 prisma/migrations/20250313042306_add_igdb_pcgamingwiki_metadata/migration.sql delete mode 100644 prisma/migrations/20250313053250_add_enable_fields_to_auth_and_users/migration.sql delete mode 100644 prisma/migrations/20250314153636_store_ca_and_session_in_db/migration.sql delete mode 100644 prisma/migrations/20250324014736_add_auth_mek_version/migration.sql delete mode 100644 prisma/migrations/20250401082200_add_save_slots/migration.sql delete mode 100644 prisma/migrations/20250401082605_add_save_slot_limits_to_application_settings/migration.sql delete mode 100644 prisma/migrations/20250401083942_rename_save_to_cloud_saves/migration.sql delete mode 100644 prisma/migrations/20250401084907_add_history_limit/migration.sql delete mode 100644 prisma/migrations/20250401085406_add_default_to_playtime/migration.sql delete mode 100644 prisma/migrations/20250401091937_add_history_and_hashes/migration.sql delete mode 100644 prisma/migrations/20250403233442_apply_store_changes/migration.sql delete mode 100644 prisma/migrations/20250405062945_make_last_accessed_optional_on_save_slots/migration.sql delete mode 100644 prisma/migrations/20250407090729_add_client_token_mode/migration.sql delete mode 100644 prisma/migrations/20250407091012_add_client_token_field_to_apitoken/migration.sql delete mode 100644 prisma/migrations/20250414002714_add_object_hash/migration.sql delete mode 100644 prisma/migrations/20250507120031_add_openid_authmek/migration.sql delete mode 100644 prisma/migrations/20250507223112_remove_authentication_option_from_applicationsettings/migration.sql delete mode 100644 prisma/migrations/20250508153613_add_screenshots/migration.sql delete mode 100644 prisma/migrations/20250508224553_cleanup_old_objects/migration.sql delete mode 100644 prisma/migrations/20250509003340_init_unified_company_metadata/migration.sql delete mode 100644 prisma/migrations/20250510013650_remove_devlopers_and_publishers/migration.sql delete mode 100644 prisma/migrations/20250511154134_add_tags_to_games/migration.sql delete mode 100644 prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql delete mode 100644 prisma/migrations/20250515021331_add_game_ratings/migration.sql delete mode 100644 prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql delete mode 100644 prisma/migrations/20250601022736_add_database_library/migration.sql delete mode 100644 prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql delete mode 100644 prisma/migrations/20250601032938_add_unique_constraint/migration.sql delete mode 100644 prisma/migrations/20250606013242_add_tasks_to_database/migration.sql delete mode 100644 prisma/migrations/20250606023802_add_name_to_task/migration.sql delete mode 100644 prisma/migrations/20250608010030_delete_user_cascade/migration.sql delete mode 100644 prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql delete mode 100644 prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql delete mode 100644 prisma/migrations/20250720070939_static_genres/migration.sql delete mode 100644 prisma/migrations/20250721053244_update_genre_names/migration.sql delete mode 100644 prisma/migrations/20250721053514_add_featured/migration.sql delete mode 100644 prisma/migrations/20250721061200_remove_genres/migration.sql delete mode 100644 prisma/migrations/20250721062509_add_pg_trgm/migration.sql delete mode 100644 prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql delete mode 100644 prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql delete mode 100644 prisma/migrations/20250801035031_add_delete_casacde/migration.sql delete mode 100644 prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql delete mode 100644 prisma/migrations/20250823005001_add_api_token_expiry/migration.sql create mode 100644 prisma/migrations/20250906060327_init/migration.sql create mode 100644 prisma/migrations/20250906060713_rename_to_hardware_platform/migration.sql create mode 100644 prisma/migrations/20250906062106_rename_redist_version_id/migration.sql create mode 100644 prisma/migrations/20250906063020_refine_platform_link/migration.sql create mode 100644 prisma/migrations/20250906070635_remove_hard_relation_for_user_platform/migration.sql create mode 100644 prisma/migrations/20250906081518_enforce_redists_as_only_source_of_user_platform_for_now/migration.sql create mode 100644 prisma/migrations/20250906091448_remove_platform/migration.sql create mode 100644 prisma/migrations/20250925223539_add_pre_and_post_install_for_redist_version/migration.sql create mode 100644 prisma/migrations/20250925225034_add_delta_versioning_to_redist/migration.sql create mode 100644 prisma/migrations/20251107223657_move_version_index/migration.sql create mode 100644 prisma/migrations/20251109232837_move_hidden_to_version/migration.sql create mode 100644 prisma/models/metadata.prisma create mode 100644 server/api/v1/admin/import/redist/index.get.ts create mode 100644 server/api/v1/admin/import/redist/index.post.ts create mode 100644 server/api/v1/admin/platforms.get.ts create mode 100644 server/api/v1/admin/redist/[id]/index.delete.ts create mode 100644 server/api/v1/admin/redist/[id]/index.get.ts create mode 100644 server/api/v1/admin/redist/[id]/index.patch.ts create mode 100644 server/api/v1/admin/redist/index.get.ts create mode 100644 server/api/v1/store/platforms.get.ts create mode 100644 server/internal/library/REDIST-README.md create mode 100644 server/internal/platform/link.ts create mode 100644 server/internal/tasks/utils.ts delete mode 100644 server/tsconfig.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8045e05..9eb848b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,8 +5,8 @@ on: release: types: [published] # This can be used to automatically publish nightlies at UTC nighttime - schedule: - - cron: "0 2 * * *" # run at 2 AM UTC + #schedule: + # - cron: "0 2 * * *" # run at 2 AM UTC jobs: web: diff --git a/app.vue b/app/app.vue similarity index 100% rename from app.vue rename to app/app.vue diff --git a/assets/core.scss b/app/assets/core.scss similarity index 100% rename from assets/core.scss rename to app/assets/core.scss diff --git a/assets/tailwindcss.css b/app/assets/tailwindcss.css similarity index 89% rename from assets/tailwindcss.css rename to app/assets/tailwindcss.css index 97cf5d4..2a87e79 100644 --- a/assets/tailwindcss.css +++ b/app/assets/tailwindcss.css @@ -1,7 +1,7 @@ @import "tailwindcss"; @plugin "@tailwindcss/typography"; @plugin "@tailwindcss/forms"; -@config "../tailwind.config.js"; +@config "../../tailwind.config.js"; @layer base { input[type="number"]::-webkit-outer-spin-button, diff --git a/components/AccountSidebar.vue b/app/components/AccountSidebar.vue similarity index 100% rename from components/AccountSidebar.vue rename to app/components/AccountSidebar.vue diff --git a/components/AddLibraryButton.vue b/app/components/AddLibraryButton.vue similarity index 100% rename from components/AddLibraryButton.vue rename to app/components/AddLibraryButton.vue diff --git a/components/Auth/OpenID.vue b/app/components/Auth/OpenID.vue similarity index 100% rename from components/Auth/OpenID.vue rename to app/components/Auth/OpenID.vue diff --git a/components/Auth/Simple.vue b/app/components/Auth/Simple.vue similarity index 96% rename from components/Auth/Simple.vue rename to app/components/Auth/Simple.vue index 7324467..16f21cb 100644 --- a/components/Auth/Simple.vue +++ b/app/components/Auth/Simple.vue @@ -86,7 +86,7 @@ diff --git a/components/GamePanel.vue b/app/components/GamePanel.vue similarity index 98% rename from components/GamePanel.vue rename to app/components/GamePanel.vue index 4217f58..b6a022e 100644 --- a/components/GamePanel.vue +++ b/app/components/GamePanel.vue @@ -77,7 +77,7 @@ const { }> | undefined | null; - href?: string; + href?: string | undefined; showTitleDescription?: boolean; animate?: boolean; defaultPlaceholder?: boolean; diff --git a/components/GameSearchResultWidget.vue b/app/components/GameSearchResultWidget.vue similarity index 90% rename from components/GameSearchResultWidget.vue rename to app/components/GameSearchResultWidget.vue index 46dfdff..4d7a253 100644 --- a/components/GameSearchResultWidget.vue +++ b/app/components/GameSearchResultWidget.vue @@ -16,7 +16,7 @@ diff --git a/components/Icons/SSOLogo.vue b/app/components/Icons/SSOLogo.vue similarity index 100% rename from components/Icons/SSOLogo.vue rename to app/components/Icons/SSOLogo.vue diff --git a/components/Icons/SimpleAuthenticationLogo.vue b/app/components/Icons/SimpleAuthenticationLogo.vue similarity index 100% rename from components/Icons/SimpleAuthenticationLogo.vue rename to app/components/Icons/SimpleAuthenticationLogo.vue diff --git a/components/Icons/WindowsLogo.vue b/app/components/Icons/WindowsLogo.vue similarity index 100% rename from components/Icons/WindowsLogo.vue rename to app/components/Icons/WindowsLogo.vue diff --git a/app/components/Import/Game.vue b/app/components/Import/Game.vue new file mode 100644 index 0000000..39e8f6e --- /dev/null +++ b/app/components/Import/Game.vue @@ -0,0 +1,238 @@ + + + diff --git a/app/components/Import/Redist.vue b/app/components/Import/Redist.vue new file mode 100644 index 0000000..542b23d --- /dev/null +++ b/app/components/Import/Redist.vue @@ -0,0 +1,336 @@ + + + + diff --git a/components/LanguageSelector.vue b/app/components/LanguageSelector.vue similarity index 100% rename from components/LanguageSelector.vue rename to app/components/LanguageSelector.vue diff --git a/components/LanguageSelectorListbox.vue b/app/components/LanguageSelectorListbox.vue similarity index 98% rename from components/LanguageSelectorListbox.vue rename to app/components/LanguageSelectorListbox.vue index b86bf82..ca63deb 100644 --- a/components/LanguageSelectorListbox.vue +++ b/app/components/LanguageSelectorListbox.vue @@ -92,7 +92,7 @@ import type { Locale } from "vue-i18n"; const { showText = true } = defineProps<{ showText?: boolean }>(); -const { locales, locale: currLocale, setLocale } = useI18n(); +const { locale: currLocale, setLocale, locales } = useI18n(); function changeLocale(locale: Locale) { setLocale(locale); diff --git a/components/LogLine.vue b/app/components/LogLine.vue similarity index 92% rename from components/LogLine.vue rename to app/components/LogLine.vue index 64fbf2f..cacafac 100644 --- a/components/LogLine.vue +++ b/app/components/LogLine.vue @@ -15,7 +15,7 @@ diff --git a/app/components/PreloadSelector.vue b/app/components/PreloadSelector.vue new file mode 100644 index 0000000..d38462f --- /dev/null +++ b/app/components/PreloadSelector.vue @@ -0,0 +1,120 @@ + + + diff --git a/components/ProgressBar.vue b/app/components/ProgressBar.vue similarity index 100% rename from components/ProgressBar.vue rename to app/components/ProgressBar.vue diff --git a/components/RankingList.vue b/app/components/RankingList.vue similarity index 100% rename from components/RankingList.vue rename to app/components/RankingList.vue diff --git a/app/components/RedistEditor/Metadata.vue b/app/components/RedistEditor/Metadata.vue new file mode 100644 index 0000000..3998f57 --- /dev/null +++ b/app/components/RedistEditor/Metadata.vue @@ -0,0 +1,14 @@ + + + diff --git a/components/RelativeTime.vue b/app/components/RelativeTime.vue similarity index 100% rename from components/RelativeTime.vue rename to app/components/RelativeTime.vue diff --git a/components/Setup/Account.vue b/app/components/Setup/Account.vue similarity index 100% rename from components/Setup/Account.vue rename to app/components/Setup/Account.vue diff --git a/components/Setup/Library.vue b/app/components/Setup/Library.vue similarity index 100% rename from components/Setup/Library.vue rename to app/components/Setup/Library.vue diff --git a/components/SkeletonCard.vue b/app/components/SkeletonCard.vue similarity index 100% rename from components/SkeletonCard.vue rename to app/components/SkeletonCard.vue diff --git a/components/SourceOptions/Filesystem.vue b/app/components/SourceOptions/Filesystem.vue similarity index 100% rename from components/SourceOptions/Filesystem.vue rename to app/components/SourceOptions/Filesystem.vue diff --git a/components/SourceOptions/FlatFilesystem.vue b/app/components/SourceOptions/FlatFilesystem.vue similarity index 100% rename from components/SourceOptions/FlatFilesystem.vue rename to app/components/SourceOptions/FlatFilesystem.vue diff --git a/components/SourceTable.vue b/app/components/SourceTable.vue similarity index 96% rename from components/SourceTable.vue rename to app/components/SourceTable.vue index e9491e5..4b76d22 100644 --- a/components/SourceTable.vue +++ b/app/components/SourceTable.vue @@ -146,11 +146,11 @@ diff --git a/components/TileWithLink.vue b/app/components/TileWithLink.vue similarity index 100% rename from components/TileWithLink.vue rename to app/components/TileWithLink.vue diff --git a/components/UserFooter.vue b/app/components/UserFooter.vue similarity index 100% rename from components/UserFooter.vue rename to app/components/UserFooter.vue diff --git a/components/UserHeader.vue b/app/components/UserHeader.vue similarity index 100% rename from components/UserHeader.vue rename to app/components/UserHeader.vue diff --git a/components/UserHeader/NotificationWidgetPanel.vue b/app/components/UserHeader/NotificationWidgetPanel.vue similarity index 95% rename from components/UserHeader/NotificationWidgetPanel.vue rename to app/components/UserHeader/NotificationWidgetPanel.vue index 867a60f..a8b9b38 100644 --- a/components/UserHeader/NotificationWidgetPanel.vue +++ b/app/components/UserHeader/NotificationWidgetPanel.vue @@ -46,7 +46,7 @@ diff --git a/components/UserHeader/UserWidget.vue b/app/components/UserHeader/UserWidget.vue similarity index 97% rename from components/UserHeader/UserWidget.vue rename to app/components/UserHeader/UserWidget.vue index cf75bba..d6a5bf7 100644 --- a/components/UserHeader/UserWidget.vue +++ b/app/components/UserHeader/UserWidget.vue @@ -81,8 +81,6 @@ diff --git a/pages/admin/library/[id]/index.vue b/app/pages/admin/library/g/[id]/index.vue similarity index 51% rename from pages/admin/library/[id]/index.vue rename to app/pages/admin/library/g/[id]/index.vue index 240d580..a07c5cf 100644 --- a/pages/admin/library/[id]/index.vue +++ b/app/pages/admin/library/g/[id]/index.vue @@ -7,66 +7,6 @@ >
- -
- - {{ - currentMode - }} - - - - - - - - -
  • - {{ value }} - - - -
  • -
    -
    -
    -
    -
    diff --git a/pages/admin/library/index.vue b/app/pages/admin/library/index.vue similarity index 69% rename from pages/admin/library/index.vue rename to app/pages/admin/library/index.vue index cae7817..18a6fbd 100644 --- a/pages/admin/library/index.vue +++ b/app/pages/admin/library/index.vue @@ -71,41 +71,59 @@ aria-hidden="true" />
    + +
    +
    + Game +
    + Redistributable +
    • -
      +
      +
      +

      - {{ game.mName }} + {{ entry.mName }}

      {{ $t("library.admin.shortDesc") }}
      - {{ game.mShortDescription }} + {{ entry.mShortDescription }}
      {{ $t("library.admin.metadataProvider") }} @@ -140,7 +158,7 @@
      -
      +
      + +
      +

      + {{ entry.mName }} + {{ entry.library.name }} +

      +
      +
      {{ $t("library.admin.shortDesc") }}
      +
      + {{ entry.mShortDescription }} +
      +
      +
      + + {{ entry.platform.platformName }} +
      +
      + + + + + + +
      +
      +
      +
      +
      @@ -180,7 +261,7 @@

      @@ -216,7 +297,7 @@
      @@ -236,14 +317,14 @@
    • {{ $t("common.noResults") }}

      0, ); -const libraryGames = ref< - Array< - LibraryStateGame & { - status: "online" | "offline"; - hasNotifications?: boolean; - notifications: { - noVersions?: boolean; - toImport?: boolean; - offline?: boolean; - }; - } - > ->( - libraryState.games.map((e) => { +// Potentially make a server-side transformation to make the client lighter +function clientSideTransformation( + values: Array, + expand: V, + type: K, +): Array< + T[V] & { + status: "online" | "offline"; + type: K; + hasNotifications?: boolean; + notifications: { + noVersions?: boolean; + toImport?: boolean; + offline?: boolean; + }; + urlPrefix: string, + } +> { + return values.map((e) => { if (e.status == "offline") { return { - ...e.game, + ...e[expand], + type: type, status: "offline" as const, hasNotifications: true, notifications: { offline: true, }, + urlPrefix: type[0], }; } @@ -340,21 +427,28 @@ const libraryGames = ref< const toImport = e.status.unimportedVersions.length > 0; return { - ...e.game, + ...e[expand], + type: type, notifications: { noVersions, toImport, }, hasNotifications: noVersions || toImport, status: "online" as const, + urlPrefix: type[0], }; - }), + }); +} + +const libraryGames = ref( + clientSideTransformation(libraryState.games, "value", "game"), +); +const libraryRedists = ref( + clientSideTransformation(libraryState.redists, "value", "redist"), ); -const filteredLibraryGames = computed(() => - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore excessively deep ts - libraryGames.value.filter((e) => { +const filteredLibrary = computed(() => + [...libraryGames.value, ...libraryRedists.value].filter((e) => { if (!searchQuery.value) return true; const searchQueryLower = searchQuery.value.toLowerCase(); if (e.mName.toLowerCase().includes(searchQueryLower)) return true; @@ -374,6 +468,16 @@ async function deleteGame(id: string) { toImport.value = true; } +async function deleteRedist(id: string) { + await $dropFetch(`/api/v1/admin/redist/${id}`, { + method: "DELETE", + failTitle: "Failed to delete game", + }); + const index = libraryRedists.value.findIndex((e) => e.id === id); + libraryRedists.value.splice(index, 1); + toImport.value = true; +} + const gameFeatureLoading = ref<{ [key: string]: boolean }>({}); async function featureGame(id: string) { const gameIndex = libraryGames.value.findIndex((e) => e.id === id); diff --git a/app/pages/admin/library/r/[id]/import.vue b/app/pages/admin/library/r/[id]/import.vue new file mode 100644 index 0000000..22b7d6b --- /dev/null +++ b/app/pages/admin/library/r/[id]/import.vue @@ -0,0 +1,478 @@ + + + diff --git a/app/pages/admin/library/r/[id]/index.vue b/app/pages/admin/library/r/[id]/index.vue new file mode 100644 index 0000000..9d3a87b --- /dev/null +++ b/app/pages/admin/library/r/[id]/index.vue @@ -0,0 +1,85 @@ + + + diff --git a/pages/admin/library/sources/index.vue b/app/pages/admin/library/sources/index.vue similarity index 94% rename from pages/admin/library/sources/index.vue rename to app/pages/admin/library/sources/index.vue index 6523158..34f2848 100644 --- a/pages/admin/library/sources/index.vue +++ b/app/pages/admin/library/sources/index.vue @@ -111,8 +111,8 @@ >{{ metadata.title }} {{ source - }} + }} + { - actionSourceOpen.value = false; - sourceConfig.value = {}; - sourceName.value = ""; - }) - .catch((e) => { - if (e instanceof FetchError) { - modalError.value = e.statusMessage ?? e.message; - } else { - modalError.value = e as string; - } - }) + .then( + () => { + actionSourceOpen.value = false; + sourceConfig.value = {}; + sourceName.value = ""; + }, + (e) => { + if (e instanceof FetchError) { + console.log(e.data.message); + modalError.value = e.message; + } else { + modalError.value = e as string; + } + }, + ) .finally(() => { modalLoading.value = false; }); @@ -362,8 +365,8 @@ async function deleteSource(index: number) { { title: t("errors.library.source.delete.title"), description: t("errors.library.source.delete.desc", [ - // @ts-expect-error attempt to display statusMessage on error - e?.statusMessage ?? t("errors.unknown"), + // @ts-expect-error attempt to display message on error + e?.message ?? t("errors.unknown"), ]), }, (_, c) => c(), diff --git a/pages/admin/metadata/companies/[id]/index.vue b/app/pages/admin/metadata/companies/[id]/index.vue similarity index 99% rename from pages/admin/metadata/companies/[id]/index.vue rename to app/pages/admin/metadata/companies/[id]/index.vue index db7e414..67580ba 100644 --- a/pages/admin/metadata/companies/[id]/index.vue +++ b/app/pages/admin/metadata/companies/[id]/index.vue @@ -238,7 +238,7 @@ import { MagnifyingGlassIcon } from "@heroicons/vue/24/outline"; import { ArrowUpTrayIcon, PencilIcon, PlusIcon } from "@heroicons/vue/24/solid"; import type { SerializeObject } from "nitropack"; -import type { GameModel } from "~/prisma/client/models"; +import type { GameModel } from "~~/prisma/client/models"; definePageMeta({ layout: "admin", diff --git a/pages/admin/metadata/companies/index.vue b/app/pages/admin/metadata/companies/index.vue similarity index 98% rename from pages/admin/metadata/companies/index.vue rename to app/pages/admin/metadata/companies/index.vue index 44ac5dd..2233c48 100644 --- a/pages/admin/metadata/companies/index.vue +++ b/app/pages/admin/metadata/companies/index.vue @@ -106,7 +106,7 @@ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a085607..6e87564 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - droplet: link:../../.local/share/pnpm/global/5/node_modules/@drop-oss/droplet - importers: .: @@ -19,40 +16,37 @@ importers: version: 3.2.0 '@headlessui/vue': specifier: ^1.7.23 - version: 1.7.23(vue@3.5.22(typescript@5.8.3)) + version: 1.7.23(vue@3.5.21(typescript@5.9.2)) '@heroicons/vue': specifier: ^2.1.5 - version: 2.2.0(vue@3.5.22(typescript@5.8.3)) - '@lobomfz/prismark': - specifier: 0.0.3 - version: 0.0.3 + version: 2.2.0(vue@3.5.21(typescript@5.9.2)) '@nuxt/fonts': specifier: ^0.11.0 - version: 0.11.4(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + version: 0.11.4(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) '@nuxt/image': specifier: ^1.10.0 - version: 1.10.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5) + version: 1.11.0(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5) '@nuxtjs/i18n': specifier: ^9.5.5 - version: 9.5.6(@vue/compiler-dom@3.5.22)(eslint@9.31.0(jiti@2.5.1))(magicast@0.3.5)(rollup@4.46.2)(vue@3.5.22(typescript@5.8.3)) + version: 9.5.6(@vue/compiler-dom@3.5.21)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)) '@prisma/client': specifier: ^6.11.1 - version: 6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3) + version: 6.16.2(prisma@6.16.2(magicast@0.3.5)(typescript@5.9.2))(typescript@5.9.2) '@tailwindcss/vite': specifier: ^4.0.6 - version: 4.1.11(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + version: 4.1.13(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) '@vueuse/nuxt': specifier: 13.6.0 - version: 13.6.0(magicast@0.3.5)(nuxt@3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.16.5)(@vue/compiler-sfc@3.5.22)(db0@0.3.2)(eslint@9.31.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3))(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)) + version: 13.6.0(magicast@0.3.5)(nuxt@4.1.2(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) argon2: specifier: ^0.43.0 version: 0.43.1 arktype: specifier: ^2.1.10 - version: 2.1.20 + version: 2.1.22 axios: specifier: ^1.12.0 - version: 1.12.0 + version: 1.12.2 bcryptjs: specifier: ^3.0.2 version: 3.0.2 @@ -71,30 +65,33 @@ importers: jdenticon: specifier: ^3.3.0 version: 3.3.0 + jsdom: + specifier: ^27.0.0 + version: 27.0.0(postcss@8.5.6) luxon: specifier: ^3.6.1 - version: 3.7.1 + version: 3.7.2 micromark: specifier: ^4.0.1 version: 4.0.2 normalize-url: specifier: ^8.0.2 - version: 8.0.2 + version: 8.1.0 nuxt: - specifier: ^3.17.4 - version: 3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.16.5)(@vue/compiler-sfc@3.5.22)(db0@0.3.2)(eslint@9.31.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3))(yaml@2.8.0) + specifier: ^4.1.2 + version: 4.1.2(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1) nuxt-security: specifier: 2.2.0 - version: 2.2.0(magicast@0.3.5)(rollup@4.46.2) + version: 2.2.0(magicast@0.3.5)(rollup@4.52.0) pino: specifier: ^9.7.0 - version: 9.7.0 + version: 9.10.0 pino-pretty: specifier: ^13.0.0 - version: 13.0.0 + version: 13.1.1 prisma: specifier: ^6.11.1 - version: 6.12.0(typescript@5.8.3) + version: 6.16.2(magicast@0.3.5)(typescript@5.9.2) sanitize-filename: specifier: ^1.6.3 version: 1.6.3 @@ -106,53 +103,53 @@ importers: version: 2.0.0 turndown: specifier: ^7.2.0 - version: 7.2.0 + version: 7.2.1 unstorage: specifier: ^1.15.0 - version: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) + version: 1.17.1(db0@0.3.2)(ioredis@5.7.0) vite-plugin-static-copy: specifier: ^3.1.2 - version: 3.1.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + version: 3.1.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) vue: specifier: latest - version: 3.5.22(typescript@5.8.3) + version: 3.5.21(typescript@5.9.2) vue-router: specifier: latest - version: 4.5.1(vue@3.5.22(typescript@5.8.3)) + version: 4.5.1(vue@3.5.21(typescript@5.9.2)) vue3-carousel: specifier: ^0.16.0 - version: 0.16.0(vue@3.5.22(typescript@5.8.3)) + version: 0.16.0(vue@3.5.21(typescript@5.9.2)) vue3-carousel-nuxt: specifier: ^1.1.5 - version: 1.1.6(magicast@0.3.5)(vue@3.5.22(typescript@5.8.3)) + version: 1.1.6(magicast@0.3.5)(vue@3.5.21(typescript@5.9.2)) vuedraggable: specifier: ^4.1.0 - version: 4.1.0(vue@3.5.22(typescript@5.8.3)) + version: 4.1.0(vue@3.5.21(typescript@5.9.2)) devDependencies: '@intlify/eslint-plugin-vue-i18n': specifier: ^4.0.1 - version: 4.0.1(eslint@9.31.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0)(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.5.1)))(yaml-eslint-parser@1.3.0) + version: 4.1.0(eslint@9.36.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0)(vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.5.1)))(yaml-eslint-parser@1.3.0) '@nuxt/eslint': specifier: ^1.3.0 - version: 1.7.1(@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.22)(eslint@9.31.0(jiti@2.5.1))(magicast@0.3.5)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + version: 1.9.0(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) '@tailwindcss/forms': specifier: ^0.5.9 - version: 0.5.10(tailwindcss@4.1.11) + version: 0.5.10(tailwindcss@4.1.13) '@tailwindcss/typography': specifier: ^0.5.15 - version: 0.5.16(tailwindcss@4.1.11) - '@types/bcryptjs': - specifier: ^3.0.0 - version: 3.0.0 + version: 0.5.18(tailwindcss@4.1.13) + '@types/jsdom': + specifier: ^21.1.7 + version: 21.1.7 '@types/luxon': specifier: ^3.6.2 - version: 3.6.2 + version: 3.7.1 '@types/node': specifier: ^22.13.16 - version: 22.16.5 + version: 22.18.6 '@types/semver': specifier: ^7.7.0 - version: 7.7.0 + version: 7.7.1 '@types/turndown': specifier: ^5.0.5 version: 5.0.5 @@ -161,16 +158,16 @@ importers: version: 10.4.21(postcss@8.5.6) eslint: specifier: ^9.24.0 - version: 9.31.0(jiti@2.5.1) + version: 9.36.0(jiti@2.5.1) eslint-config-prettier: specifier: ^10.1.1 - version: 10.1.8(eslint@9.31.0(jiti@2.5.1)) + version: 10.1.8(eslint@9.36.0(jiti@2.5.1)) h3: specifier: ^1.15.3 - version: 1.15.3 + version: 1.15.4 nitropack: specifier: ^2.11.12 - version: 2.12.4(@netlify/blobs@9.1.2) + version: 2.12.6 ofetch: specifier: ^1.4.1 version: 1.4.1 @@ -179,50 +176,57 @@ importers: version: 3.6.2 sass: specifier: ^1.79.4 - version: 1.89.2 + version: 1.93.0 tailwindcss: specifier: ^4.0.0 - version: 4.1.11 + version: 4.1.13 typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 vue-tsc: specifier: ^3.0.1 - version: 3.0.4(typescript@5.8.3) + version: 3.0.7(typescript@5.9.2) packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@apidevtools/json-schema-ref-parser@14.1.1': - resolution: {integrity: sha512-uGF1YGOzzD50L7HLNWclXmsEhQflw8/zZHIz0/AzkJrKL5r9PceUipZxR/cp/8veTk4TVfdDJLyIwXLjaP5ePg==} + '@apidevtools/json-schema-ref-parser@14.2.1': + resolution: {integrity: sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==} engines: {node: '>= 20'} + peerDependencies: + '@types/json-schema': ^7.0.15 - '@ark/schema@0.46.0': - resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} + '@ark/schema@0.49.0': + resolution: {integrity: sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw==} - '@ark/util@0.46.0': - resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} + '@ark/util@0.49.0': + resolution: {integrity: sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==} + + '@asamuzakjp/css-color@4.0.4': + resolution: {integrity: sha512-cKjSKvWGmAziQWbCouOsFwb14mp1betm8Y7Fn+yglDMUUu3r9DCbJ9iJbeFDenLMqFbIMC0pQP8K+B8LAxX3OQ==} + + '@asamuzakjp/dom-selector@6.5.5': + resolution: {integrity: sha512-kI2MX9pmImjxWT8nxDZY+MuN6r1jJGe7WxizEbsAEPB/zxfW5wYLIiPG1v3UKgEOOP8EsDkp0ZL99oRFAdPM8g==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -233,8 +237,8 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -251,8 +255,8 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -287,15 +291,10 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.2': - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.28.4': resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} @@ -319,24 +318,16 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.2': - resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.0': - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} '@babel/types@7.28.4': @@ -359,15 +350,38 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@dependents/detective-less@5.0.1': - resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.14': + resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} '@discordapp/twemoji@16.0.1': @@ -439,324 +453,183 @@ packages: '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} - '@es-joy/jsdoccomment@0.52.0': - resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@es-joy/jsdoccomment@0.56.0': + resolution: {integrity: sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==} engines: {node: '>=20.11.0'} - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -765,8 +638,8 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.3.1': - resolution: {integrity: sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==} + '@eslint/compat@1.3.2': + resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.40 || 9 @@ -778,47 +651,40 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-inspector@1.1.0': - resolution: {integrity: sha512-DQGzRGV6jKujyxxCPlhwwyzq3HTW/NbFX9A4npPjW0+0A3KemxYJWZdwqJn4rauPsRUpJ8yuh5uOyMCChrnFsg==} + '@eslint/config-inspector@1.3.0': + resolution: {integrity: sha512-t+5Pra/8VX9Ue8V2p6skCeEMw9vm6HjwNF/n7l5nx78f3lUqLjzSTdMisFeo9AeYOj1hwEBiFYYGZ/Xn88cmHw==} hasBin: true peerDependencies: eslint: ^8.50.0 || ^9.0.0 - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.32.0': - resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + '@eslint/js@9.36.0': + resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/accept-negotiator@1.1.0': resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} engines: {node: '>=14'} - '@fastify/busboy@3.1.1': - resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} - '@headlessui/vue@1.7.23': resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} engines: {node: '>=10'} @@ -834,18 +700,14 @@ packages: resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -866,16 +728,16 @@ packages: resolution: {integrity: sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ==} engines: {node: '>= 16'} - '@intlify/core-base@11.1.11': - resolution: {integrity: sha512-1Z0N8jTfkcD2Luq9HNZt+GmjpFe4/4PpZF3AOzoO1u5PTtSuXZcfhwBatywbfE2ieB/B5QHIoOFmCXY2jqVKEQ==} + '@intlify/core-base@11.1.12': + resolution: {integrity: sha512-whh0trqRsSqVLNEUCwU59pyJZYpU8AmSWl8M3Jz2Mv5ESPP6kFh4juas2NpZ1iCvy7GlNRffUD1xr84gceimjg==} engines: {node: '>= 16'} '@intlify/core@10.0.8': resolution: {integrity: sha512-2BbgN0aeuYHOHe7kVlTr2XxyrnLQZ/4/Y0Pw8luU67723+AqVYqxB7ZG1FzLCVNwAmzdVZMjKzFpgOzdUSdBfw==} engines: {node: '>= 16'} - '@intlify/eslint-plugin-vue-i18n@4.0.1': - resolution: {integrity: sha512-xZKG7EvMvvumK9sdpnt6Dxa/dxV6/05/hRXIgJc0XI4l0+QUnyfdz5qXEvDm21T+OQsFN0CK/C+p0Fpra2wscQ==} + '@intlify/eslint-plugin-vue-i18n@4.1.0': + resolution: {integrity: sha512-MPAr3LGTrkB5CZBHN5eUf4kASUEiSaDM371jADmxNbTL1Ew7IAyCIBGm3+/1sWcvsfVHe4wz8RFoo6FpeQZ4Nw==} engines: {node: '>=18.0.0'} peerDependencies: eslint: ^8.0.0 || ^9.0.0-0 @@ -891,16 +753,16 @@ packages: resolution: {integrity: sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg==} engines: {node: '>= 16'} - '@intlify/message-compiler@11.1.11': - resolution: {integrity: sha512-7PC6neomoc/z7a8JRjPBbu0T2TzR2MQuY5kn2e049MP7+o32Ve7O8husylkA7K9fQRe4iNXZWTPnDJ6vZdtS1Q==} + '@intlify/message-compiler@11.1.12': + resolution: {integrity: sha512-Fv9iQSJoJaXl4ZGkOCN1LDM3trzze0AS2zRz2EHLiwenwL6t0Ki9KySYlyr27yVOj5aVz0e55JePO+kELIvfdQ==} engines: {node: '>= 16'} '@intlify/shared@10.0.8': resolution: {integrity: sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==} engines: {node: '>= 16'} - '@intlify/shared@11.1.11': - resolution: {integrity: sha512-RIBFTIqxZSsxUqlcyoR7iiC632bq7kkOwYvZlvcVObHfrF4NhuKc4FKvu8iPCrEO+e3XsY7/UVpfgzg+M7ETzA==} + '@intlify/shared@11.1.12': + resolution: {integrity: sha512-Om86EjuQtA69hdNj3GQec9ZC0L0vPSAnXzB3gP/gyJ7+mA7t06d9aOAiqMZ+xEOsumGP4eEBlfl8zF2LOTzf2A==} engines: {node: '>= 16'} '@intlify/unplugin-vue-i18n@6.0.8': @@ -938,8 +800,8 @@ packages: vue-i18n: optional: true - '@ioredis/commands@1.3.0': - resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} + '@ioredis/commands@1.4.0': + resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} @@ -957,24 +819,24 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@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/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} - - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -982,10 +844,6 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@lobomfz/prismark@0.0.3': - resolution: {integrity: sha512-g2xfR/F+sRBRUhWYlpUkafqZjqsQBetjfzdWvQndRU4wdoavn3zblM3OQwb7vrsrKB6Wmbs+DtLGaD5XBQ2v8A==} - hasBin: true - '@mapbox/node-pre-gyp@2.0.0': resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} engines: {node: '>=18'} @@ -1002,41 +860,8 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@netlify/binary-info@1.0.0': - resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} - - '@netlify/blobs@9.1.2': - resolution: {integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/dev-utils@2.2.0': - resolution: {integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/functions@3.1.10': - resolution: {integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==} - engines: {node: '>=14.0.0'} - - '@netlify/open-api@2.37.0': - resolution: {integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==} - engines: {node: '>=14.8.0'} - - '@netlify/runtime-utils@1.3.1': - resolution: {integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==} - engines: {node: '>=16.0.0'} - - '@netlify/serverless-functions-api@1.41.2': - resolution: {integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==} - engines: {node: '>=18.0.0'} - - '@netlify/serverless-functions-api@2.1.3': - resolution: {integrity: sha512-bNlN/hpND8xFQzpjyKxm6vJayD+bPBlOvs4lWihE7WULrphuH1UuFsoVE5386bNNGH8Rs1IH01AFsl7ALQgOlQ==} - engines: {node: '>=18.0.0'} - - '@netlify/zip-it-and-ship-it@12.2.1': - resolution: {integrity: sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==} - engines: {node: '>=18.14.0'} - hasBin: true + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1062,31 +887,31 @@ packages: resolution: {integrity: sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw==} engines: {node: '>=18.18.0'} - '@nuxt/cli@3.27.0': - resolution: {integrity: sha512-lOdzEvEbGaV06ebKKYgpumLLzbOZMFQzZfT4ZE7foa8/8aXG+GR3g8w9RX2IUyomTdSfapa3UcHDC8srQKRIEw==} + '@nuxt/cli@3.28.0': + resolution: {integrity: sha512-WQ751WxWLBIeH3TDFt/LWQ2znyAKxpR5+gpv80oerwnVQs4GKajAfR6dIgExXZkjaPUHEFv2lVD9vM+frbprzw==} engines: {node: ^16.10.0 || >=18.0.0} hasBin: true '@nuxt/devalue@2.0.2': resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} - '@nuxt/devtools-kit@2.6.2': - resolution: {integrity: sha512-esErdMQ0u3wXXogKQ3IE2m0fxv52w6CzPsfsXF4o5ZVrUQrQaH58ygupDAQTYdlGTgtqmEA6KkHTGG5cM6yxeg==} + '@nuxt/devtools-kit@2.6.4': + resolution: {integrity: sha512-UWP4F4K9DA6vkv8DIClimgLrzKdpqQo0K7Gtj8bVSWBlrN+jk5jr//KYQ4NXhky/Y0C2nnYrW6DPGi4EXiFTTQ==} peerDependencies: vite: '>=6.0' - '@nuxt/devtools-wizard@2.6.2': - resolution: {integrity: sha512-s1eYYKi2eZu2ZUPQrf22C0SceWs5/C3c3uow/DVunD304Um/Tj062xM9E4p1B9L8yjaq8t0Gtyu/YvZdo/reyg==} + '@nuxt/devtools-wizard@2.6.4': + resolution: {integrity: sha512-BIBg4/FxrQtRRqSzDwakqNxSLC7e7bMSawE+X8Tq2sbz9vv+gA1aATdNcjF7g7BoZ8E/RreZB6Jy3pOxFPLEWA==} hasBin: true - '@nuxt/devtools@2.6.2': - resolution: {integrity: sha512-pqcSDPv1I+8fxa6FvhAxVrfcN/sXYLOBe9scTLbRQOVLTO0pHzryayho678qNKiwWGgj/rcjEDr6IZCgwqOCfA==} + '@nuxt/devtools@2.6.4': + resolution: {integrity: sha512-ymqRjlShXCfUfTc+fnADG7XOV13toMiPc5loi+6lYjCmu1+rOI8K3i8R/8DWgGxr8MK7d5L4szl1xZlMQ4WzlA==} hasBin: true peerDependencies: vite: '>=6.0' - '@nuxt/eslint-config@1.7.1': - resolution: {integrity: sha512-xY9CNA24LGiauNw2h1L76iw/SFChEIojqQQM5UgGU+nfRfAZaitfumsmqhMXa6tTdnbF+uf6EpumaMdk3LNRpg==} + '@nuxt/eslint-config@1.9.0': + resolution: {integrity: sha512-KLiYlX/MmWR9dhC0u7GSZQl6wyVLGAHme5aAL5fAUT1PLYgcFiJIUg1Z+b296LmwHGTa+oGPRBIk3yoDmX9/9Q==} peerDependencies: eslint: ^9.0.0 eslint-plugin-format: '*' @@ -1094,13 +919,13 @@ packages: eslint-plugin-format: optional: true - '@nuxt/eslint-plugin@1.7.1': - resolution: {integrity: sha512-az7qM8g95JPI8SO4c7lcbab3DVQPsNxCVik+b4XwtpEhxtkW0BEq3VFCmM5aZbFhmV4qE5TOCl7LA4Saq4lhGQ==} + '@nuxt/eslint-plugin@1.9.0': + resolution: {integrity: sha512-DY4ZSavgFyKQxI/NCOpSCUHg3dpS2O4lAdic5UmvP2NWj1xwtvmA9UwEZQ2nW2/f/Km6N+Q53UsgFSIBjz8jDQ==} peerDependencies: eslint: ^9.0.0 - '@nuxt/eslint@1.7.1': - resolution: {integrity: sha512-/kbtRE6+kSDR+WxR/aL64E7ov58VUSsbwwOdS55R7f8ZjIReF+hfVBGA8CxXHo0LgIGTmoQbz7km4Nx+sGhxQw==} + '@nuxt/eslint@1.9.0': + resolution: {integrity: sha512-8Wm2fDD9za+vJOOhRS2jj+MzyjCNvDhS+04Y55q9W1Ai5hFjTZ1a94jlgSwaqI1B3Zt7y5fqFoEb4wKpZ3ycWg==} peerDependencies: eslint: ^9.0.0 eslint-webpack-plugin: ^4.1.0 @@ -1114,24 +939,20 @@ packages: '@nuxt/fonts@0.11.4': resolution: {integrity: sha512-GbLavsC+9FejVwY+KU4/wonJsKhcwOZx/eo4EuV57C4osnF/AtEmev8xqI0DNlebMEhEGZbu1MGwDDDYbeR7Bw==} - '@nuxt/image@1.10.0': - resolution: {integrity: sha512-/B58GeEmme7bkmQUrXzEw8P9sJb9BkMaYZqLDtq8ZdDLEddE3P4nVya8RQPB+p4b7EdqWajpPqdy1A2ZPLev/A==} + '@nuxt/image@1.11.0': + resolution: {integrity: sha512-4kzhvb2tJfxMsa/JZeYn1sMiGbx2J/S6BQrQSdXNsHgSvywGVkFhTiQGjoP6O49EsXyAouJrer47hMeBcTcfXQ==} engines: {node: '>=18.20.6'} - '@nuxt/kit@3.17.7': - resolution: {integrity: sha512-JLno3ur7Pix2o/StxIMlEHRkMawA6h7uzjZBDgxdeKXRWTYY8ID9YekSkN4PBlEFGXBfCBOcPd5+YqcyBUAMkw==} + '@nuxt/kit@3.19.2': + resolution: {integrity: sha512-+QiqO0WcIxsKLUqXdVn3m4rzTRm2fO9MZgd330utCAaagGmHsgiMJp67kE14boJEPutnikfz3qOmrzBnDIHUUg==} engines: {node: '>=18.12.0'} - '@nuxt/kit@3.18.0': - resolution: {integrity: sha512-svS1CBEx7gMgEIaNYrQt26J/t5bDSUdIf7GQWr5M6yszOzLw+IVzyfH7TBmuxZEbjovhLaJEG379mgKp82H/lA==} + '@nuxt/kit@4.1.2': + resolution: {integrity: sha512-P5q41xeEOa6ZQC0PvIP7TSBmOAMxXK4qihDcCbYIJq8RcVsEPbGZVlidmxE6EOw1ucSyodq9nbV31FAKwoL4NQ==} engines: {node: '>=18.12.0'} - '@nuxt/kit@4.0.2': - resolution: {integrity: sha512-OtLkVYHpfrm1FzGSGxl0H3QXLgO41yxOgni5S6zzLG4gblG71Fy82B2QTdqJLzTLKWObiILKDhrysBtmDkp3LA==} - engines: {node: '>=18.12.0'} - - '@nuxt/schema@3.17.7': - resolution: {integrity: sha512-c22IE/ECvjUScFyOJH/0VnSf5izDLmwkrCRlZKNhHzcNZUBFe5mCE5BM28QSVRSLGcC/mqg5POyNjf2tRwf+/w==} + '@nuxt/schema@4.1.2': + resolution: {integrity: sha512-uFr13C6c52OFbF3hZVIV65KvhQRyrwp1GlAm7EVNGjebY8279QEel57T4R9UA1dn2Et6CBynBFhWoFwwo97Pig==} engines: {node: ^14.18.0 || >=16.10.0} '@nuxt/telemetry@2.6.6': @@ -1139,9 +960,9 @@ packages: engines: {node: '>=18.12.0'} hasBin: true - '@nuxt/vite-builder@3.17.7': - resolution: {integrity: sha512-XZEte9SMgONWsChKXOrK9/X8TqcSToXy6S9GzxJF199QKUpfsOJy+gZrjOWHS+WrIWdkBmiKBl11kvh8lCIpzA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0} + '@nuxt/vite-builder@4.1.2': + resolution: {integrity: sha512-to9NKVtzMBtyuhIIVgwo/ph5UCONcxkVsoAjm8HnSkDi0o9nDPhHOAg1AUMlvPnHpdXOzwnSrXo/t8E7W+UZ/A==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vue: ^3.3.4 @@ -1149,8 +970,97 @@ packages: resolution: {integrity: sha512-PhrQtJT6Di9uoslL5BTrBFqntFlfCaUKlO3T9ORJwmWFdowPqQeFjQ9OjVbKA6TNWr3kQhDqLbIcGlhbuG1USQ==} engines: {node: '>=18.12.0'} - '@oxc-parser/binding-android-arm64@0.76.0': - resolution: {integrity: sha512-1XJW/16CDmF5bHE7LAyPPmEEVnxSadDgdJz+xiLqBrmC4lfAeuAfRw3HlOygcPGr+AJsbD4Z5sFJMkwjbSZlQg==} + '@oxc-minify/binding-android-arm64@0.87.0': + resolution: {integrity: sha512-ZbJmAfXvNAamOSnXId3BiM3DiuzlD1isqKjtmRFb/hpvChHHA23FSPrFcO16w+ugZKg33sZ93FinFkKtlC4hww==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-minify/binding-darwin-arm64@0.87.0': + resolution: {integrity: sha512-ewmNsTY8YbjWOI8+EOWKTVATOYvG4Qq4zQHH5VFBeqhQPVusY1ORD6Ei+BijVKrnlbpjibLlkTl8IWqXCGK89A==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-minify/binding-darwin-x64@0.87.0': + resolution: {integrity: sha512-qDH4w4EYttSC3Cs2VCh+CiMYKrcL2SNmnguBZXoUXe/RNk3csM+RhgcwdpX687xGvOhTFhH5PCIA84qh3ZpIbQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-minify/binding-freebsd-x64@0.87.0': + resolution: {integrity: sha512-5kxjHlSev2A09rDeITk+LMHxSrU3Iu8pUb0Zp4m+ul8FKlB9FrvFkAYwbctin6g47O98s3Win7Ewhy0w8JaiUA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-minify/binding-linux-arm-gnueabihf@0.87.0': + resolution: {integrity: sha512-NjbGXnNaAl5EgyonaDg2cPyH2pTf5a/+AP/5SRCJ0KetpXV22ZSUCvcy04Yt4QqjMcDs+WnJaGVxwx15Ofr6Gw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm-musleabihf@0.87.0': + resolution: {integrity: sha512-llAjfCA0iV2LMMl+LTR3JhqAc2iQmj+DTKd0VWOrbNOuNczeE9D5kJFkqYplD73LrkuqxrX9oDeUjjeLdVBPXw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm64-gnu@0.87.0': + resolution: {integrity: sha512-tf2Shom09AaSmu7U1hYYcEFF/cd+20HtmQ8eyGsRkqD5bqUj6lDu8TNSU9FWZ9tcZ83NzyFMwXZWHyeeIIbpxw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-minify/binding-linux-arm64-musl@0.87.0': + resolution: {integrity: sha512-pgWeYfSprtpnJVea9Q5eI6Eo80lDGlMw2JdcSMXmShtBjEhBl6bvDNHlV+6kNfh7iT65y/uC6FR8utFrRghu8A==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-minify/binding-linux-riscv64-gnu@0.87.0': + resolution: {integrity: sha512-O1QPczlT+lqNZVeKOdFxxL+s1RIlnixaJYFLrcqDcRyn82MGKLz7sAenBTFRQoIfLnSxtMGL6dqHOefYkQx7Cg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-minify/binding-linux-s390x-gnu@0.87.0': + resolution: {integrity: sha512-tcwt3ZUWOKfNLXN2edxFVHMlIuPvbuyMaKmRopgljSCfFcNHWhfTNlxlvmECRNhuQ91EcGwte6F1dwoeMCNd7A==} + engines: {node: '>=14.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-minify/binding-linux-x64-gnu@0.87.0': + resolution: {integrity: sha512-Xf4AXF14KXUzSnfgTcFLFSM0TykJhFw14+xwNvlAb6WdqXAKlMrz9joIAezc8dkW1NNscCVTsqBUPJ4RhvCM1Q==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-minify/binding-linux-x64-musl@0.87.0': + resolution: {integrity: sha512-LIqvpx9UihEW4n9QbEljDnfUdAWqhr6dRqmzSFwVAeLZRUECluLCDdsdwemrC/aZkvnisA4w0LFcFr3HmeTLJg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-minify/binding-wasm32-wasi@0.87.0': + resolution: {integrity: sha512-h0xluvc+YryfH5G5dndjGHuA/D4Kp85EkPMxqoOjNudOKDCtdobEaC9horhCqnOOQ0lgn+PGFl3w8u4ToOuRrA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-minify/binding-win32-arm64-msvc@0.87.0': + resolution: {integrity: sha512-fgxSx+TUc7e2rNtRAMnhHrjqh1e8p/JKmWxRZXtkILveMr/TOHGiDis7U3JJbwycmTZ+HSsJ/PNFQl+tKzmDxw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-minify/binding-win32-x64-msvc@0.87.0': + resolution: {integrity: sha512-K6TTrlitEJgD0FGIW2r0t3CIJNqBkzHT97h49gZLS24ey2UG1zKt27iSHkpXMJYDiG97ZD2yv3pSph1ctMlFXw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-parser/binding-android-arm64@0.87.0': + resolution: {integrity: sha512-3APxTyYaAjpW5zifjzfsPgoIa4YHwA5GBjtgLRQpGVXCykXBIEbUTokoAs411ZuOwS3sdTVXBTGAdziXRd8rUg==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [android] @@ -1161,8 +1071,8 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-arm64@0.76.0': - resolution: {integrity: sha512-yoQwSom8xsB+JdGsPUU0xxmxLKiF2kdlrK7I56WtGKZilixuBf/TmOwNYJYLRWkBoW5l2/pDZOhBm2luwmLiLw==} + '@oxc-parser/binding-darwin-arm64@0.87.0': + resolution: {integrity: sha512-99e8E76M+k3Gtwvs5EU3VTs2hQkJmvnrl/eu7HkBUc9jLFHA4nVjYSgukMuqahWe270udUYEPRfcWKmoE1Nukg==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [darwin] @@ -1173,8 +1083,8 @@ packages: cpu: [x64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.76.0': - resolution: {integrity: sha512-uRIopPLvr3pf2Xj7f5LKyCuqzIU6zOS+zEIR8UDYhcgJyZHnvBkfrYnfcztyIcrGdQehrFUi3uplmI09E7RdiQ==} + '@oxc-parser/binding-darwin-x64@0.87.0': + resolution: {integrity: sha512-2rRo6Dz560/4ot5Q0KPUTEunEObkP8mDC9mMiH0RJk1FiOb9c+xpPbkYoUHNKuVMm8uIoiBCxIAbPtBhs9QaXQ==} engines: {node: '>=20.0.0'} cpu: [x64] os: [darwin] @@ -1185,8 +1095,8 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-parser/binding-freebsd-x64@0.76.0': - resolution: {integrity: sha512-a0EOFvnOd2FqmDSvH6uWLROSlU6KV/JDKbsYDA/zRLyKcG6HCsmFnPsp8iV7/xr9WMbNgyJi6R5IMpePQlUq7Q==} + '@oxc-parser/binding-freebsd-x64@0.87.0': + resolution: {integrity: sha512-uR+WZAvWkFQPVoeqXgQFr7iy+3hEI295qTbQ4ujmklgM5eTX3YgMFoIV00Stloxfd1irSDDSaK7ySnnzF6mRJg==} engines: {node: '>=20.0.0'} cpu: [x64] os: [freebsd] @@ -1197,8 +1107,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-gnueabihf@0.76.0': - resolution: {integrity: sha512-ikRYDHL3fOdZwfJKmcdqjlLgkeNZ3Ez0qM8wAev5zlHZ+lY/Ig7qG5SCqPlvuTu+nNQ6zrFFaKvvt69EBKXU/g==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.87.0': + resolution: {integrity: sha512-Emm1NpVGKbwzQOIZJI8ZuZu0z8FAd5xscqdS6qpDFpDdEMxk6ab7o3nM8V09RhNCORAzeUlk4TBHQ2Crzjd50A==} engines: {node: '>=20.0.0'} cpu: [arm] os: [linux] @@ -1209,8 +1119,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.76.0': - resolution: {integrity: sha512-dtRv5J5MRCLR7x39K8ufIIW4svIc7gYFUaI0YFXmmeOBhK/K2t/CkguPnDroKtsmXIPHDRtmJ1JJYzNcgJl6Wg==} + '@oxc-parser/binding-linux-arm-musleabihf@0.87.0': + resolution: {integrity: sha512-1PPCxRZSJXzQaqc8y+wH7EqPgSfQ/JU3pK6WTN/1SUe/8paNVSKKqk175a8BbRVxGUtPnwEG89pi+xfPTSE7GA==} engines: {node: '>=20.0.0'} cpu: [arm] os: [linux] @@ -1221,8 +1131,8 @@ packages: cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.76.0': - resolution: {integrity: sha512-IE4iiiggFH2snagQxHrY5bv6dDpRMMat+vdlMN/ibonA65eOmRLp8VLTXnDiNrcla/itJ1L9qGABHNKU+SnE8g==} + '@oxc-parser/binding-linux-arm64-gnu@0.87.0': + resolution: {integrity: sha512-fcnnsfcyLamJOMVKq+BQ8dasb8gRnZtNpCUfZhaEFAdXQ7J2RmZreFzlygcn80iti0V7c5LejcjHbF4IdK3GAw==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] @@ -1233,8 +1143,8 @@ packages: cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-musl@0.76.0': - resolution: {integrity: sha512-wi9zQPMDHrBuRuT7Iurfidc9qlZh7cKa5vfYzOWNBCaqJdgxmNOFzvYen02wVUxSWGKhpiPHxrPX0jdRyJ8Npg==} + '@oxc-parser/binding-linux-arm64-musl@0.87.0': + resolution: {integrity: sha512-tBPkSPgRSSbmrje8CUovISi/Hj/tWjZJ3n/qnrjx2B+u86hWtwLsngtPDQa5d4seSyDaHSx6tNEUcH7+g5Ee0Q==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] @@ -1245,8 +1155,8 @@ packages: cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-riscv64-gnu@0.76.0': - resolution: {integrity: sha512-0tqqu1pqPee2lLGY8vtYlX1L415fFn89e0a3yp4q5N9f03j1rRs0R31qesTm3bt/UK8HYjECZ+56FCVPs2MEMQ==} + '@oxc-parser/binding-linux-riscv64-gnu@0.87.0': + resolution: {integrity: sha512-z4UKGM4wv2wEAQAlx2pBq6+pDJw5J/5oDEXqW6yBSLbWLjLDo4oagmRSE3+giOWteUa+0FVJ+ypq4iYxBkYSWg==} engines: {node: '>=20.0.0'} cpu: [riscv64] os: [linux] @@ -1257,8 +1167,8 @@ packages: cpu: [s390x] os: [linux] - '@oxc-parser/binding-linux-s390x-gnu@0.76.0': - resolution: {integrity: sha512-y36Hh1a5TA+oIGtlc8lT7N9vdHXBlhBetQJW0p457KbiVQ7jF7AZkaPWhESkjHWAsTVKD2OjCa9ZqfaqhSI0FQ==} + '@oxc-parser/binding-linux-s390x-gnu@0.87.0': + resolution: {integrity: sha512-6W1ENe/nZtr2TBnrEzmdGEraEAdZOiH3YoUNNeQWuqwLkmpoHTJJdclieToPe/l2IKJ4WL3FsSLSGHE8yt/OEg==} engines: {node: '>=20.0.0'} cpu: [s390x] os: [linux] @@ -1269,8 +1179,8 @@ packages: cpu: [x64] os: [linux] - '@oxc-parser/binding-linux-x64-gnu@0.76.0': - resolution: {integrity: sha512-7/acaG9htovp3gp/J0kHgbItQTuHctl+rbqPPqZ9DRBYTz8iV8kv3QN8t8Or8i/hOmOjfZp9McDoSU1duoR4/A==} + '@oxc-parser/binding-linux-x64-gnu@0.87.0': + resolution: {integrity: sha512-s3kB/Ii3X3IOZ27Iu7wx2zYkIcDO22Emu32SNC6kkUSy09dPBc1yaW14TnAkPMe/rvtuzR512JPWj3iGpl+Dng==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] @@ -1281,8 +1191,8 @@ packages: cpu: [x64] os: [linux] - '@oxc-parser/binding-linux-x64-musl@0.76.0': - resolution: {integrity: sha512-AxFt0reY6Q2rfudABmMTFGR8tFFr58NlH2rRBQgcj+F+iEwgJ+jMwAPhXd2y1I2zaI8GspuahedUYQinqxWqjA==} + '@oxc-parser/binding-linux-x64-musl@0.87.0': + resolution: {integrity: sha512-3+M9hfrZSDi4+Uy4Ll3rtOuVG3IHDQlj027jgtmAAHJK1eqp4CQfC7rrwE+LFUqUwX+KD2GwlxR+eHyyEf5Gbg==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] @@ -1292,8 +1202,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-parser/binding-wasm32-wasi@0.76.0': - resolution: {integrity: sha512-wHdkHdhf6AWBoO8vs5cpoR6zEFY1rB+fXWtq6j/xb9j/lu1evlujRVMkh8IM/M/pOUIrNkna3nzST/mRImiveQ==} + '@oxc-parser/binding-wasm32-wasi@0.87.0': + resolution: {integrity: sha512-2jgeEeOa4GbQQg2Et/gFTgs5wKS/+CxIg+CN2mMOJ4EqbmvUVeGiumO01oFOWTYnJy1oONwIocBzrnMuvOcItA==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -1303,8 +1213,8 @@ packages: cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-arm64-msvc@0.76.0': - resolution: {integrity: sha512-G7ZlEWcb2hNwCK3qalzqJoyB6HaTigQ/GEa7CU8sAJ/WwMdG/NnPqiC9IqpEAEy1ARSo4XMALfKbKNuqbSs5mg==} + '@oxc-parser/binding-win32-arm64-msvc@0.87.0': + resolution: {integrity: sha512-KZp9poaBaVvuFM0TrsHCDOjPQK5eMDXblz21boMhKHGW5/bOlkMlg3CYn5j0f67FkK68NSdNKREMxmibBeXllQ==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [win32] @@ -1315,8 +1225,8 @@ packages: cpu: [x64] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.76.0': - resolution: {integrity: sha512-0jLzzmnu8/mqNhKBnNS2lFUbPEzRdj5ReiZwHGHpjma0+ullmmwP2AqSEqx3ssHDK9CpcEMdKOK2LsbCfhHKIA==} + '@oxc-parser/binding-win32-x64-msvc@0.87.0': + resolution: {integrity: sha512-86uisngtp/8XdcerIKxMyJTqgDSTJatkfpylpUH0d96W8Bb9E+bVvM2fIIhLWB0Eb03PeY2BdIT7DNIln9TnHg==} engines: {node: '>=20.0.0'} cpu: [x64] os: [win32] @@ -1331,8 +1241,97 @@ packages: '@oxc-project/types@0.70.0': resolution: {integrity: sha512-ngyLUpUjO3dpqygSRQDx7nMx8+BmXbWOU4oIwTJFV2MVIDG7knIZwgdwXlQWLg3C3oxg1lS7ppMtPKqKFb7wzw==} - '@oxc-project/types@0.76.0': - resolution: {integrity: sha512-CH3THIrSViKal8yV/Wh3FK0pFhp40nzW1MUDCik9fNuid2D/7JJXKJnfFOAvMxInGXDlvmgT6ACAzrl47TqzkQ==} + '@oxc-project/types@0.87.0': + resolution: {integrity: sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g==} + + '@oxc-transform/binding-android-arm64@0.87.0': + resolution: {integrity: sha512-B7W6J8T9cS054LUGLfYkYz8bz5+t+4yPftZ67Bn6MJ03okMLnbbEfm1bID1tqcP5tJwMurTILVy/dQfDYDcMgQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-transform/binding-darwin-arm64@0.87.0': + resolution: {integrity: sha512-HImW3xOPx7FHKqfC5WfE82onhRfnWQUiB7R+JgYrk+7NR404h3zANSPzu3V/W9lbDxlmHTcqoD2LKbNC5j0TQA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-transform/binding-darwin-x64@0.87.0': + resolution: {integrity: sha512-MDbgugi6mvuPTfS78E2jyozm7493Kuqmpc5r406CsUdEsXlnsF+xvmKlrW9ZIkisO74dD+HWouSiDtNyPQHjlw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-transform/binding-freebsd-x64@0.87.0': + resolution: {integrity: sha512-N0M5D/4haJw7BMn2WZ3CWz0WkdLyoK1+3KxOyCv2CPedMCxx6eQay2AtJxSzj9tjVU1+ukbSb2fDO24JIJGsVA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-transform/binding-linux-arm-gnueabihf@0.87.0': + resolution: {integrity: sha512-PubObCNOUOzm1S+P0yn7S+/6xRLbSPMqhgrb73L3p+J1Z20fv/FYVg0kFd36Yho24TSC/byOkebEZWAtxCasWw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm-musleabihf@0.87.0': + resolution: {integrity: sha512-Nk2d/FS7sMCmCl99vHojzigakjDPamkjOXs2i+H71o/NqytS0pk3M+tXat8M3IGpeLJIEszA5Mv+dcq731nlYA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.87.0': + resolution: {integrity: sha512-BxFkIcso2V1+FCDoU+KctxvJzSQVSnEZ5EEQ8O3Up9EoFVQRnZ8ktXvqYj2Oqvc4IYPskLPsKUgc9gdK8wGhUg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-arm64-musl@0.87.0': + resolution: {integrity: sha512-MZ1/TNaebhXK73j1UDfwyBFnAy0tT3n6otOkhlt1vlJwqboUS/D7E/XrCZmAuHIfVPxAXRPovkl7kfxLB43SKw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-gnu@0.87.0': + resolution: {integrity: sha512-JCWE6n4Hicu0FVbvmLdH/dS8V6JykOUsbrbDYm6JwFlHr4eFTTlS2B+mh5KPOxcdeOlv/D/XRnvMJ6WGYs25EA==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-s390x-gnu@0.87.0': + resolution: {integrity: sha512-n2NTgM+3PqFagJV9UXRDNOmYesF+TO9SF9FeHqwVmW893ayef9KK+vfWAAhvOYHXYaKWT5XoHd87ODD7nruyhw==} + engines: {node: '>=14.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-transform/binding-linux-x64-gnu@0.87.0': + resolution: {integrity: sha512-ZOKW3wx0bW2O7jGdOzr8DyLZqX2C36sXvJdsHj3IueZZ//d/NjLZqEiUKz+q0JlERHtCVKShQ5PLaCx7NpuqNg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-linux-x64-musl@0.87.0': + resolution: {integrity: sha512-eIspx/JqkVMPK1CAYEOo2J8o49s4ZTf+32MSMUknIN2ZS1fvRmWS0D/xFFaLP/9UGhdrXRIPbn/iSYEA8JnV/g==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-wasm32-wasi@0.87.0': + resolution: {integrity: sha512-4uRjJQnt/+kmJUIC6Iwzn+MqqZhLP1zInPtDwgL37KI4VuUewUQWoL+sggMssMEgm7ZJwOPoZ6piuSWwMgOqgQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.87.0': + resolution: {integrity: sha512-l/qSi4/N5W1yXKU9+1gWGo0tBoRpp4zvHYrpsbq3zbefPL4VYdA0gKF7O10/ZQVkYylzxiVh2zpYO34/FbZdIg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.87.0': + resolution: {integrity: sha512-jG/MhMjfSdyj5KyhnwNWr4mnAlAsz+gNUYpjQ+UXWsfsoB3f8HqbsTkG02RBtNa/IuVQYvYYVf1eIimNN3gBEQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -1446,8 +1445,8 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} - '@prisma/client@6.12.0': - resolution: {integrity: sha512-wn98bJ3Cj6edlF4jjpgXwbnQIo/fQLqqQHPk2POrZPxTlhY3+n90SSIF3LMRVa8VzRFC/Gec3YKJRxRu+AIGVA==} + '@prisma/client@6.16.2': + resolution: {integrity: sha512-E00PxBcalMfYO/TWnXobBVUai6eW/g5OsifWQsQDzJYm7yaY+IRLo7ZLsaefi0QkTpxfuhFcQ/w180i6kX3iJw==} engines: {node: '>=18.18'} peerDependencies: prisma: '*' @@ -1458,39 +1457,30 @@ packages: typescript: optional: true - '@prisma/config@6.12.0': - resolution: {integrity: sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg==} + '@prisma/config@6.16.2': + resolution: {integrity: sha512-mKXSUrcqXj0LXWPmJsK2s3p9PN+aoAbyMx7m5E1v1FufofR1ZpPoIArjjzOIm+bJRLLvYftoNYLx1tbHgF9/yg==} - '@prisma/debug@6.12.0': - resolution: {integrity: sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ==} + '@prisma/debug@6.16.2': + resolution: {integrity: sha512-bo4/gA/HVV6u8YK2uY6glhNsJ7r+k/i5iQ9ny/3q5bt9ijCj7WMPUwfTKPvtEgLP+/r26Z686ly11hhcLiQ8zA==} - '@prisma/debug@6.13.0': - resolution: {integrity: sha512-um+9pfKJW0ihmM83id9FXGi5qEbVJ0Vxi1Gm0xpYsjwUBnw6s2LdPBbrsG9QXRX46K4CLWCTNvskXBup4i9hlw==} + '@prisma/engines-version@6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43': + resolution: {integrity: sha512-ThvlDaKIVrnrv97ujNFDYiQbeMQpLa0O86HFA2mNoip4mtFqM7U5GSz2ie1i2xByZtvPztJlNRgPsXGeM/kqAA==} - '@prisma/dmmf@6.13.0': - resolution: {integrity: sha512-69qWP2ddIpI2L3VyQkwGjhtyj1CNXUJ0qZPLa1VmZ27h20rUXBPflLAel9EtOyct/GSTjSq8qjBbhW5ohrfbSw==} + '@prisma/engines@6.16.2': + resolution: {integrity: sha512-7yf3AjfPUgsg/l7JSu1iEhsmZZ/YE00yURPjTikqm2z4btM0bCl2coFtTGfeSOWbQMmq45Jab+53yGUIAT1sjA==} - '@prisma/engines-version@6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc': - resolution: {integrity: sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ==} + '@prisma/fetch-engine@6.16.2': + resolution: {integrity: sha512-wPnZ8DMRqpgzye758ZvfAMiNJRuYpz+rhgEBZi60ZqDIgOU2694oJxiuu3GKFeYeR/hXxso4/2oBC243t/whxQ==} - '@prisma/engines@6.12.0': - resolution: {integrity: sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA==} - - '@prisma/fetch-engine@6.12.0': - resolution: {integrity: sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag==} - - '@prisma/generator-helper@6.13.0': - resolution: {integrity: sha512-6v5k9sGMhRDAnWxVfIo7QlewgVyOhr2NykyNh/PaH55g0LDswiTSYDfPPKyCPLxjDG0eA7FFX+gDyf94QkLT1A==} - - '@prisma/generator@6.13.0': - resolution: {integrity: sha512-vlV1qiEEb1w7D1J0h5/rz3ppgM/BRcJP5xz2QqHBlbjcAWzJjHkHsxeuC/OmkO4uHZXe9T2dGtf/nTw29UsBzA==} - - '@prisma/get-platform@6.12.0': - resolution: {integrity: sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA==} + '@prisma/get-platform@6.16.2': + resolution: {integrity: sha512-U/P36Uke5wS7r1+omtAgJpEB94tlT4SdlgaeTc6HVTTT93pXj7zZ+B/cZnmnvjcNPfWddgoDx8RLjmQwqGDYyA==} '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + '@rolldown/pluginutils@1.0.0-beta.38': + resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -1563,8 +1553,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1572,108 +1562,118 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.46.2': - resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + '@rollup/rollup-android-arm-eabi@4.52.0': + resolution: {integrity: sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.46.2': - resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + '@rollup/rollup-android-arm64@4.52.0': + resolution: {integrity: sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.46.2': - resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + '@rollup/rollup-darwin-arm64@4.52.0': + resolution: {integrity: sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.46.2': - resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + '@rollup/rollup-darwin-x64@4.52.0': + resolution: {integrity: sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.46.2': - resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + '@rollup/rollup-freebsd-arm64@4.52.0': + resolution: {integrity: sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.46.2': - resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + '@rollup/rollup-freebsd-x64@4.52.0': + resolution: {integrity: sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': - resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': + resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.46.2': - resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + '@rollup/rollup-linux-arm-musleabihf@4.52.0': + resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.46.2': - resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + '@rollup/rollup-linux-arm64-gnu@4.52.0': + resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.46.2': - resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + '@rollup/rollup-linux-arm64-musl@4.52.0': + resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': - resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + '@rollup/rollup-linux-loong64-gnu@4.52.0': + resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.46.2': - resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.0': + resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.46.2': - resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.0': + resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.46.2': - resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + '@rollup/rollup-linux-riscv64-musl@4.52.0': + resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.46.2': - resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + '@rollup/rollup-linux-s390x-gnu@4.52.0': + resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.46.2': - resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + '@rollup/rollup-linux-x64-gnu@4.52.0': + resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.46.2': - resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + '@rollup/rollup-linux-x64-musl@4.52.0': + resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.46.2': - resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + '@rollup/rollup-openharmony-arm64@4.52.0': + resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.0': + resolution: {integrity: sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.46.2': - resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + '@rollup/rollup-win32-ia32-msvc@4.52.0': + resolution: {integrity: sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.46.2': - resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + '@rollup/rollup-win32-x64-gnu@4.52.0': + resolution: {integrity: sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==} cpu: [x64] os: [win32] - '@sindresorhus/is@7.0.2': - resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + '@rollup/rollup-win32-x64-msvc@4.52.0': + resolution: {integrity: sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} engines: {node: '>=18'} '@sindresorhus/merge-streams@2.3.0': @@ -1683,8 +1683,11 @@ packages: '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} - '@stylistic/eslint-plugin@5.2.2': - resolution: {integrity: sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@stylistic/eslint-plugin@5.4.0': + resolution: {integrity: sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -1697,65 +1700,65 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' - '@tailwindcss/node@4.1.11': - resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + '@tailwindcss/node@4.1.13': + resolution: {integrity: sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==} - '@tailwindcss/oxide-android-arm64@4.1.11': - resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + '@tailwindcss/oxide-android-arm64@4.1.13': + resolution: {integrity: sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.11': - resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + '@tailwindcss/oxide-darwin-arm64@4.1.13': + resolution: {integrity: sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.11': - resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + '@tailwindcss/oxide-darwin-x64@4.1.13': + resolution: {integrity: sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.11': - resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + '@tailwindcss/oxide-freebsd-x64@4.1.13': + resolution: {integrity: sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': - resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': + resolution: {integrity: sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': - resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': + resolution: {integrity: sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': - resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.13': + resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': - resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.13': + resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.11': - resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + '@tailwindcss/oxide-linux-x64-musl@4.1.13': + resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.11': - resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + '@tailwindcss/oxide-wasm32-wasi@4.1.13': + resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1766,29 +1769,29 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': - resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': + resolution: {integrity: sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': - resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.13': + resolution: {integrity: sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.11': - resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + '@tailwindcss/oxide@4.1.13': + resolution: {integrity: sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==} engines: {node: '>= 10'} - '@tailwindcss/typography@0.5.16': - resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + '@tailwindcss/typography@0.5.18': + resolution: {integrity: sha512-dDIgwZOlf+tVkZ7A029VvQ1+ngKATENDjMEx2N35s2yPjfTS05RWSM8ilhEWSa5DMJ6ci2Ha9WNZEd2GQjrdQg==} peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tailwindcss/vite@4.1.11': - resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + '@tailwindcss/vite@4.1.13': + resolution: {integrity: sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 @@ -1813,9 +1816,8 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@types/bcryptjs@3.0.0': - resolution: {integrity: sha512-WRZOuCuaz8UcZZE4R5HXTco2goQSI2XxjGY3hbM/xDvwmqFWd4ivooImsMx65OKM6CtNKbnZ5YL+YwAwK7c1dg==} - deprecated: This is a stub types definition. bcryptjs provides its own type definitions, so you do not need this installed. + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1823,20 +1825,20 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/luxon@3.6.2': - resolution: {integrity: sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==} + '@types/luxon@3.7.1': + resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.16.5': - resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/node@22.18.6': + resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} '@types/parse-path@7.1.0': resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} @@ -1845,11 +1847,11 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} '@types/turndown@5.0.5': resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} @@ -1857,70 +1859,67 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@8.38.0': - resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} + '@typescript-eslint/eslint-plugin@8.44.0': + resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.38.0 + '@typescript-eslint/parser': ^8.44.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.38.0': - resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} + '@typescript-eslint/parser@8.44.0': + resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + '@typescript-eslint/project-service@8.44.0': + resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + '@typescript-eslint/scope-manager@8.44.0': + resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + '@typescript-eslint/tsconfig-utils@8.44.0': + resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + '@typescript-eslint/type-utils@8.44.0': + resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + '@typescript-eslint/types@8.44.0': + resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + '@typescript-eslint/typescript-estree@8.44.0': + resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + '@typescript-eslint/utils@8.44.0': + resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + '@typescript-eslint/visitor-keys@8.44.0': + resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@unhead/vue@2.0.13': - resolution: {integrity: sha512-+Oxzj4Rb1IJolLd6RAAYPDisKVGSnp2WC0KpFog0t3ZliiuZufRGwk8AWf2ntdn93x7WM9afnDAVNCipnPFxFg==} + '@unhead/vue@2.0.17': + resolution: {integrity: sha512-jzmGZYeMAhETV6qfetmLbZzUjjx1TjdNvFSobeFZb73D7dwD9wl/nOAx36qq+TvjZsLJdF5PQWToz2oDGAUqCg==} peerDependencies: vue: '>=3.5.18' @@ -2019,33 +2018,33 @@ packages: cpu: [x64] os: [win32] - '@vercel/nft@0.29.4': - resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + '@vercel/nft@0.30.1': + resolution: {integrity: sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g==} engines: {node: '>=18'} hasBin: true - '@vitejs/plugin-vue-jsx@4.2.0': - resolution: {integrity: sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==} - engines: {node: ^18.0.0 || >=20.0.0} + '@vitejs/plugin-vue-jsx@5.1.1': + resolution: {integrity: sha512-uQkfxzlF8SGHJJVH966lFTdjM/lGcwJGzwAHpVqAPDD/QcsqoUGa+q31ox1BrUfi+FLP2ChVp7uLXE3DkHyDdQ==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.0.0 - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.20': - resolution: {integrity: sha512-dRDF1G33xaAIDqR6+mXUIjXYdu9vzSxlMGfMEwBxQsfY/JMUEXSpLTR057oTKlUQ2nIvCmP9k94A8h8z2VrNSA==} + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} - '@volar/source-map@2.4.20': - resolution: {integrity: sha512-mVjmFQH8mC+nUaVwmbxoYUy8cww+abaO8dWzqPUjilsavjxH0jCJ3Mp8HFuHsdewZs2c+SP+EO7hCd8Z92whJg==} + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} - '@volar/typescript@2.4.20': - resolution: {integrity: sha512-Oc4DczPwQyXcVbd+5RsNEqX6ia0+w3p+klwdZQ6ZKhFjWoBP9PCPQYlKYRi/tDemWphW93P/Vv13vcE9I9D2GQ==} + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} '@vue-macros/common@1.16.1': resolution: {integrity: sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==} @@ -2056,8 +2055,8 @@ packages: vue: optional: true - '@vue-macros/common@3.0.0-beta.15': - resolution: {integrity: sha512-DMgq/rIh1H20WYNWU7krIbEfJRYDDhy7ix64GlT4AVUJZZWCZ5pxiYVJR3A3GmWQPkn7Pg7i3oIiGqu4JGC65w==} + '@vue-macros/common@3.0.0-beta.16': + resolution: {integrity: sha512-8O2gWxWFiaoNkk7PGi0+p7NPGe/f8xJ3/INUufvje/RZOs7sJvlI1jnR4lydtRFa/mU0ylMXUXXjSK0fHDEYTA==} engines: {node: '>=20.18.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 @@ -2065,45 +2064,33 @@ packages: vue: optional: true - '@vue/babel-helper-vue-transform-on@1.4.0': - resolution: {integrity: sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==} + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} - '@vue/babel-plugin-jsx@1.4.0': - resolution: {integrity: sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==} + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} peerDependencies: '@babel/core': ^7.0.0-0 peerDependenciesMeta: '@babel/core': optional: true - '@vue/babel-plugin-resolve-type@1.4.0': - resolution: {integrity: sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==} + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.5.18': - resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} + '@vue/compiler-core@3.5.21': + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} - '@vue/compiler-core@3.5.22': - resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + '@vue/compiler-dom@3.5.21': + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} - '@vue/compiler-dom@3.5.18': - resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} + '@vue/compiler-sfc@3.5.21': + resolution: {integrity: sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==} - '@vue/compiler-dom@3.5.22': - resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} - - '@vue/compiler-sfc@3.5.18': - resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} - - '@vue/compiler-sfc@3.5.22': - resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} - - '@vue/compiler-ssr@3.5.18': - resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} - - '@vue/compiler-ssr@3.5.22': - resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + '@vue/compiler-ssr@3.5.21': + resolution: {integrity: sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -2122,33 +2109,30 @@ packages: '@vue/devtools-shared@7.7.7': resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} - '@vue/language-core@3.0.4': - resolution: {integrity: sha512-BvueED4LfBCSNH66eeUQk37MQCb7hjdezzGgxniM0LbriW53AJIyLorgshAtStmjfsAuOCcTl/c1b+nz/ye8xQ==} + '@vue/language-core@3.0.7': + resolution: {integrity: sha512-0sqqyqJ0Gn33JH3TdIsZLCZZ8Gr4kwlg8iYOnOrDDkJKSjFurlQY/bEFQx5zs7SX2C/bjMkmPYq/NiyY1fTOkw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@vue/reactivity@3.5.22': - resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + '@vue/reactivity@3.5.21': + resolution: {integrity: sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==} - '@vue/runtime-core@3.5.22': - resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + '@vue/runtime-core@3.5.21': + resolution: {integrity: sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==} - '@vue/runtime-dom@3.5.22': - resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + '@vue/runtime-dom@3.5.21': + resolution: {integrity: sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==} - '@vue/server-renderer@3.5.22': - resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + '@vue/server-renderer@3.5.21': + resolution: {integrity: sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==} peerDependencies: - vue: 3.5.22 + vue: 3.5.21 - '@vue/shared@3.5.18': - resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} - - '@vue/shared@3.5.22': - resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + '@vue/shared@3.5.21': + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} '@vueuse/core@13.6.0': resolution: {integrity: sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==} @@ -2169,26 +2153,6 @@ packages: peerDependencies: vue: ^3.5.0 - '@whatwg-node/disposablestack@0.0.6': - resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} - engines: {node: '>=18.0.0'} - - '@whatwg-node/fetch@0.10.10': - resolution: {integrity: sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==} - engines: {node: '>=18.0.0'} - - '@whatwg-node/node-fetch@0.7.25': - resolution: {integrity: sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==} - engines: {node: '>=18.0.0'} - - '@whatwg-node/promise-helpers@1.3.2': - resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} - engines: {node: '>=16.0.0'} - - '@whatwg-node/server@0.9.71': - resolution: {integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==} - engines: {node: '>=18.0.0'} - abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2219,23 +2183,23 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - alien-signals@2.0.5: - resolution: {integrity: sha512-PdJB6+06nUNAClInE3Dweq7/2xVAYM64vvvS1IHVHSJmgeOtEdrAGyp7Z2oJtYm0B342/Exd2NT0uMJaThcjLQ==} + alien-signals@2.0.7: + resolution: {integrity: sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} ansis@4.1.0: @@ -2265,27 +2229,23 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arktype@2.1.20: - resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} + arktype@2.1.22: + resolution: {integrity: sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ==} ast-kit@1.4.3: resolution: {integrity: sha512-MdJqjpodkS5J149zN0Po+HPshkTdUyrvF7CKTafUgv69vBSPtncrj+3IiUgqdd7ElIEkbeXCsEouBUwLrw9Ilg==} engines: {node: '>=16.14.0'} - ast-kit@2.1.1: - resolution: {integrity: sha512-mfh6a7gKXE8pDlxTvqIc/syH/P3RkzbOF6LeHdcKztLEzYe6IMsRCL7N8vI7hqTGWNxpkCuuRTpT21xNWqhRtQ==} + ast-kit@2.1.2: + resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} engines: {node: '>=20.18.0'} - ast-module-types@6.0.1: - resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} - engines: {node: '>=18'} - ast-walker-scope@0.6.2: resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==} engines: {node: '>=16.14.0'} - ast-walker-scope@0.8.1: - resolution: {integrity: sha512-72XOdbzQCMKERvFrxAykatn2pu7osPNq/sNUzwcHdWzwPvOsNpPqkawfDXVvQbA2RT+ivtsMNjYdojTUZitt1A==} + ast-walker-scope@0.8.2: + resolution: {integrity: sha512-3pYeLyDZ6nJew9QeBhS4Nly02269Dkdk32+zdbbKmL6n4ZuaGorwwA+xx12xgOciA8BF1w9x+dlH7oUkFTW91w==} engines: {node: '>=20.18.0'} async-sema@3.1.1: @@ -2308,20 +2268,25 @@ packages: peerDependencies: postcss: ^8.1.0 - axios@1.12.0: - resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.7.1: + resolution: {integrity: sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.6.0: - resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + bare-events@2.7.0: + resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} - bare-fs@4.1.6: - resolution: {integrity: sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==} + bare-fs@4.4.4: + resolution: {integrity: sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -2329,15 +2294,15 @@ packages: bare-buffer: optional: true - bare-os@3.6.1: - resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} peerDependencies: bare-buffer: '*' bare-events: '*' @@ -2347,9 +2312,16 @@ packages: bare-events: optional: true + bare-url@2.2.2: + resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.6: + resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + hasBin: true + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -2358,6 +2330,9 @@ packages: resolution: {integrity: sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==} hasBin: true + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2390,14 +2365,11 @@ packages: brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-crc32@1.0.0: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} @@ -2411,10 +2383,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -2429,8 +2397,16 @@ packages: peerDependencies: esbuild: '>=0.18' - c12@3.2.0: - resolution: {integrity: sha512-ixkEtbYafL56E6HiFuonMm1ZjoKtIo7TH68/uiEq4DAwv9NcUX2nJ95F8TrbMeNjqIkZpruo3ojXQJ+MGG5gcQ==} + c12@3.1.0: + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + + c12@3.3.0: + resolution: {integrity: sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw==} peerDependencies: magicast: ^0.3.5 peerDependenciesMeta: @@ -2445,13 +2421,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2459,8 +2428,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001731: - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} canvas-renderer@2.2.1: resolution: {integrity: sha512-RrBgVL5qCEDIXpJ6NrzyRNoTnXxYarqm/cS/W6ERhUJts5UQtt/XPEosGN3rqUkZ4fjBArlnCbsISJ+KCFnIAg==} @@ -2524,25 +2493,16 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -2553,25 +2513,14 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2583,9 +2532,6 @@ packages: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -2626,12 +2572,8 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - copy-file@11.0.0: - resolution: {integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==} - engines: {node: '>=18'} - - core-js-compat@3.44.0: - resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2645,10 +2587,6 @@ packages: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} - croner@9.1.0: resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} @@ -2663,8 +2601,8 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - css-declaration-sorter@7.2.0: - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + css-declaration-sorter@7.3.0: + resolution: {integrity: sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 @@ -2696,8 +2634,8 @@ packages: cssfilter@0.0.10: resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} - cssnano-preset-default@7.0.8: - resolution: {integrity: sha512-d+3R2qwrUV3g4LEMOjnndognKirBZISylDZAF/TPeCWVjEwlXS2e4eN4ICkoobRe7pD3H6lltinKVyS1AJhdjQ==} + cssnano-preset-default@7.0.9: + resolution: {integrity: sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 @@ -2708,8 +2646,8 @@ packages: peerDependencies: postcss: ^8.4.32 - cssnano@7.1.0: - resolution: {integrity: sha512-Pu3rlKkd0ZtlCUzBrKL1Z4YmhKppjC1H9jo7u1o4qaKqyhvixFgu5qLyNIAOjSTg9DjVPtUqdROq2EfpVMEe+w==} + cssnano@7.1.1: + resolution: {integrity: sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 @@ -2718,12 +2656,16 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssstyle@5.3.0: + resolution: {integrity: sha512-RveJPnk3m7aarYQ2bJ6iw+Urh55S6FzUiqtBq+TihnTDP4cI8y/TYDqGOyqgnG1J1a6BxJXZsV9JFSTulm9Z7g==} + engines: {node: '>=20'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} @@ -2754,8 +2696,8 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2763,8 +2705,8 @@ packages: supports-color: optional: true - decache@4.6.2: - resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -2780,6 +2722,10 @@ packages: deep-is@0.1.4: 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'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2827,55 +2773,12 @@ packages: engines: {node: '>=0.10'} hasBin: true - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} - detective-amd@6.0.1: - resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} - engines: {node: '>=18'} - hasBin: true - - detective-cjs@6.0.1: - resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} - engines: {node: '>=18'} - - detective-es6@5.0.1: - resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} - engines: {node: '>=18'} - - detective-postcss@7.0.1: - resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} - engines: {node: ^14.0.0 || >=16.0.0} - peerDependencies: - postcss: ^8.4.47 - - detective-sass@6.0.1: - resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} - engines: {node: '>=18'} - - detective-scss@5.0.1: - resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} - engines: {node: '>=18'} - - detective-stylus@5.0.1: - resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} - engines: {node: '>=18'} - - detective-typescript@14.0.0: - resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} - engines: {node: '>=18'} - peerDependencies: - typescript: ^5.4.4 - - detective-vue2@2.2.0: - resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} - engines: {node: '>=18'} - peerDependencies: - typescript: ^5.4.4 - - devalue@5.1.1: - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2908,8 +2811,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.1: - resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} + dotenv@17.2.2: + resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -2925,8 +2828,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.194: - resolution: {integrity: sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==} + effect@3.16.12: + resolution: {integrity: sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==} + + electron-to-chromium@1.5.222: + resolution: {integrity: sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2934,8 +2840,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} @@ -2947,8 +2854,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.2: - resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -2959,10 +2866,6 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 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} - error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -2988,13 +2891,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -3039,8 +2937,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-flat-config-utils@2.1.1: - resolution: {integrity: sha512-K8eaPkBemHkfbYsZH7z4lZ/tt6gNSsVh535Wh9W9gQBS2WjvfUbbVr2NZR3L1yiRCLuOEimYfPxCxODczD4Opg==} + eslint-flat-config-utils@2.1.4: + resolution: {integrity: sha512-bEnmU5gqzS+4O+id9vrbP43vByjF+8KOs+QuuV4OlqAuXmnRW2zfI/Rza1fQvdihQ5h4DUo0NqFAiViD4mSrzQ==} eslint-import-context@0.1.9: resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} @@ -3079,14 +2977,14 @@ packages: eslint-import-resolver-node: optional: true - eslint-plugin-jsdoc@51.4.1: - resolution: {integrity: sha512-y4CA9OkachG8v5nAtrwvcvjIbdcKgSyS6U//IfQr4FZFFyeBFwZFf/tfSsMr46mWDJgidZjBTqoCRlXywfFBMg==} + eslint-plugin-jsdoc@54.7.0: + resolution: {integrity: sha512-u5Na4he2+6kY1rWqxzbQaAwJL3/tDCuT5ElDRc5UJ9stOeQeQ5L1JJ1kRRu7ldYMlOHMCJLsY8Mg/Tu3ExdZiQ==} engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-regexp@2.9.0: - resolution: {integrity: sha512-9WqJMnOq8VlE/cK+YAo9C9YHhkOtcEtEk9d12a+H7OSZFwlpI6stiHmYPGa2VE0QhTzodJyhlyprUaXDZLgHBw==} + eslint-plugin-regexp@2.10.0: + resolution: {integrity: sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==} engines: {node: ^18 || >=20} peerDependencies: eslint: '>=8.44.0' @@ -3131,8 +3029,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + eslint@9.36.0: + resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3199,13 +3097,9 @@ packages: exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - externality@1.0.2: - resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} - - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -3229,8 +3123,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-npm-meta@0.4.4: - resolution: {integrity: sha512-cq8EVW3jpX1U3dO1AYanz2BJ6n9ITQgCwE1xjNwI5jO2a9erE369OZNO8Wt/Wbw8YHhCD/dimH9BxRsY+6DinA==} + fast-npm-meta@0.4.6: + resolution: {integrity: sha512-zbBBOAOlzxfrU4WSnbCHk/nR6Vf32lSEPxDEvNOR08Z5DSZ/A6qJu0rqrHVcexBTd1hc2gim998xnqF/R1PuEw==} fast-redact@3.5.0: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} @@ -3242,24 +3136,15 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -3278,10 +3163,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - filter-obj@6.1.0: - resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} - engines: {node: '>=18'} - find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} @@ -3301,9 +3182,6 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -3327,10 +3205,6 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -3341,8 +3215,8 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs-extra@8.1.0: @@ -3365,10 +3239,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-amd-module-type@6.0.1: - resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} - engines: {node: '>=18'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3384,10 +3254,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3428,19 +3294,14 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} globby@14.1.0: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} - gonzales-pe@4.3.0: - resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} - engines: {node: '>=0.6.0'} - hasBin: true - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3458,8 +3319,8 @@ packages: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - h3@1.15.3: - resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3487,9 +3348,9 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} @@ -3498,6 +3359,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -3549,10 +3414,6 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@1.1.0: - resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} - engines: {node: '>=18'} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3574,17 +3435,13 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-builtin-module@5.0.0: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} @@ -3638,9 +3495,8 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -3656,17 +3512,6 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - - is-url-superb@4.0.0: - resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} - engines: {node: '>=10'} - - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -3701,10 +3546,6 @@ packages: engines: {node: '>=6.4.0'} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - jiti@2.5.1: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true @@ -3713,8 +3554,8 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3726,10 +3567,23 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + jsdoc-type-pratt-parser@4.8.0: + resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} engines: {node: '>=12.0.0'} + jsdoc-type-pratt-parser@5.1.1: + resolution: {integrity: sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==} + engines: {node: '>=12.0.0'} + + jsdom@27.0.0: + resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} + engines: {node: '>=20'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -3767,16 +3621,8 @@ packages: jsonfile@5.0.0: resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - junk@4.0.1: - resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} - engines: {node: '>=12.20'} - - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3796,16 +3642,8 @@ packages: knitwork@1.2.0: resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - - lambda-local@2.2.0: - resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} - engines: {node: '>=8'} - hasBin: true - - launch-editor@2.11.0: - resolution: {integrity: sha512-R/PIF14L6e2eHkhvQPu7jDRCr0msfCYCxbYiLgkkAGi0dVPWuM+RrsPu0a5dpuNe0KWGL3jpAkOlv53xGfPheQ==} + launch-editor@2.11.1: + resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} @@ -3891,8 +3729,8 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@1.1.1: - resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} locate-path@6.0.0: @@ -3903,24 +3741,12 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -3933,18 +3759,18 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - luxon@3.7.1: - resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} magic-regexp@0.10.0: @@ -3954,13 +3780,10 @@ packages: resolution: {integrity: sha512-ub9iytsEbT7Yw/Pd29mSo/cNQpaEu67zR1VVcXDiYjSFwzeBxNdTd0FMnSslLQXiRj8uGPzwsaoefrMD5XAmdw==} engines: {node: '>=16.14.0'} - magic-string-ast@1.0.0: - resolution: {integrity: sha512-8rbuNizut2gW94kv7pqgt0dvk+AHLPVIm0iJtpSgQJ9dx21eWx5SBel8z3jp1xtC0j6/iyK3AWGhAR1H61s7LA==} + magic-string-ast@1.0.2: + resolution: {integrity: sha512-8ngQgLhcT0t3YBdn9CGkZqCYlvwW9pm7aWJwd7AxseVWf1RU8ZHCQvG1mt3N5vvUme+pXTcHB8G/7fE666U8Vw==} engines: {node: '>=20.18.0'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -3980,10 +3803,6 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - merge-options@3.0.4: - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} - engines: {node: '>=10'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3991,9 +3810,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micro-api-client@3.3.0: - resolution: {integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -4079,8 +3895,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mime@4.0.7: - resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} hasBin: true @@ -4092,10 +3908,6 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -4137,17 +3949,12 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} - module-definition@6.0.1: - resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} - engines: {node: '>=18'} - hasBin: true - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -4174,21 +3981,17 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - napi-postinstall@0.3.2: - resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - netlify@13.3.5: - resolution: {integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==} - engines: {node: ^14.16.0 || >=16.0.0} - - nitropack@2.12.4: - resolution: {integrity: sha512-MPmPRJWTeH03f/NmpN4q3iI3Woik4uaaWIoX34W3gMJiW06Vm1te/lPzuu5EXpXOK7Q2m3FymGMPXcExqih96Q==} - engines: {node: ^16.11.0 || >=17.0.0} + nitropack@2.12.6: + resolution: {integrity: sha512-DEq31s0SP4/Z5DIoVBRo9DbWFPWwIoYD4cQMEz7eE+iJMiAP+1k9A3B9kcc6Ihc0jDJmfUcHYyh6h2XlynCx6g==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: xml2js: ^0.6.2 @@ -4196,8 +3999,8 @@ packages: xml2js: optional: true - node-abi@3.75.0: - resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + node-abi@3.77.0: + resolution: {integrity: sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -4210,13 +4013,8 @@ packages: resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} engines: {node: ^18 || ^20 || >= 21} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -4227,10 +4025,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -4239,29 +4033,17 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-mock-http@1.0.2: - resolution: {integrity: sha512-zWaamgDUdo9SSLw47we78+zYw/bDr5gH8pH7oRRs8V3KmBtu8GLgGIbV2p/gRPd3LWpEOpjQj7X1FOU3VFMJ8g==} + node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - node-source-walk@7.0.1: - resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} - engines: {node: '>=18'} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} nopt@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4270,8 +4052,8 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.2: - resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} npm-run-path@5.3.0: @@ -4292,28 +4074,24 @@ packages: resolution: {integrity: sha512-bTdgAAAdnvM1R1wAX3zQBbYJh6YNFyvsKJwbT9oVv+0U9J/9+k+mufQlJMFO8AdTefi/EDFHG75in9RTnCpngQ==} engines: {node: '>=18.0.0'} - nuxt@3.17.7: - resolution: {integrity: sha512-1xl1HcKIbDHpNMW6pXhVhSM5Po51FW14mooyw5ZK5G+wMb0P+uzI/f7xmlaRkBv5Q8ZzUIH6gVUh3KyiucLn+w==} - engines: {node: ^20.9.0 || >=22.0.0} + nuxt@4.1.2: + resolution: {integrity: sha512-g5mwszCZT4ZeGJm83nxoZvtvZoAEaY65VDdn7p7UgznePbRaEJJ1KS1OIld4FPVkoDZ8TEVuDNqI9gUn12Exvg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@parcel/watcher': ^2.1.0 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': '>=18.12.0' peerDependenciesMeta: '@parcel/watcher': optional: true '@types/node': optional: true - nypm@0.6.1: - resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} @@ -4335,9 +4113,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -4354,17 +4129,26 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + oxc-minify@0.87.0: + resolution: {integrity: sha512-+UHWp6+0mdq0S2rEsZx9mqgL6JnG9ogO+CU17XccVrPUFtISFcZzk/biTn1JdBYFQ3kztof19pv8blMtgStQ2g==} + engines: {node: '>=14.0.0'} + oxc-parser@0.70.0: resolution: {integrity: sha512-YbqTuQDDIYwQF/li0VFK5uTbmHV4jWFeQQONkPdf77vz+JMiq7SusmcSVZ4hBrGM+3WyLdKH5S7spnvz4XVVzQ==} engines: {node: '>=14.0.0'} - oxc-parser@0.76.0: - resolution: {integrity: sha512-l98B2e9evuhES7zN99rb1QGhbzx25829TJFaKi2j0ib3/K/G5z1FdGYz6HZkrU3U8jdH7v2FC8mX1j2l9JrOUg==} + oxc-parser@0.87.0: + resolution: {integrity: sha512-uc47XrtHwkBoES4HFgwgfH9sqwAtJXgAIBq4fFBMZ4hWmgVZoExyn+L4g4VuaecVKXkz1bvlaHcfwHAJPQb5Gw==} engines: {node: '>=20.0.0'} - p-event@6.0.1: - resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} - engines: {node: '>=16.17'} + oxc-transform@0.87.0: + resolution: {integrity: sha512-dt6INKWY2DKbSc8yR9VQoqBsCjPQ3z/SKv882UqlwFve+K38xtpi2avDlvNd35SpHUwDLDFoV3hMX0U3qOSaaQ==} + engines: {node: '>=14.0.0'} + + oxc-walker@0.5.2: + resolution: {integrity: sha512-XYoZqWwApSKUmSDEFeOKdy3Cdh95cOcSU8f7yskFWE4Rl3cfL5uwyY+EV7Brk9mdNLy+t5SseJajd6g7KncvlA==} + peerDependencies: + oxc-parser: '>=0.72.0' p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -4386,14 +4170,6 @@ packages: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} - - p-wait-for@5.0.2: - resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} - engines: {node: '>=12'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -4407,17 +4183,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} - parse-imports-exports@0.2.4: resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - parse-json@8.3.0: - resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} - engines: {node: '>=18'} - parse-path@7.1.0: resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} @@ -4481,12 +4249,12 @@ packages: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4501,22 +4269,22 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - pino-pretty@13.0.0: - resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} + pino-pretty@13.1.1: + resolution: {integrity: sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA==} hasBin: true pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.7.0: - resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + pino@9.10.0: + resolution: {integrity: sha512-VOFxoNnxICtxaN8S3E73pR66c5MTFC+rwRcNRyHV/bV/c90dXvJqMfjkeRFsGBDXmlUN3LccJQPqGIufnaJePA==} hasBin: true pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.2.0: - resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} @@ -4534,8 +4302,8 @@ packages: peerDependencies: postcss: ^8.4.32 - postcss-convert-values@7.0.6: - resolution: {integrity: sha512-MD/eb39Mr60hvgrqpXsgbiqluawYg/8K4nKsqRsuDX9f+xN1j6awZCUv/5tLH8ak3vYp/EMXwdcnXvfZYiejCQ==} + postcss-convert-values@7.0.7: + resolution: {integrity: sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 @@ -4699,12 +4467,6 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss-values-parser@6.0.2: - resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} - engines: {node: '>=10'} - peerDependencies: - postcss: ^8.2.9 - postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -4714,11 +4476,6 @@ packages: engines: {node: '>=10'} hasBin: true - precinct@12.2.0: - resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} - engines: {node: '>=18'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4728,12 +4485,12 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + pretty-bytes@7.0.1: + resolution: {integrity: sha512-285/jRCYIbMGDciDdrw0KPNC4LKEEwz/bwErcYNxSJOi4CpGUuLpb9gQpg3XJP0XYj9ldSRluXxih4lX2YN8Xw==} + engines: {node: '>=20'} - prisma@6.12.0: - resolution: {integrity: sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg==} + prisma@6.16.2: + resolution: {integrity: sha512-aRvldGE5UUJTtVmFiH3WfNFNiqFlAtePUxcI0UEGlnXCX7DqhiMT5TRYwncHFeA/Reca5W6ToXXyCMTeFPdSXA==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -4769,12 +4526,11 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4782,9 +4538,6 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quote-unquote@1.0.0: - resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} - radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -4802,14 +4555,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - read-package-up@11.0.0: - resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} - engines: {node: '>=18'} - - read-pkg@9.0.1: - resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} - engines: {node: '>=18'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -4864,15 +4609,13 @@ packages: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-package-name@2.0.1: - resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -4890,10 +4633,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - restructure@3.0.2: resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} @@ -4917,13 +4656,16 @@ packages: rollup: optional: true - rollup@4.46.2: - resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + rollup@4.52.0: + resolution: {integrity: sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} run-parallel@1.2.0: @@ -4945,14 +4687,18 @@ packages: sanitize-filename@1.6.3: resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - sass@1.89.2: - resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==} + sass@1.93.0: + resolution: {integrity: sha512-CQi5/AzCwiubU3dSqRDJ93RfOfg/hhpW1l6wCIvolmehfwgCI35R/0QDs1+R+Ygrl8jFawwwIojE2w47/mf94A==} engines: {node: '>=14.0.0'} hasBin: true sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} @@ -4960,8 +4706,8 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + secure-json-parse@4.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -5005,22 +4751,6 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - 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'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -5034,11 +4764,11 @@ packages: simple-git@3.28.0: resolution: {integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} sisteransi@1.0.5: @@ -5072,20 +4802,14 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} @@ -5099,9 +4823,6 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -5145,16 +4866,16 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-indent@4.1.0: + resolution: {integrity: sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w==} engines: {node: '>=12'} strip-json-comments@2.0.1: @@ -5165,6 +4886,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} @@ -5185,8 +4910,8 @@ packages: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} - supports-color@10.0.0: - resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} supports-color@7.2.0: @@ -5207,6 +4932,9 @@ packages: engines: {node: '>=16'} hasBin: true + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.10.4: resolution: {integrity: sha512-2SG1TnJGjMkD4+gblONMGYSrwAzYi+ymOitD+Jb/iMYm57nH20PlkVeMQRah3yDMKEa0QQYUF/QPWpdW7C6zNg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5215,18 +4943,18 @@ packages: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - tailwindcss@4.1.11: - resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tailwindcss@4.1.13: + resolution: {integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} - tar-fs@2.1.3: - resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - tar-fs@3.1.0: - resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -5239,17 +4967,14 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -5265,16 +4990,16 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tldts-core@7.0.14: + resolution: {integrity: sha512-viZGNK6+NdluOJWwTO9olaugx0bkKhscIdriQQ+lNNhwitIKvb+SvhbYgnCz6j9p7dX3cJntt4agQAKMXLjJ5g==} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} + tldts@7.0.14: + resolution: {integrity: sha512-lMNHE4aSI3LlkMUMicTmAG3tkkitjOQGDTFboPJwAg2kJXKP1ryWEyqujktg5qhrFZOkk5YFzgkxg3jErE+i5w==} + hasBin: true to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -5288,9 +5013,6 @@ packages: resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} engines: {node: '>=14.16'} - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - tosource@2.0.0-alpha.3: resolution: {integrity: sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==} engines: {node: '>=10'} @@ -5299,12 +5021,16 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} @@ -5321,8 +5047,8 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turndown@7.2.0: - resolution: {integrity: sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==} + turndown@7.2.1: + resolution: {integrity: sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -5335,8 +5061,8 @@ packages: type-level-regexp@0.1.17: resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -5358,15 +5084,15 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.13.0: - resolution: {integrity: sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.19: - resolution: {integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==} + unenv@2.0.0-rc.21: + resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} - unhead@2.0.13: - resolution: {integrity: sha512-Q3lMTJnoGj8zNsqP/GWIIAd8W/hKKeOgErbsMSXDWdkIICUeIg9p7J5/0uDFREa684cReRz1NFxbrDaS+5rGMw==} + unhead@2.0.17: + resolution: {integrity: sha512-xX3PCtxaE80khRZobyWCVxeFF88/Tg9eJDcJWY9us727nsTC7C449B8BUfVBmiF2+3LjPcmqeoB2iuMs0U4oJQ==} unicode-properties@1.4.1: resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} @@ -5385,8 +5111,8 @@ packages: unifont@0.4.1: resolution: {integrity: sha512-zKSY9qO8svWYns+FGKjyVdLvpGPwqmsCjeJLN1xndMiqxHWBAhoWDMYMG960MxeV48clBmG+fDP59dHY1VoZvg==} - unimport@5.2.0: - resolution: {integrity: sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==} + unimport@5.3.0: + resolution: {integrity: sha512-cty7t1DESgm0OPfCy9oyn5u9B5t0tMW6tH6bXTjAGIO3SkJsbg/DXYHjrPrUKqultqbAAoltAfYsuu/FEDocjg==} engines: {node: '>=18.12.0'} universalify@0.1.2: @@ -5397,17 +5123,17 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unixify@1.0.0: - resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} - engines: {node: '>=0.10.0'} - unplugin-remove@1.0.3: resolution: {integrity: sha512-BZMt9v8Y/Z27cY7YQv+DpcW928znjP1cqplBXOirbANiFQtM2YCdiyNAJhHCvjppT0lScNn1aDrQnXqnRp32pQ==} - unplugin-utils@0.2.4: - resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + unplugin-utils@0.2.5: + resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} engines: {node: '>=18.12.0'} + unplugin-utils@0.3.0: + resolution: {integrity: sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==} + engines: {node: '>=20.19.0'} + unplugin-vue-router@0.12.0: resolution: {integrity: sha512-xjgheKU0MegvXQcy62GVea0LjyOdMxN0/QH+ijN29W62ZlMhG7o7K+0AYqfpprvPwpWtuRjiyC5jnV2SxWye2w==} peerDependencies: @@ -5416,8 +5142,8 @@ packages: vue-router: optional: true - unplugin-vue-router@0.14.0: - resolution: {integrity: sha512-ipjunvS5e2aFHBAUFuLbHl2aHKbXXXBhTxGT9wZx66fNVPdEQzVVitF8nODr1plANhTTa3UZ+DQu9uyLngMzoQ==} + unplugin-vue-router@0.15.0: + resolution: {integrity: sha512-PyGehCjd9Ny9h+Uer4McbBjjib3lHihcyUEILa7pHKl6+rh8N7sFyw4ZkV+N30Oq2zmIUG7iKs3qpL0r+gXAaQ==} peerDependencies: '@vue/compiler-sfc': ^3.5.17 vue-router: ^4.5.1 @@ -5429,15 +5155,15 @@ packages: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} - unplugin@2.3.5: - resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - unstorage@1.16.1: - resolution: {integrity: sha512-gdpZ3guLDhz+zWIlYP1UwQ259tG5T5vYRzDaHMkQ1bBY1SQPutvZnrRjTFaWUUpseErJIgAZS51h6NOcZVZiqQ==} + unstorage@1.17.1: + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -5451,6 +5177,7 @@ packages: '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 '@vercel/kv': ^1.0.1 aws4fetch: ^1.0.20 db0: '>=0.2.1' @@ -5482,6 +5209,8 @@ packages: optional: true '@vercel/blob': optional: true + '@vercel/functions': + optional: true '@vercel/kv': optional: true aws4fetch: @@ -5503,8 +5232,8 @@ packages: resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true - unwasm@0.3.9: - resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + unwasm@0.3.11: + resolution: {integrity: sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -5518,25 +5247,12 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} - - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-dev-rpc@1.1.0: resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} peerDependencies: @@ -5552,8 +5268,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-plugin-checker@0.10.1: - resolution: {integrity: sha512-imiBsmYTPdjQHIZiEi5BhJ7K8Z/kCjTFMn+Qa4+5ao/a4Yql4yWFcf81FDJqlMiM57iY4Q3Z7PdoEe4KydULYQ==} + vite-plugin-checker@0.10.3: + resolution: {integrity: sha512-f4sekUcDPF+T+GdbbE8idb1i2YplBAoH+SfRS0e/WRBWb2rYb1Jf5Pimll0Rj+3JgIYWwG2K5LtBPCXxoibkLg==} engines: {node: '>=14.16'} peerDependencies: '@biomejs/biome': '>=1.7' @@ -5586,8 +5302,8 @@ packages: vue-tsc: optional: true - vite-plugin-inspect@11.3.2: - resolution: {integrity: sha512-nzwvyFQg58XSMAmKVLr2uekAxNYvAbz1lyPmCAFVIBncCgN9S/HPM+2UM9Q9cvc4JEbC5ZBgwLAdaE2onmQuKg==} + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' @@ -5608,48 +5324,8 @@ packages: vite: ^6.0.0 || ^7.0.0 vue: ^3.5.0 - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vite@7.0.6: - resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} + vite@7.1.6: + resolution: {integrity: sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -5714,8 +5390,8 @@ packages: peerDependencies: vue: ^3.2.0 - vue-tsc@3.0.4: - resolution: {integrity: sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw==} + vue-tsc@3.0.7: + resolution: {integrity: sha512-BSMmW8GGEgHykrv7mRk6zfTdK+tw4MBZY/x6fFa7IkdXK3s/8hQRacPjG9/8YKFDIWGhBocwi6PlkQQ/93OgIQ==} hasBin: true peerDependencies: typescript: '>=5.0.0' @@ -5733,8 +5409,8 @@ packages: peerDependencies: vue: ^3.5.0 - vue@3.5.22: - resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + vue@3.5.21: + resolution: {integrity: sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -5746,13 +5422,17 @@ packages: peerDependencies: vue: ^3.0.1 - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -5764,6 +5444,10 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -5777,14 +5461,6 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} - - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} - engines: {node: '>= 12.0.0'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -5800,10 +5476,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@6.0.0: - resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} - engines: {node: ^18.17.0 || >=20.5.0} - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -5824,6 +5496,13 @@ packages: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xss@1.0.15: resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} engines: {node: '>= 0.10.0'} @@ -5844,8 +5523,8 @@ packages: resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -5857,9 +5536,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5874,39 +5550,44 @@ packages: youch@4.1.0-beta.11: resolution: {integrity: sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==} - youch@4.1.0-beta.8: - resolution: {integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==} - engines: {node: '>=18'} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.3.0 tinyexec: 1.0.1 - '@apidevtools/json-schema-ref-parser@14.1.1': + '@apidevtools/json-schema-ref-parser@14.2.1(@types/json-schema@7.0.15)': dependencies: '@types/json-schema': 7.0.15 js-yaml: 4.1.0 - '@ark/schema@0.46.0': + '@ark/schema@0.49.0': dependencies: - '@ark/util': 0.46.0 + '@ark/util': 0.49.0 - '@ark/util@0.46.0': {} + '@ark/util@0.49.0': {} + + '@asamuzakjp/css-color@4.0.4': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.1 + + '@asamuzakjp/dom-selector@6.5.5': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + + '@asamuzakjp/nwsapi@2.3.9': {} '@babel/code-frame@7.27.1': dependencies: @@ -5914,34 +5595,34 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.28.0': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.28.2 - '@babel/parser': 7.28.0 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.0': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': @@ -5950,21 +5631,21 @@ snapshots: '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -5973,24 +5654,24 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -6000,18 +5681,18 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -6022,70 +5703,56 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.2': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - - '@babel/parser@7.28.0': - dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@babel/parser@7.28.4': dependencies: '@babel/types': 7.28.4 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/runtime@7.28.2': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@babel/traverse@7.28.0': + '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.1 + '@babel/types': 7.28.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.28.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@babel/types@7.28.2': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -6116,18 +5783,29 @@ snapshots: dependencies: mime: 3.0.0 - '@colors/colors@1.6.0': {} + '@csstools/color-helpers@5.1.0': {} - '@dabh/diagnostics@2.0.3': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@dependents/detective-less@5.0.1': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/css-tokenizer@3.0.4': {} '@discordapp/twemoji@16.0.1': dependencies: @@ -6185,229 +5863,170 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.52.0': + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@es-joy/jsdoccomment@0.56.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/types': 8.44.0 comment-parser: 1.4.1 esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 + jsdoc-type-pratt-parser: 5.1.1 - '@esbuild/aix-ppc64@0.25.5': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.5': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/android-arm@0.25.5': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/android-x64@0.25.5': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.5': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.5': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.5': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.5': + '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.5': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.5': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.5': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.5': + '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.5': + '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/win32-x64@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.5': - optional: true - - '@esbuild/linux-ppc64@0.25.8': - optional: true - - '@esbuild/linux-riscv64@0.25.5': - optional: true - - '@esbuild/linux-riscv64@0.25.8': - optional: true - - '@esbuild/linux-s390x@0.25.5': - optional: true - - '@esbuild/linux-s390x@0.25.8': - optional: true - - '@esbuild/linux-x64@0.25.5': - optional: true - - '@esbuild/linux-x64@0.25.8': - optional: true - - '@esbuild/netbsd-arm64@0.25.5': - optional: true - - '@esbuild/netbsd-arm64@0.25.8': - optional: true - - '@esbuild/netbsd-x64@0.25.5': - optional: true - - '@esbuild/netbsd-x64@0.25.8': - optional: true - - '@esbuild/openbsd-arm64@0.25.5': - optional: true - - '@esbuild/openbsd-arm64@0.25.8': - optional: true - - '@esbuild/openbsd-x64@0.25.5': - optional: true - - '@esbuild/openbsd-x64@0.25.8': - optional: true - - '@esbuild/openharmony-arm64@0.25.8': - optional: true - - '@esbuild/sunos-x64@0.25.5': - optional: true - - '@esbuild/sunos-x64@0.25.8': - optional: true - - '@esbuild/win32-arm64@0.25.5': - optional: true - - '@esbuild/win32-arm64@0.25.8': - optional: true - - '@esbuild/win32-ia32@0.25.5': - optional: true - - '@esbuild/win32-ia32@0.25.8': - optional: true - - '@esbuild/win32-x64@0.25.5': - optional: true - - '@esbuild/win32-x64@0.25.8': - optional: true - - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.5.1))': dependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.3.1(eslint@9.31.0(jiti@2.5.1))': + '@eslint/compat@1.3.2(eslint@9.36.0(jiti@2.5.1))': optionalDependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/config-inspector@1.1.0(eslint@9.31.0(jiti@2.5.1))': + '@eslint/config-inspector@1.3.0(eslint@9.36.0(jiti@2.5.1))': dependencies: '@nodelib/fs.walk': 3.0.1 ansis: 4.1.0 - bundle-require: 5.1.0(esbuild@0.25.8) + bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 chokidar: 4.0.3 - debug: 4.4.1 - esbuild: 0.25.8 - eslint: 9.31.0(jiti@2.5.1) + debug: 4.4.3 + esbuild: 0.25.10 + eslint: 9.36.0(jiti@2.5.1) find-up: 7.0.0 get-port-please: 3.2.0 - h3: 1.15.3 - mlly: 1.7.4 + h3: 1.15.4 + mlly: 1.8.0 mrmime: 2.0.1 open: 10.2.0 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 ws: 8.18.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -6418,83 +6037,77 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} - - '@eslint/js@9.32.0': {} + '@eslint/js@9.36.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@fastify/accept-negotiator@1.1.0': optional: true - '@fastify/busboy@3.1.1': {} - - '@headlessui/vue@1.7.23(vue@3.5.22(typescript@5.8.3))': + '@headlessui/vue@1.7.23(vue@3.5.21(typescript@5.9.2))': dependencies: - '@tanstack/vue-virtual': 3.13.12(vue@3.5.22(typescript@5.8.3)) - vue: 3.5.22(typescript@5.8.3) + '@tanstack/vue-virtual': 3.13.12(vue@3.5.21(typescript@5.9.2)) + vue: 3.5.21(typescript@5.9.2) - '@heroicons/vue@2.2.0(vue@3.5.22(typescript@5.8.3))': + '@heroicons/vue@2.2.0(vue@3.5.21(typescript@5.9.2))': dependencies: - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} - '@intlify/bundle-utils@10.0.1(vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3)))': + '@intlify/bundle-utils@10.0.1(vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2)))': dependencies: - '@intlify/message-compiler': 11.1.11 - '@intlify/shared': 11.1.11 + '@intlify/message-compiler': 11.1.12 + '@intlify/shared': 11.1.12 acorn: 8.15.0 escodegen: 2.1.0 estree-walker: 2.0.2 jsonc-eslint-parser: 2.4.0 - mlly: 1.7.4 + mlly: 1.8.0 source-map-js: 1.2.1 yaml-eslint-parser: 1.3.0 optionalDependencies: - vue-i18n: 10.0.8(vue@3.5.22(typescript@5.8.3)) + vue-i18n: 10.0.8(vue@3.5.21(typescript@5.9.2)) '@intlify/core-base@10.0.8': dependencies: '@intlify/message-compiler': 10.0.8 '@intlify/shared': 10.0.8 - '@intlify/core-base@11.1.11': + '@intlify/core-base@11.1.12': dependencies: - '@intlify/message-compiler': 11.1.11 - '@intlify/shared': 11.1.11 + '@intlify/message-compiler': 11.1.12 + '@intlify/shared': 11.1.12 '@intlify/core@10.0.8': dependencies: '@intlify/core-base': 10.0.8 '@intlify/shared': 10.0.8 - '@intlify/eslint-plugin-vue-i18n@4.0.1(eslint@9.31.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0)(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.5.1)))(yaml-eslint-parser@1.3.0)': + '@intlify/eslint-plugin-vue-i18n@4.1.0(eslint@9.36.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.0)(vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.5.1)))(yaml-eslint-parser@1.3.0)': dependencies: '@eslint/eslintrc': 3.3.1 - '@intlify/core-base': 11.1.11 - '@intlify/message-compiler': 11.1.11 - debug: 4.4.1 - eslint: 9.31.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.31.0(jiti@2.5.1)) + '@intlify/core-base': 11.1.12 + '@intlify/message-compiler': 11.1.12 + debug: 4.4.3 + eslint: 9.36.0(jiti@2.5.1) + eslint-compat-utils: 0.6.5(eslint@9.36.0(jiti@2.5.1)) glob: 10.4.5 - globals: 16.3.0 + globals: 16.4.0 ignore: 7.0.5 import-fresh: 3.3.1 is-language-code: 3.1.0 @@ -6505,7 +6118,7 @@ snapshots: parse5: 7.3.0 semver: 7.7.2 synckit: 0.10.4 - vue-eslint-parser: 10.2.0(eslint@9.31.0(jiti@2.5.1)) + vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.5.1)) yaml-eslint-parser: 1.3.0 transitivePeerDependencies: - supports-color @@ -6520,25 +6133,25 @@ snapshots: '@intlify/shared': 10.0.8 source-map-js: 1.2.1 - '@intlify/message-compiler@11.1.11': + '@intlify/message-compiler@11.1.12': dependencies: - '@intlify/shared': 11.1.11 + '@intlify/shared': 11.1.12 source-map-js: 1.2.1 '@intlify/shared@10.0.8': {} - '@intlify/shared@11.1.11': {} + '@intlify/shared@11.1.12': {} - '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.22)(eslint@9.31.0(jiti@2.5.1))(rollup@4.46.2)(typescript@5.8.3)(vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3))': + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.21)(eslint@9.36.0(jiti@2.5.1))(rollup@4.52.0)(typescript@5.9.2)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) - '@intlify/bundle-utils': 10.0.1(vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3))) - '@intlify/shared': 11.1.11 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)) - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - debug: 4.4.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@intlify/bundle-utils': 10.0.1(vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2))) + '@intlify/shared': 11.1.12 + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.12)(@vue/compiler-dom@3.5.21)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + debug: 4.4.3 fast-glob: 3.3.3 js-yaml: 4.1.0 json5: 2.2.3 @@ -6546,9 +6159,9 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 unplugin: 1.16.1 - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) optionalDependencies: - vue-i18n: 10.0.8(vue@3.5.22(typescript@5.8.3)) + vue-i18n: 10.0.8(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -6558,16 +6171,16 @@ snapshots: '@intlify/utils@0.13.0': {} - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.12)(@vue/compiler-dom@3.5.21)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 optionalDependencies: - '@intlify/shared': 11.1.11 - '@vue/compiler-dom': 3.5.22 - vue: 3.5.22(typescript@5.8.3) - vue-i18n: 10.0.8(vue@3.5.22(typescript@5.8.3)) + '@intlify/shared': 11.1.12 + '@vue/compiler-dom': 3.5.21 + vue: 3.5.21(typescript@5.9.2) + vue-i18n: 10.0.8(vue@3.5.21(typescript@5.9.2)) - '@ioredis/commands@1.3.0': {} + '@ioredis/commands@1.4.0': {} '@isaacs/balanced-match@4.0.1': {} @@ -6579,7 +6192,7 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -6588,44 +6201,42 @@ snapshots: dependencies: minipass: 7.1.2 - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.10': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color '@kwsites/promise-deferred@1.1.1': {} - '@lobomfz/prismark@0.0.3': - dependencies: - '@prisma/generator-helper': 6.13.0 - arktype: 2.1.20 - '@mapbox/node-pre-gyp@2.0.0': dependencies: consola: 3.4.2 - detect-libc: 2.0.4 + detect-libc: 2.1.0 https-proxy-agent: 7.0.6 node-fetch: 2.7.0 nopt: 8.1.0 @@ -6637,11 +6248,11 @@ snapshots: '@mixmark-io/domino@2.2.0': {} - '@miyaneee/rollup-plugin-json5@1.2.0(rollup@4.46.2)': + '@miyaneee/rollup-plugin-json5@1.2.0(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) json5: 2.2.3 - rollup: 4.46.2 + rollup: 4.52.0 '@napi-rs/wasm-runtime@0.2.12': dependencies: @@ -6650,93 +6261,12 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true - '@netlify/binary-info@1.0.0': {} - - '@netlify/blobs@9.1.2': + '@napi-rs/wasm-runtime@1.0.7': dependencies: - '@netlify/dev-utils': 2.2.0 - '@netlify/runtime-utils': 1.3.1 - - '@netlify/dev-utils@2.2.0': - dependencies: - '@whatwg-node/server': 0.9.71 - chokidar: 4.0.3 - decache: 4.6.2 - dot-prop: 9.0.0 - env-paths: 3.0.0 - find-up: 7.0.0 - lodash.debounce: 4.0.8 - netlify: 13.3.5 - parse-gitignore: 2.0.0 - uuid: 11.1.0 - write-file-atomic: 6.0.0 - - '@netlify/functions@3.1.10(rollup@4.46.2)': - dependencies: - '@netlify/blobs': 9.1.2 - '@netlify/dev-utils': 2.2.0 - '@netlify/serverless-functions-api': 1.41.2 - '@netlify/zip-it-and-ship-it': 12.2.1(rollup@4.46.2) - cron-parser: 4.9.0 - decache: 4.6.2 - extract-zip: 2.0.1 - is-stream: 4.0.1 - jwt-decode: 4.0.0 - lambda-local: 2.2.0 - read-package-up: 11.0.0 - source-map-support: 0.5.21 - transitivePeerDependencies: - - encoding - - rollup - - supports-color - - '@netlify/open-api@2.37.0': {} - - '@netlify/runtime-utils@1.3.1': {} - - '@netlify/serverless-functions-api@1.41.2': {} - - '@netlify/serverless-functions-api@2.1.3': {} - - '@netlify/zip-it-and-ship-it@12.2.1(rollup@4.46.2)': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 - '@netlify/binary-info': 1.0.0 - '@netlify/serverless-functions-api': 2.1.3 - '@vercel/nft': 0.29.4(rollup@4.46.2) - archiver: 7.0.1 - common-path-prefix: 3.0.0 - copy-file: 11.0.0 - es-module-lexer: 1.7.0 - esbuild: 0.25.5 - execa: 8.0.1 - fast-glob: 3.3.3 - filter-obj: 6.1.0 - find-up: 7.0.0 - is-builtin-module: 3.2.1 - is-path-inside: 4.0.0 - junk: 4.0.1 - locate-path: 7.2.0 - merge-options: 3.0.4 - minimatch: 9.0.5 - normalize-path: 3.0.0 - p-map: 7.0.3 - path-exists: 5.0.0 - precinct: 12.2.0 - require-package-name: 2.0.1 - resolve: 2.0.0-next.5 - semver: 7.7.2 - tmp-promise: 3.0.3 - toml: 3.0.0 - unixify: 1.0.0 - urlpattern-polyfill: 8.0.2 - yargs: 17.7.2 - zod: 3.25.76 - transitivePeerDependencies: - - encoding - - rollup - - supports-color + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6762,9 +6292,9 @@ snapshots: '@nodelib/fs.scandir': 4.0.1 fastq: 1.19.1 - '@nuxt/cli@3.27.0(magicast@0.3.5)': + '@nuxt/cli@3.28.0(magicast@0.3.5)': dependencies: - c12: 3.2.0(magicast@0.3.5) + c12: 3.3.0(magicast@0.3.5) citty: 0.1.6 clipboardy: 4.0.0 confbox: 0.2.2 @@ -6774,16 +6304,16 @@ snapshots: fuse.js: 7.1.0 get-port-please: 3.2.0 giget: 2.0.0 - h3: 1.15.3 + h3: 1.15.4 httpxy: 0.1.7 jiti: 2.5.1 listhen: 1.9.0 - nypm: 0.6.1 + nypm: 0.6.2 ofetch: 1.4.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + pkg-types: 2.3.0 scule: 1.3.0 semver: 7.7.2 std-env: 3.9.0 @@ -6795,58 +6325,58 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@nuxt/devtools-kit@2.6.4(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/kit': 3.19.2(magicast@0.3.5) execa: 8.0.1 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - magicast - '@nuxt/devtools-wizard@2.6.2': + '@nuxt/devtools-wizard@2.6.4': dependencies: consola: 3.4.2 diff: 8.0.2 execa: 8.0.1 magicast: 0.3.5 pathe: 2.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 prompts: 2.4.2 semver: 7.7.2 - '@nuxt/devtools@2.6.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3))': + '@nuxt/devtools@2.6.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@nuxt/devtools-wizard': 2.6.2 - '@nuxt/kit': 3.18.0(magicast@0.3.5) - '@vue/devtools-core': 7.7.7(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)) + '@nuxt/devtools-kit': 2.6.4(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) + '@nuxt/devtools-wizard': 2.6.4 + '@nuxt/kit': 3.19.2(magicast@0.3.5) + '@vue/devtools-core': 7.7.7(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) '@vue/devtools-kit': 7.7.7 birpc: 2.5.0 consola: 3.4.2 destr: 2.0.5 error-stack-parser-es: 1.0.5 execa: 8.0.1 - fast-npm-meta: 0.4.4 + fast-npm-meta: 0.4.6 get-port-please: 3.2.0 hookable: 5.5.3 image-meta: 0.2.1 is-installed-globally: 1.0.0 - launch-editor: 2.11.0 - local-pkg: 1.1.1 + launch-editor: 2.11.1 + local-pkg: 1.1.2 magicast: 0.3.5 - nypm: 0.6.1 + nypm: 0.6.2 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + pkg-types: 2.3.0 semver: 7.7.2 simple-git: 3.28.0 - sirv: 3.0.1 + sirv: 3.0.2 structured-clone-es: 1.0.0 - tinyglobby: 0.2.14 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vite-plugin-inspect: 11.3.2(@nuxt/kit@3.18.0(magicast@0.3.5))(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - vite-plugin-vue-tracer: 1.0.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)) + tinyglobby: 0.2.15 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) + vite-plugin-vue-tracer: 1.0.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) which: 5.0.0 ws: 8.18.3 transitivePeerDependencies: @@ -6855,30 +6385,30 @@ snapshots: - utf-8-validate - vue - '@nuxt/eslint-config@1.7.1(@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.22)(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3)': + '@nuxt/eslint-config@1.9.0(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 - '@eslint/js': 9.32.0 - '@nuxt/eslint-plugin': 1.7.1(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@stylistic/eslint-plugin': 5.2.2(eslint@9.31.0(jiti@2.5.1)) - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - eslint: 9.31.0(jiti@2.5.1) - eslint-config-flat-gitignore: 2.1.0(eslint@9.31.0(jiti@2.5.1)) - eslint-flat-config-utils: 2.1.1 - eslint-merge-processors: 2.0.0(eslint@9.31.0(jiti@2.5.1)) - eslint-plugin-import-lite: 0.3.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.31.0(jiti@2.5.1)) - eslint-plugin-jsdoc: 51.4.1(eslint@9.31.0(jiti@2.5.1)) - eslint-plugin-regexp: 2.9.0(eslint@9.31.0(jiti@2.5.1)) - eslint-plugin-unicorn: 60.0.0(eslint@9.31.0(jiti@2.5.1)) - eslint-plugin-vue: 10.4.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.31.0(jiti@2.5.1))(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.5.1))) - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.22)(eslint@9.31.0(jiti@2.5.1)) - globals: 16.3.0 - local-pkg: 1.1.1 + '@eslint/js': 9.36.0 + '@nuxt/eslint-plugin': 1.9.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@stylistic/eslint-plugin': 5.4.0(eslint@9.36.0(jiti@2.5.1)) + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.5.1) + eslint-config-flat-gitignore: 2.1.0(eslint@9.36.0(jiti@2.5.1)) + eslint-flat-config-utils: 2.1.4 + eslint-merge-processors: 2.0.0(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-import-lite: 0.3.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-jsdoc: 54.7.0(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-regexp: 2.10.0(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-unicorn: 60.0.0(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-vue: 10.4.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.5.1))) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1)) + globals: 16.4.0 + local-pkg: 1.1.2 pathe: 2.0.3 - vue-eslint-parser: 10.2.0(eslint@9.31.0(jiti@2.5.1)) + vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/utils' - '@vue/compiler-sfc' @@ -6886,31 +6416,31 @@ snapshots: - supports-color - typescript - '@nuxt/eslint-plugin@1.7.1(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3)': + '@nuxt/eslint-plugin@1.9.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - eslint: 9.31.0(jiti@2.5.1) + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.5.1) transitivePeerDependencies: - supports-color - typescript - '@nuxt/eslint@1.7.1(@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.22)(eslint@9.31.0(jiti@2.5.1))(magicast@0.3.5)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@nuxt/eslint@1.9.0(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@eslint/config-inspector': 1.1.0(eslint@9.31.0(jiti@2.5.1)) - '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@nuxt/eslint-config': 1.7.1(@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.22)(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@nuxt/eslint-plugin': 1.7.1(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@nuxt/kit': 4.0.2(magicast@0.3.5) + '@eslint/config-inspector': 1.3.0(eslint@9.36.0(jiti@2.5.1)) + '@nuxt/devtools-kit': 2.6.4(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) + '@nuxt/eslint-config': 1.9.0(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@nuxt/eslint-plugin': 1.9.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@nuxt/kit': 4.1.2(magicast@0.3.5) chokidar: 4.0.3 - eslint: 9.31.0(jiti@2.5.1) - eslint-flat-config-utils: 2.1.1 - eslint-typegen: 2.3.0(eslint@9.31.0(jiti@2.5.1)) + eslint: 9.36.0(jiti@2.5.1) + eslint-flat-config-utils: 2.1.4 + eslint-typegen: 2.3.0(eslint@9.36.0(jiti@2.5.1)) find-up: 7.0.0 get-port-please: 3.2.0 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 - unimport: 5.2.0 + unimport: 5.3.0 transitivePeerDependencies: - '@typescript-eslint/utils' - '@vue/compiler-sfc' @@ -6923,28 +6453,28 @@ snapshots: - utf-8-validate - vite - '@nuxt/fonts@0.11.4(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@nuxt/fonts@0.11.4(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/devtools-kit': 2.6.4(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) + '@nuxt/kit': 3.19.2(magicast@0.3.5) consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 - esbuild: 0.25.8 + esbuild: 0.25.10 fontaine: 0.6.0 - h3: 1.15.3 + h3: 1.15.4 jiti: 2.5.1 magic-regexp: 0.10.0 - magic-string: 0.30.17 - node-fetch-native: 1.6.6 + magic-string: 0.30.19 + node-fetch-native: 1.6.7 ohash: 2.0.11 pathe: 2.0.3 - sirv: 3.0.1 - tinyglobby: 0.2.14 + sirv: 3.0.2 + tinyglobby: 0.2.15 ufo: 1.6.1 unifont: 0.4.1 - unplugin: 2.3.5 - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) + unplugin: 2.3.10 + unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6958,6 +6488,7 @@ snapshots: - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - db0 @@ -6968,12 +6499,12 @@ snapshots: - uploadthing - vite - '@nuxt/image@1.10.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5)': + '@nuxt/image@1.11.0(db0@0.3.2)(ioredis@5.7.0)(magicast@0.3.5)': dependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/kit': 3.19.2(magicast@0.3.5) consola: 3.4.2 defu: 6.1.4 - h3: 1.15.3 + h3: 1.15.4 image-meta: 0.2.1 knitwork: 1.2.0 ohash: 2.0.11 @@ -6981,7 +6512,7 @@ snapshots: std-env: 3.9.0 ufo: 1.6.1 optionalDependencies: - ipx: 2.1.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) + ipx: 2.1.1(db0@0.3.2)(ioredis@5.7.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6995,6 +6526,7 @@ snapshots: - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - bare-buffer @@ -7002,11 +6534,12 @@ snapshots: - idb-keyval - ioredis - magicast + - react-native-b4a - uploadthing - '@nuxt/kit@3.17.7(magicast@0.3.5)': + '@nuxt/kit@3.19.2(magicast@0.3.5)': dependencies: - c12: 3.2.0(magicast@0.3.5) + c12: 3.3.0(magicast@0.3.5) consola: 3.4.2 defu: 6.1.4 destr: 2.0.5 @@ -7016,24 +6549,25 @@ snapshots: jiti: 2.5.1 klona: 2.0.6 knitwork: 1.2.0 - mlly: 1.7.4 + mlly: 1.8.0 ohash: 2.0.11 pathe: 2.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 + rc9: 2.1.2 scule: 1.3.0 semver: 7.7.2 std-env: 3.9.0 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 ufo: 1.6.1 unctx: 2.4.1 - unimport: 5.2.0 + unimport: 5.3.0 untyped: 2.0.0 transitivePeerDependencies: - magicast - '@nuxt/kit@3.18.0(magicast@0.3.5)': + '@nuxt/kit@4.1.2(magicast@0.3.5)': dependencies: - c12: 3.2.0(magicast@0.3.5) + c12: 3.3.0(magicast@0.3.5) consola: 3.4.2 defu: 6.1.4 destr: 2.0.5 @@ -7042,59 +6576,35 @@ snapshots: ignore: 7.0.5 jiti: 2.5.1 klona: 2.0.6 - knitwork: 1.2.0 - mlly: 1.7.4 + mlly: 1.8.0 ohash: 2.0.11 pathe: 2.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 + rc9: 2.1.2 scule: 1.3.0 semver: 7.7.2 std-env: 3.9.0 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 ufo: 1.6.1 unctx: 2.4.1 - unimport: 5.2.0 + unimport: 5.3.0 untyped: 2.0.0 transitivePeerDependencies: - magicast - '@nuxt/kit@4.0.2(magicast@0.3.5)': + '@nuxt/schema@4.1.2': dependencies: - c12: 3.2.0(magicast@0.3.5) + '@vue/shared': 3.5.21 consola: 3.4.2 defu: 6.1.4 - destr: 2.0.5 - errx: 0.1.0 - exsolve: 1.0.7 - ignore: 7.0.5 - jiti: 2.5.1 - klona: 2.0.6 - mlly: 1.7.4 - ohash: 2.0.11 pathe: 2.0.3 - pkg-types: 2.2.0 - scule: 1.3.0 - semver: 7.7.2 + pkg-types: 2.3.0 std-env: 3.9.0 - tinyglobby: 0.2.14 ufo: 1.6.1 - unctx: 2.4.1 - unimport: 5.2.0 - untyped: 2.0.0 - transitivePeerDependencies: - - magicast - - '@nuxt/schema@3.17.7': - dependencies: - '@vue/shared': 3.5.18 - consola: 3.4.2 - defu: 6.1.4 - pathe: 2.0.3 - std-env: 3.9.0 '@nuxt/telemetry@2.6.6(magicast@0.3.5)': dependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/kit': 3.19.2(magicast@0.3.5) citty: 0.1.6 consola: 3.4.2 destr: 2.0.5 @@ -7109,40 +6619,37 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/vite-builder@3.17.7(@types/node@22.16.5)(eslint@9.31.0(jiti@2.5.1))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vue-tsc@3.0.4(typescript@5.8.3))(vue@3.5.22(typescript@5.8.3))(yaml@2.8.0)': + '@nuxt/vite-builder@4.1.2(@types/node@22.18.6)(eslint@9.36.0(jiti@2.5.1))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.7(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1)': dependencies: - '@nuxt/kit': 3.17.7(magicast@0.3.5) - '@rollup/plugin-replace': 6.0.2(rollup@4.46.2) - '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)) + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) + '@vitejs/plugin-vue': 6.0.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vitejs/plugin-vue-jsx': 5.1.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) autoprefixer: 10.4.21(postcss@8.5.6) consola: 3.4.2 - cssnano: 7.1.0(postcss@8.5.6) + cssnano: 7.1.1(postcss@8.5.6) defu: 6.1.4 - esbuild: 0.25.8 + esbuild: 0.25.10 escape-string-regexp: 5.0.0 exsolve: 1.0.7 - externality: 1.0.2 get-port-please: 3.2.0 - h3: 1.15.3 + h3: 1.15.4 jiti: 2.5.1 knitwork: 1.2.0 - magic-string: 0.30.17 - mlly: 1.7.4 + magic-string: 0.30.19 + mlly: 1.8.0 mocked-exports: 0.1.1 - ohash: 2.0.11 pathe: 2.0.3 - perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + pkg-types: 2.3.0 postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.3(rollup@4.46.2) + rollup-plugin-visualizer: 6.0.3(rollup@4.52.0) std-env: 3.9.0 ufo: 1.6.1 - unenv: 2.0.0-rc.19 - vite: 6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vite-plugin-checker: 0.10.1(eslint@9.31.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3)) - vue: 3.5.22(typescript@5.8.3) + unenv: 2.0.0-rc.21 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-checker: 0.10.3(eslint@9.36.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2)) + vue: 3.5.21(typescript@5.9.2) vue-bundle-renderer: 2.1.2 transitivePeerDependencies: - '@biomejs/biome' @@ -7169,33 +6676,33 @@ snapshots: - vue-tsc - yaml - '@nuxtjs/i18n@9.5.6(@vue/compiler-dom@3.5.22)(eslint@9.31.0(jiti@2.5.1))(magicast@0.3.5)(rollup@4.46.2)(vue@3.5.22(typescript@5.8.3))': + '@nuxtjs/i18n@9.5.6(@vue/compiler-dom@3.5.21)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2))': dependencies: '@intlify/h3': 0.6.1 '@intlify/shared': 10.0.8 - '@intlify/unplugin-vue-i18n': 6.0.8(@vue/compiler-dom@3.5.22)(eslint@9.31.0(jiti@2.5.1))(rollup@4.46.2)(typescript@5.8.3)(vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)) + '@intlify/unplugin-vue-i18n': 6.0.8(@vue/compiler-dom@3.5.21)(eslint@9.36.0(jiti@2.5.1))(rollup@4.52.0)(typescript@5.9.2)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)) '@intlify/utils': 0.13.0 - '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.46.2) - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.52.0) + '@nuxt/kit': 3.19.2(magicast@0.3.5) '@oxc-parser/wasm': 0.60.0 - '@rollup/plugin-yaml': 4.1.2(rollup@4.46.2) - '@vue/compiler-sfc': 3.5.18 - debug: 4.4.1 + '@rollup/plugin-yaml': 4.1.2(rollup@4.52.0) + '@vue/compiler-sfc': 3.5.21 + debug: 4.4.3 defu: 6.1.4 - esbuild: 0.25.8 + esbuild: 0.25.10 estree-walker: 3.0.3 - h3: 1.15.3 + h3: 1.15.4 knitwork: 1.2.0 - magic-string: 0.30.17 - mlly: 1.7.4 + magic-string: 0.30.19 + mlly: 1.8.0 oxc-parser: 0.70.0 pathe: 2.0.3 - typescript: 5.8.3 + typescript: 5.9.2 ufo: 1.6.1 - unplugin: 2.3.5 - unplugin-vue-router: 0.12.0(vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)) - vue-i18n: 10.0.8(vue@3.5.22(typescript@5.8.3)) - vue-router: 4.5.1(vue@3.5.22(typescript@5.8.3)) + unplugin: 2.3.10 + unplugin-vue-router: 0.12.0(vue-router@4.5.1(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)) + vue-i18n: 10.0.8(vue@3.5.21(typescript@5.9.2)) + vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -7205,73 +6712,120 @@ snapshots: - supports-color - vue - '@oxc-parser/binding-android-arm64@0.76.0': + '@oxc-minify/binding-android-arm64@0.87.0': + optional: true + + '@oxc-minify/binding-darwin-arm64@0.87.0': + optional: true + + '@oxc-minify/binding-darwin-x64@0.87.0': + optional: true + + '@oxc-minify/binding-freebsd-x64@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm-gnueabihf@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm-musleabihf@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm64-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm64-musl@0.87.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-s390x-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-x64-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-x64-musl@0.87.0': + optional: true + + '@oxc-minify/binding-wasm32-wasi@0.87.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-minify/binding-win32-arm64-msvc@0.87.0': + optional: true + + '@oxc-minify/binding-win32-x64-msvc@0.87.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.87.0': optional: true '@oxc-parser/binding-darwin-arm64@0.70.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.76.0': + '@oxc-parser/binding-darwin-arm64@0.87.0': optional: true '@oxc-parser/binding-darwin-x64@0.70.0': optional: true - '@oxc-parser/binding-darwin-x64@0.76.0': + '@oxc-parser/binding-darwin-x64@0.87.0': optional: true '@oxc-parser/binding-freebsd-x64@0.70.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.76.0': + '@oxc-parser/binding-freebsd-x64@0.87.0': optional: true '@oxc-parser/binding-linux-arm-gnueabihf@0.70.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.76.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.87.0': optional: true '@oxc-parser/binding-linux-arm-musleabihf@0.70.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.76.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.87.0': optional: true '@oxc-parser/binding-linux-arm64-gnu@0.70.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.76.0': + '@oxc-parser/binding-linux-arm64-gnu@0.87.0': optional: true '@oxc-parser/binding-linux-arm64-musl@0.70.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.76.0': + '@oxc-parser/binding-linux-arm64-musl@0.87.0': optional: true '@oxc-parser/binding-linux-riscv64-gnu@0.70.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.76.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.87.0': optional: true '@oxc-parser/binding-linux-s390x-gnu@0.70.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.76.0': + '@oxc-parser/binding-linux-s390x-gnu@0.87.0': optional: true '@oxc-parser/binding-linux-x64-gnu@0.70.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.76.0': + '@oxc-parser/binding-linux-x64-gnu@0.87.0': optional: true '@oxc-parser/binding-linux-x64-musl@0.70.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.76.0': + '@oxc-parser/binding-linux-x64-musl@0.87.0': optional: true '@oxc-parser/binding-wasm32-wasi@0.70.0': @@ -7279,21 +6833,21 @@ snapshots: '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@oxc-parser/binding-wasm32-wasi@0.76.0': + '@oxc-parser/binding-wasm32-wasi@0.87.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@napi-rs/wasm-runtime': 1.0.7 optional: true '@oxc-parser/binding-win32-arm64-msvc@0.70.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.76.0': + '@oxc-parser/binding-win32-arm64-msvc@0.87.0': optional: true '@oxc-parser/binding-win32-x64-msvc@0.70.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.76.0': + '@oxc-parser/binding-win32-x64-msvc@0.87.0': optional: true '@oxc-parser/wasm@0.60.0': @@ -7304,7 +6858,54 @@ snapshots: '@oxc-project/types@0.70.0': {} - '@oxc-project/types@0.76.0': {} + '@oxc-project/types@0.87.0': {} + + '@oxc-transform/binding-android-arm64@0.87.0': + optional: true + + '@oxc-transform/binding-darwin-arm64@0.87.0': + optional: true + + '@oxc-transform/binding-darwin-x64@0.87.0': + optional: true + + '@oxc-transform/binding-freebsd-x64@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm-gnueabihf@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm-musleabihf@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm64-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm64-musl@0.87.0': + optional: true + + '@oxc-transform/binding-linux-riscv64-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-s390x-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-x64-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-x64-musl@0.87.0': + optional: true + + '@oxc-transform/binding-wasm32-wasi@0.87.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-transform/binding-win32-arm64-msvc@0.87.0': + optional: true + + '@oxc-transform/binding-win32-x64-msvc@0.87.0': + optional: true '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -7387,197 +6988,200 @@ snapshots: '@poppinss/dumper@0.6.4': dependencies: '@poppinss/colors': 4.1.5 - '@sindresorhus/is': 7.0.2 - supports-color: 10.0.0 + '@sindresorhus/is': 7.1.0 + supports-color: 10.2.2 '@poppinss/exception@1.2.2': {} - '@prisma/client@6.12.0(prisma@6.12.0(typescript@5.8.3))(typescript@5.8.3)': + '@prisma/client@6.16.2(prisma@6.16.2(magicast@0.3.5)(typescript@5.9.2))(typescript@5.9.2)': optionalDependencies: - prisma: 6.12.0(typescript@5.8.3) - typescript: 5.8.3 + prisma: 6.16.2(magicast@0.3.5)(typescript@5.9.2) + typescript: 5.9.2 - '@prisma/config@6.12.0': + '@prisma/config@6.16.2(magicast@0.3.5)': dependencies: - jiti: 2.4.2 + c12: 3.1.0(magicast@0.3.5) + deepmerge-ts: 7.1.5 + effect: 3.16.12 + empathic: 2.0.0 + transitivePeerDependencies: + - magicast - '@prisma/debug@6.12.0': {} + '@prisma/debug@6.16.2': {} - '@prisma/debug@6.13.0': {} + '@prisma/engines-version@6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43': {} - '@prisma/dmmf@6.13.0': {} - - '@prisma/engines-version@6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc': {} - - '@prisma/engines@6.12.0': + '@prisma/engines@6.16.2': dependencies: - '@prisma/debug': 6.12.0 - '@prisma/engines-version': 6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc - '@prisma/fetch-engine': 6.12.0 - '@prisma/get-platform': 6.12.0 + '@prisma/debug': 6.16.2 + '@prisma/engines-version': 6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43 + '@prisma/fetch-engine': 6.16.2 + '@prisma/get-platform': 6.16.2 - '@prisma/fetch-engine@6.12.0': + '@prisma/fetch-engine@6.16.2': dependencies: - '@prisma/debug': 6.12.0 - '@prisma/engines-version': 6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc - '@prisma/get-platform': 6.12.0 + '@prisma/debug': 6.16.2 + '@prisma/engines-version': 6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43 + '@prisma/get-platform': 6.16.2 - '@prisma/generator-helper@6.13.0': + '@prisma/get-platform@6.16.2': dependencies: - '@prisma/debug': 6.13.0 - '@prisma/dmmf': 6.13.0 - '@prisma/generator': 6.13.0 - - '@prisma/generator@6.13.0': {} - - '@prisma/get-platform@6.12.0': - dependencies: - '@prisma/debug': 6.12.0 + '@prisma/debug': 6.16.2 '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rollup/plugin-alias@5.1.1(rollup@4.46.2)': - optionalDependencies: - rollup: 4.46.2 + '@rolldown/pluginutils@1.0.0-beta.38': {} - '@rollup/plugin-commonjs@28.0.6(rollup@4.46.2)': + '@rollup/plugin-alias@5.1.1(rollup@4.52.0)': + optionalDependencies: + rollup: 4.52.0 + + '@rollup/plugin-commonjs@28.0.6(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/plugin-inject@5.0.5(rollup@4.46.2)': + '@rollup/plugin-inject@5.0.5(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) estree-walker: 2.0.2 - magic-string: 0.30.17 + magic-string: 0.30.19 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/plugin-json@6.1.0(rollup@4.46.2)': + '@rollup/plugin-json@6.1.0(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.2)': + '@rollup/plugin-node-resolve@16.0.1(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/plugin-replace@6.0.2(rollup@4.46.2)': + '@rollup/plugin-replace@6.0.2(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) - magic-string: 0.30.17 + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + magic-string: 0.30.19 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/plugin-terser@0.4.4(rollup@4.46.2)': + '@rollup/plugin-terser@0.4.4(rollup@4.52.0)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.43.1 + terser: 5.44.0 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/plugin-yaml@4.1.2(rollup@4.46.2)': + '@rollup/plugin-yaml@4.1.2(rollup@4.52.0)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) js-yaml: 4.1.0 tosource: 2.0.0-alpha.3 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/pluginutils@5.2.0(rollup@4.46.2)': + '@rollup/pluginutils@5.3.0(rollup@4.52.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - '@rollup/rollup-android-arm-eabi@4.46.2': + '@rollup/rollup-android-arm-eabi@4.52.0': optional: true - '@rollup/rollup-android-arm64@4.46.2': + '@rollup/rollup-android-arm64@4.52.0': optional: true - '@rollup/rollup-darwin-arm64@4.46.2': + '@rollup/rollup-darwin-arm64@4.52.0': optional: true - '@rollup/rollup-darwin-x64@4.46.2': + '@rollup/rollup-darwin-x64@4.52.0': optional: true - '@rollup/rollup-freebsd-arm64@4.46.2': + '@rollup/rollup-freebsd-arm64@4.52.0': optional: true - '@rollup/rollup-freebsd-x64@4.46.2': + '@rollup/rollup-freebsd-x64@4.52.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.46.2': + '@rollup/rollup-linux-arm-musleabihf@4.52.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.46.2': + '@rollup/rollup-linux-arm64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.46.2': + '@rollup/rollup-linux-arm64-musl@4.52.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + '@rollup/rollup-linux-loong64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.46.2': + '@rollup/rollup-linux-ppc64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.46.2': + '@rollup/rollup-linux-riscv64-musl@4.52.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.46.2': + '@rollup/rollup-linux-s390x-gnu@4.52.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.46.2': + '@rollup/rollup-linux-x64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-x64-musl@4.46.2': + '@rollup/rollup-linux-x64-musl@4.52.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.46.2': + '@rollup/rollup-openharmony-arm64@4.52.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.46.2': + '@rollup/rollup-win32-arm64-msvc@4.52.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.46.2': + '@rollup/rollup-win32-ia32-msvc@4.52.0': optional: true - '@sindresorhus/is@7.0.2': {} + '@rollup/rollup-win32-x64-gnu@4.52.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.0': + optional: true + + '@sindresorhus/is@7.1.0': {} '@sindresorhus/merge-streams@2.3.0': {} '@speed-highlight/core@1.2.7': {} - '@stylistic/eslint-plugin@5.2.2(eslint@9.31.0(jiti@2.5.1))': + '@standard-schema/spec@1.0.0': {} + + '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.5.1))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.38.0 - eslint: 9.31.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@typescript-eslint/types': 8.44.0 + eslint: 9.36.0(jiti@2.5.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -7587,96 +7191,93 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/forms@0.5.10(tailwindcss@4.1.11)': + '@tailwindcss/forms@0.5.10(tailwindcss@4.1.13)': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 4.1.11 + tailwindcss: 4.1.13 - '@tailwindcss/node@4.1.11': + '@tailwindcss/node@4.1.13': dependencies: - '@ampproject/remapping': 2.3.0 - enhanced-resolve: 5.18.2 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 jiti: 2.5.1 lightningcss: 1.30.1 - magic-string: 0.30.17 + magic-string: 0.30.19 source-map-js: 1.2.1 - tailwindcss: 4.1.11 + tailwindcss: 4.1.13 - '@tailwindcss/oxide-android-arm64@4.1.11': + '@tailwindcss/oxide-android-arm64@4.1.13': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.11': + '@tailwindcss/oxide-darwin-arm64@4.1.13': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.11': + '@tailwindcss/oxide-darwin-x64@4.1.13': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.11': + '@tailwindcss/oxide-freebsd-x64@4.1.13': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.13': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + '@tailwindcss/oxide-linux-arm64-musl@4.1.13': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + '@tailwindcss/oxide-linux-x64-gnu@4.1.13': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.11': + '@tailwindcss/oxide-linux-x64-musl@4.1.13': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.11': + '@tailwindcss/oxide-wasm32-wasi@4.1.13': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.13': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + '@tailwindcss/oxide-win32-x64-msvc@4.1.13': optional: true - '@tailwindcss/oxide@4.1.11': + '@tailwindcss/oxide@4.1.13': dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.0 tar: 7.4.3 optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-x64': 4.1.11 - '@tailwindcss/oxide-freebsd-x64': 4.1.11 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-x64-musl': 4.1.11 - '@tailwindcss/oxide-wasm32-wasi': 4.1.11 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + '@tailwindcss/oxide-android-arm64': 4.1.13 + '@tailwindcss/oxide-darwin-arm64': 4.1.13 + '@tailwindcss/oxide-darwin-x64': 4.1.13 + '@tailwindcss/oxide-freebsd-x64': 4.1.13 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.13 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.13 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.13 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.13 + '@tailwindcss/oxide-linux-x64-musl': 4.1.13 + '@tailwindcss/oxide-wasm32-wasi': 4.1.13 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.13 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.13 - '@tailwindcss/typography@0.5.16(tailwindcss@4.1.11)': + '@tailwindcss/typography@0.5.18(tailwindcss@4.1.13)': dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.11 + tailwindcss: 4.1.13 - '@tailwindcss/vite@4.1.11(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@tailwindcss/vite@4.1.13(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@tailwindcss/node': 4.1.11 - '@tailwindcss/oxide': 4.1.11 - tailwindcss: 4.1.11 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + '@tailwindcss/node': 4.1.13 + '@tailwindcss/oxide': 4.1.13 + tailwindcss: 4.1.13 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) '@tanstack/virtual-core@3.13.12': {} - '@tanstack/vue-virtual@3.13.12(vue@3.5.22(typescript@5.8.3))': + '@tanstack/vue-virtual@3.13.12(vue@3.5.21(typescript@5.9.2))': dependencies: '@tanstack/virtual-core': 3.13.12 - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) '@tokenizer/token@0.3.0': {} @@ -7690,9 +7291,10 @@ snapshots: tslib: 2.8.1 optional: true - '@types/bcryptjs@3.0.0': + '@tybys/wasm-util@0.10.1': dependencies: - bcryptjs: 3.0.2 + tslib: 2.8.1 + optional: true '@types/debug@4.1.12': dependencies: @@ -7700,135 +7302,134 @@ snapshots: '@types/estree@1.0.8': {} + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 22.18.6 + '@types/tough-cookie': 4.0.5 + parse5: 7.3.0 + '@types/json-schema@7.0.15': {} - '@types/luxon@3.6.2': {} + '@types/luxon@3.7.1': {} '@types/ms@2.1.0': {} - '@types/node@22.16.5': + '@types/node@22.18.6': dependencies: undici-types: 6.21.0 - '@types/normalize-package-data@2.4.4': {} - '@types/parse-path@7.1.0': dependencies: parse-path: 7.1.0 '@types/resolve@1.20.2': {} - '@types/semver@7.7.0': {} + '@types/semver@7.7.1': {} - '@types/triple-beam@1.3.5': {} + '@types/tough-cookie@4.0.5': {} '@types/turndown@5.0.5': {} '@types/web-bluetooth@0.0.21': {} - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 22.16.5 - optional: true - - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - eslint: 9.31.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/type-utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + eslint: 9.36.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1 - eslint: 9.31.0(jiti@2.5.1) - typescript: 5.8.3 + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 + eslint: 9.36.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - debug: 4.4.1 - typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) + '@typescript-eslint/types': 8.44.0 + debug: 4.4.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.38.0': + '@typescript-eslint/scope-manager@8.44.0': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) - debug: 4.4.1 - eslint: 9.31.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + debug: 4.4.3 + eslint: 9.36.0(jiti@2.5.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.38.0': {} + '@typescript-eslint/types@8.44.0': {} - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1 + '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - eslint: 9.31.0(jiti@2.5.1) - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + eslint: 9.36.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.38.0': + '@typescript-eslint/visitor-keys@8.44.0': dependencies: - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/types': 8.44.0 eslint-visitor-keys: 4.2.1 - '@unhead/vue@2.0.13(vue@3.5.22(typescript@5.8.3))': + '@unhead/vue@2.0.17(vue@3.5.21(typescript@5.9.2))': dependencies: hookable: 5.5.3 - unhead: 2.0.13 - vue: 3.5.22(typescript@5.8.3) + unhead: 2.0.17 + vue: 3.5.21(typescript@5.9.2) '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -7889,10 +7490,10 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vercel/nft@0.29.4(rollup@4.46.2)': + '@vercel/nft@0.30.1(rollup@4.52.0)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -7908,143 +7509,115 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3))': + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.29 - '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0) - vite: 6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vue: 3.5.22(typescript@5.8.3) + '@babel/core': 7.28.4 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.38 + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: - vite: 6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vue: 3.5.22(typescript@5.8.3) + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) - '@volar/language-core@2.4.20': + '@volar/language-core@2.4.23': dependencies: - '@volar/source-map': 2.4.20 + '@volar/source-map': 2.4.23 - '@volar/source-map@2.4.20': {} + '@volar/source-map@2.4.23': {} - '@volar/typescript@2.4.20': + '@volar/typescript@2.4.23': dependencies: - '@volar/language-core': 2.4.20 + '@volar/language-core': 2.4.23 path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue-macros/common@1.16.1(vue@3.5.22(typescript@5.8.3))': + '@vue-macros/common@1.16.1(vue@3.5.21(typescript@5.9.2))': dependencies: - '@vue/compiler-sfc': 3.5.18 + '@vue/compiler-sfc': 3.5.21 ast-kit: 1.4.3 - local-pkg: 1.1.1 + local-pkg: 1.1.2 magic-string-ast: 0.7.1 pathe: 2.0.3 picomatch: 4.0.3 optionalDependencies: - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - '@vue-macros/common@3.0.0-beta.15(vue@3.5.22(typescript@5.8.3))': + '@vue-macros/common@3.0.0-beta.16(vue@3.5.21(typescript@5.9.2))': dependencies: - '@vue/compiler-sfc': 3.5.22 - ast-kit: 2.1.1 - local-pkg: 1.1.1 - magic-string-ast: 1.0.0 - unplugin-utils: 0.2.4 + '@vue/compiler-sfc': 3.5.21 + ast-kit: 2.1.2 + local-pkg: 1.1.2 + magic-string-ast: 1.0.2 + unplugin-utils: 0.2.5 optionalDependencies: - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - '@vue/babel-helper-vue-transform-on@1.4.0': {} + '@vue/babel-helper-vue-transform-on@1.5.0': {} - '@vue/babel-plugin-jsx@1.4.0(@babel/core@7.28.0)': + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.4)': dependencies: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 - '@vue/babel-helper-vue-transform-on': 1.4.0 - '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.28.0) - '@vue/shared': 3.5.18 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.4) + '@vue/shared': 3.5.21 optionalDependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.4.0(@babel/core@7.28.0)': + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.4)': dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/parser': 7.28.4 - '@vue/compiler-sfc': 3.5.22 + '@vue/compiler-sfc': 3.5.21 transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.18': + '@vue/compiler-core@3.5.21': dependencies: - '@babel/parser': 7.28.0 - '@vue/shared': 3.5.18 + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.21 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-core@3.5.22': + '@vue/compiler-dom@3.5.21': + dependencies: + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 + + '@vue/compiler-sfc@3.5.21': dependencies: '@babel/parser': 7.28.4 - '@vue/shared': 3.5.22 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.18': - dependencies: - '@vue/compiler-core': 3.5.18 - '@vue/shared': 3.5.18 - - '@vue/compiler-dom@3.5.22': - dependencies: - '@vue/compiler-core': 3.5.22 - '@vue/shared': 3.5.22 - - '@vue/compiler-sfc@3.5.18': - dependencies: - '@babel/parser': 7.28.0 - '@vue/compiler-core': 3.5.18 - '@vue/compiler-dom': 3.5.18 - '@vue/compiler-ssr': 3.5.18 - '@vue/shared': 3.5.18 - estree-walker: 2.0.2 - magic-string: 0.30.17 - postcss: 8.5.6 - source-map-js: 1.2.1 - - '@vue/compiler-sfc@3.5.22': - dependencies: - '@babel/parser': 7.28.4 - '@vue/compiler-core': 3.5.22 - '@vue/compiler-dom': 3.5.22 - '@vue/compiler-ssr': 3.5.22 - '@vue/shared': 3.5.22 + '@vue/compiler-core': 3.5.21 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-ssr': 3.5.21 + '@vue/shared': 3.5.21 estree-walker: 2.0.2 magic-string: 0.30.19 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.18': + '@vue/compiler-ssr@3.5.21': dependencies: - '@vue/compiler-dom': 3.5.18 - '@vue/shared': 3.5.18 - - '@vue/compiler-ssr@3.5.22': - dependencies: - '@vue/compiler-dom': 3.5.22 - '@vue/shared': 3.5.22 + '@vue/compiler-dom': 3.5.21 + '@vue/shared': 3.5.21 '@vue/compiler-vue2@2.7.16': dependencies: @@ -8053,15 +7626,15 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.7.7(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3))': + '@vue/devtools-core@7.7.7(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - vue: 3.5.22(typescript@5.8.3) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) + vue: 3.5.21(typescript@5.9.2) transitivePeerDependencies: - vite @@ -8079,96 +7652,66 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/language-core@3.0.4(typescript@5.8.3)': + '@vue/language-core@3.0.7(typescript@5.9.2)': dependencies: - '@volar/language-core': 2.4.20 - '@vue/compiler-dom': 3.5.18 + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.21 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.18 - alien-signals: 2.0.5 + '@vue/shared': 3.5.21 + alien-signals: 2.0.7 muggle-string: 0.4.1 path-browserify: 1.0.1 picomatch: 4.0.3 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@vue/reactivity@3.5.22': + '@vue/reactivity@3.5.21': dependencies: - '@vue/shared': 3.5.22 + '@vue/shared': 3.5.21 - '@vue/runtime-core@3.5.22': + '@vue/runtime-core@3.5.21': dependencies: - '@vue/reactivity': 3.5.22 - '@vue/shared': 3.5.22 + '@vue/reactivity': 3.5.21 + '@vue/shared': 3.5.21 - '@vue/runtime-dom@3.5.22': + '@vue/runtime-dom@3.5.21': dependencies: - '@vue/reactivity': 3.5.22 - '@vue/runtime-core': 3.5.22 - '@vue/shared': 3.5.22 + '@vue/reactivity': 3.5.21 + '@vue/runtime-core': 3.5.21 + '@vue/shared': 3.5.21 csstype: 3.1.3 - '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.8.3))': + '@vue/server-renderer@3.5.21(vue@3.5.21(typescript@5.9.2))': dependencies: - '@vue/compiler-ssr': 3.5.22 - '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.8.3) + '@vue/compiler-ssr': 3.5.21 + '@vue/shared': 3.5.21 + vue: 3.5.21(typescript@5.9.2) - '@vue/shared@3.5.18': {} + '@vue/shared@3.5.21': {} - '@vue/shared@3.5.22': {} - - '@vueuse/core@13.6.0(vue@3.5.22(typescript@5.8.3))': + '@vueuse/core@13.6.0(vue@3.5.21(typescript@5.9.2))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 13.6.0 - '@vueuse/shared': 13.6.0(vue@3.5.22(typescript@5.8.3)) - vue: 3.5.22(typescript@5.8.3) + '@vueuse/shared': 13.6.0(vue@3.5.21(typescript@5.9.2)) + vue: 3.5.21(typescript@5.9.2) '@vueuse/metadata@13.6.0': {} - '@vueuse/nuxt@13.6.0(magicast@0.3.5)(nuxt@3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.16.5)(@vue/compiler-sfc@3.5.22)(db0@0.3.2)(eslint@9.31.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3))(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3))': + '@vueuse/nuxt@13.6.0(magicast@0.3.5)(nuxt@4.1.2(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@nuxt/kit': 4.0.2(magicast@0.3.5) - '@vueuse/core': 13.6.0(vue@3.5.22(typescript@5.8.3)) + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@vueuse/core': 13.6.0(vue@3.5.21(typescript@5.9.2)) '@vueuse/metadata': 13.6.0 - local-pkg: 1.1.1 - nuxt: 3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.16.5)(@vue/compiler-sfc@3.5.22)(db0@0.3.2)(eslint@9.31.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3))(yaml@2.8.0) - vue: 3.5.22(typescript@5.8.3) + local-pkg: 1.1.2 + nuxt: 4.1.2(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) transitivePeerDependencies: - magicast - '@vueuse/shared@13.6.0(vue@3.5.22(typescript@5.8.3))': + '@vueuse/shared@13.6.0(vue@3.5.21(typescript@5.9.2))': dependencies: - vue: 3.5.22(typescript@5.8.3) - - '@whatwg-node/disposablestack@0.0.6': - dependencies: - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 - - '@whatwg-node/fetch@0.10.10': - dependencies: - '@whatwg-node/node-fetch': 0.7.25 - urlpattern-polyfill: 10.1.0 - - '@whatwg-node/node-fetch@0.7.25': - dependencies: - '@fastify/busboy': 3.1.1 - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 - - '@whatwg-node/promise-helpers@1.3.2': - dependencies: - tslib: 2.8.1 - - '@whatwg-node/server@0.9.71': - dependencies: - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/fetch': 0.10.10 - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + vue: 3.5.21(typescript@5.9.2) abbrev@3.0.1: {} @@ -8195,17 +7738,17 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alien-signals@2.0.5: {} + alien-signals@2.0.7: {} ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} ansis@4.1.0: {} @@ -8233,6 +7776,8 @@ snapshots: readdir-glob: 1.1.3 tar-stream: 3.1.7 zip-stream: 6.0.1 + transitivePeerDependencies: + - react-native-b4a are-docs-informative@0.0.2: {} @@ -8244,32 +7789,30 @@ snapshots: argparse@2.0.1: {} - arktype@2.1.20: + arktype@2.1.22: dependencies: - '@ark/schema': 0.46.0 - '@ark/util': 0.46.0 + '@ark/schema': 0.49.0 + '@ark/util': 0.49.0 ast-kit@1.4.3: dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 pathe: 2.0.3 - ast-kit@2.1.1: + ast-kit@2.1.2: dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 pathe: 2.0.3 - ast-module-types@6.0.1: {} - ast-walker-scope@0.6.2: dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 ast-kit: 1.4.3 - ast-walker-scope@0.8.1: + ast-walker-scope@0.8.2: dependencies: - '@babel/parser': 7.28.0 - ast-kit: 2.1.1 + '@babel/parser': 7.28.4 + ast-kit: 2.1.2 async-sema@3.1.1: {} @@ -8281,15 +7824,15 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 + browserslist: 4.26.2 + caniuse-lite: 1.0.30001743 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 - axios@1.12.0: + axios@1.12.2: dependencies: follow-redirects: 1.15.11 form-data: 4.0.4 @@ -8297,43 +7840,60 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.6.7: {} + b4a@1.7.1: {} balanced-match@1.0.2: {} - bare-events@2.6.0: + bare-events@2.7.0: optional: true - bare-fs@4.1.6: + bare-fs@4.4.4: dependencies: - bare-events: 2.6.0 + bare-events: 2.7.0 bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.6.0) + bare-stream: 2.7.0(bare-events@2.7.0) + bare-url: 2.2.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - react-native-b4a optional: true - bare-os@3.6.1: + bare-os@3.6.2: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.6.1 + bare-os: 3.6.2 optional: true - bare-stream@2.6.5(bare-events@2.6.0): + bare-stream@2.7.0(bare-events@2.7.0): dependencies: streamx: 2.22.1 optionalDependencies: - bare-events: 2.6.0 + bare-events: 2.7.0 + transitivePeerDependencies: + - react-native-b4a + optional: true + + bare-url@2.2.2: + dependencies: + bare-path: 3.0.0 optional: true base64-js@1.5.1: {} + baseline-browser-mapping@2.8.6: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 bcryptjs@3.0.2: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + binary-extensions@2.3.0: {} bindings@1.5.0: @@ -8370,14 +7930,13 @@ snapshots: dependencies: base64-js: 1.5.1 - browserslist@4.25.1: + browserslist@4.26.2: dependencies: - caniuse-lite: 1.0.30001731 - electron-to-chromium: 1.5.194 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) - - buffer-crc32@0.2.13: {} + baseline-browser-mapping: 2.8.6 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.222 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) buffer-crc32@1.0.0: {} @@ -8394,32 +7953,47 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@3.3.0: {} - builtin-modules@5.0.0: {} bundle-name@4.1.0: dependencies: - run-applescript: 7.0.0 + run-applescript: 7.1.0 - bundle-require@5.1.0(esbuild@0.25.8): + bundle-require@5.1.0(esbuild@0.25.10): dependencies: - esbuild: 0.25.8 + esbuild: 0.25.10 load-tsconfig: 0.2.5 - c12@3.2.0(magicast@0.3.5): + c12@3.1.0(magicast@0.3.5): dependencies: chokidar: 4.0.3 confbox: 0.2.2 defu: 6.1.4 - dotenv: 17.2.1 + dotenv: 16.6.1 exsolve: 1.0.7 giget: 2.0.0 jiti: 2.5.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + + c12@3.3.0(magicast@0.3.5): + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.2 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 rc9: 2.1.2 optionalDependencies: magicast: 0.3.5 @@ -8431,27 +8005,20 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsite@1.0.0: {} - callsites@3.1.0: {} caniuse-api@3.0.0: dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 + browserslist: 4.26.2 + caniuse-lite: 1.0.30001743 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001731: {} + caniuse-lite@1.0.30001743: {} canvas-renderer@2.2.1: dependencies: - '@types/node': 22.16.5 + '@types/node': 22.18.6 chalk@4.1.2: dependencies: @@ -8482,7 +8049,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.13.0 + undici: 7.16.0 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -8532,27 +8099,17 @@ snapshots: cluster-key-slot@1.1.2: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + simple-swizzle: 0.2.4 + optional: true color@4.2.3: dependencies: @@ -8564,21 +8121,12 @@ snapshots: colorette@2.0.20: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - commander@10.0.1: {} - commander@11.1.0: {} - commander@12.1.0: {} - commander@2.20.3: {} commander@7.2.0: @@ -8586,8 +8134,6 @@ snapshots: comment-parser@1.4.1: {} - common-path-prefix@3.0.0: {} - commondir@1.0.1: {} compatx@0.2.0: {} @@ -8620,14 +8166,9 @@ snapshots: dependencies: is-what: 4.1.16 - copy-file@11.0.0: + core-js-compat@3.45.1: dependencies: - graceful-fs: 4.2.11 - p-event: 6.0.1 - - core-js-compat@3.44.0: - dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 core-util-is@1.0.3: {} @@ -8638,10 +8179,6 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 - cron-parser@4.9.0: - dependencies: - luxon: 3.7.1 - croner@9.1.0: {} cross-fetch@3.2.0: @@ -8660,7 +8197,7 @@ snapshots: dependencies: uncrypto: 0.1.3 - css-declaration-sorter@7.2.0(postcss@8.5.6): + css-declaration-sorter@7.3.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -8694,15 +8231,15 @@ snapshots: cssfilter@0.0.10: {} - cssnano-preset-default@7.0.8(postcss@8.5.6): + cssnano-preset-default@7.0.9(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - css-declaration-sorter: 7.2.0(postcss@8.5.6) + browserslist: 4.26.2 + css-declaration-sorter: 7.3.0(postcss@8.5.6) cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 postcss-calc: 10.1.1(postcss@8.5.6) postcss-colormin: 7.0.4(postcss@8.5.6) - postcss-convert-values: 7.0.6(postcss@8.5.6) + postcss-convert-values: 7.0.7(postcss@8.5.6) postcss-discard-comments: 7.0.4(postcss@8.5.6) postcss-discard-duplicates: 7.0.2(postcss@8.5.6) postcss-discard-empty: 7.0.1(postcss@8.5.6) @@ -8732,9 +8269,9 @@ snapshots: dependencies: postcss: 8.5.6 - cssnano@7.1.0(postcss@8.5.6): + cssnano@7.1.1(postcss@8.5.6): dependencies: - cssnano-preset-default: 7.0.8(postcss@8.5.6) + cssnano-preset-default: 7.0.9(postcss@8.5.6) lilconfig: 3.1.3 postcss: 8.5.6 @@ -8742,9 +8279,20 @@ snapshots: dependencies: css-tree: 2.2.1 + cssstyle@5.3.0(postcss@8.5.6): + dependencies: + '@asamuzakjp/css-color': 4.0.4 + '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) + css-tree: 3.1.0 + transitivePeerDependencies: + - postcss + csstype@3.1.3: {} - data-uri-to-buffer@4.0.1: {} + data-urls@6.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 dateformat@4.6.3: {} @@ -8752,13 +8300,11 @@ snapshots: de-indent@1.0.2: {} - debug@4.4.1: + debug@4.4.3: dependencies: ms: 2.1.3 - decache@4.6.2: - dependencies: - callsite: 1.0.0 + decimal.js@10.6.0: {} decode-named-character-reference@1.2.0: dependencies: @@ -8774,6 +8320,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} + deepmerge@4.3.1: {} default-browser-id@5.0.0: {} @@ -8801,65 +8349,9 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.0.4: {} + detect-libc@2.1.0: {} - detective-amd@6.0.1: - dependencies: - ast-module-types: 6.0.1 - escodegen: 2.1.0 - get-amd-module-type: 6.0.1 - node-source-walk: 7.0.1 - - detective-cjs@6.0.1: - dependencies: - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - - detective-es6@5.0.1: - dependencies: - node-source-walk: 7.0.1 - - detective-postcss@7.0.1(postcss@8.5.6): - dependencies: - is-url: 1.2.4 - postcss: 8.5.6 - postcss-values-parser: 6.0.2(postcss@8.5.6) - - detective-sass@6.0.1: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 - - detective-scss@5.0.1: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 - - detective-stylus@5.0.1: {} - - detective-typescript@14.0.0(typescript@5.8.3): - dependencies: - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - detective-vue2@2.2.0(typescript@5.8.3): - dependencies: - '@dependents/detective-less': 5.0.1 - '@vue/compiler-sfc': 3.5.22 - detective-es6: 5.0.1 - detective-sass: 6.0.1 - detective-scss: 5.0.1 - detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - devalue@5.1.1: {} + devalue@5.3.2: {} devlop@1.1.0: dependencies: @@ -8893,7 +8385,7 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.2.1: {} + dotenv@17.2.2: {} dunder-proto@1.0.1: dependencies: @@ -8907,13 +8399,18 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.194: {} + effect@3.16.12: + dependencies: + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 + + electron-to-chromium@1.5.222: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enabled@2.0.0: {} + empathic@2.0.0: {} encodeurl@2.0.0: {} @@ -8926,17 +8423,15 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.2: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.2.3 entities@4.5.0: {} entities@6.0.1: {} - env-paths@3.0.0: {} - error-stack-parser-es@1.0.5: {} errx@0.1.0: {} @@ -8958,62 +8453,34 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.25.5: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 - - esbuild@0.25.8: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -9033,21 +8500,21 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.6.5(eslint@9.31.0(jiti@2.5.1)): + eslint-compat-utils@0.6.5(eslint@9.36.0(jiti@2.5.1)): dependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) semver: 7.7.2 - eslint-config-flat-gitignore@2.1.0(eslint@9.31.0(jiti@2.5.1)): + eslint-config-flat-gitignore@2.1.0(eslint@9.36.0(jiti@2.5.1)): dependencies: - '@eslint/compat': 1.3.1(eslint@9.31.0(jiti@2.5.1)) - eslint: 9.31.0(jiti@2.5.1) + '@eslint/compat': 1.3.2(eslint@9.36.0(jiti@2.5.1)) + eslint: 9.36.0(jiti@2.5.1) - eslint-config-prettier@10.1.8(eslint@9.31.0(jiti@2.5.1)): + eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)): dependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) - eslint-flat-config-utils@2.1.1: + eslint-flat-config-utils@2.1.4: dependencies: pathe: 2.0.3 @@ -9058,24 +8525,24 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-merge-processors@2.0.0(eslint@9.31.0(jiti@2.5.1)): + eslint-merge-processors@2.0.0(eslint@9.36.0(jiti@2.5.1)): dependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) - eslint-plugin-import-lite@0.3.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3): + eslint-plugin-import-lite@0.3.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.38.0 - eslint: 9.31.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@typescript-eslint/types': 8.44.0 + eslint: 9.36.0(jiti@2.5.1) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.31.0(jiti@2.5.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)): dependencies: - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/types': 8.44.0 comment-parser: 1.4.1 - debug: 4.4.1 - eslint: 9.31.0(jiti@2.5.1) + debug: 4.4.3 + eslint: 9.36.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.0.3 @@ -9083,18 +8550,18 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) transitivePeerDependencies: - supports-color - eslint-plugin-jsdoc@51.4.1(eslint@9.31.0(jiti@2.5.1)): + eslint-plugin-jsdoc@54.7.0(eslint@9.36.0(jiti@2.5.1)): dependencies: - '@es-joy/jsdoccomment': 0.52.0 + '@es-joy/jsdoccomment': 0.56.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) espree: 10.4.0 esquery: 1.6.0 parse-imports-exports: 0.2.4 @@ -9103,30 +8570,30 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-regexp@2.9.0(eslint@9.31.0(jiti@2.5.1)): + eslint-plugin-regexp@2.10.0(eslint@9.36.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.31.0(jiti@2.5.1) - jsdoc-type-pratt-parser: 4.1.0 + eslint: 9.36.0(jiti@2.5.1) + jsdoc-type-pratt-parser: 4.8.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-unicorn@60.0.0(eslint@9.31.0(jiti@2.5.1)): + eslint-plugin-unicorn@60.0.0(eslint@9.36.0(jiti@2.5.1)): dependencies: '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) - '@eslint/plugin-kit': 0.3.4 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint/plugin-kit': 0.3.5 change-case: 5.4.4 ci-info: 4.3.0 clean-regexp: 1.0.0 - core-js-compat: 3.44.0 - eslint: 9.31.0(jiti@2.5.1) + core-js-compat: 3.45.1 + eslint: 9.36.0(jiti@2.5.1) esquery: 1.6.0 find-up-simple: 1.0.1 - globals: 16.3.0 + globals: 16.4.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 jsesc: 3.1.0 @@ -9134,34 +8601,34 @@ snapshots: regexp-tree: 0.1.27 regjsparser: 0.12.0 semver: 7.7.2 - strip-indent: 4.0.0 + strip-indent: 4.1.0 - eslint-plugin-vue@10.4.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.31.0(jiti@2.5.1))(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.5.1))): + eslint-plugin-vue@10.4.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.5.1))): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) - eslint: 9.31.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + eslint: 9.36.0(jiti@2.5.1) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.7.2 - vue-eslint-parser: 10.2.0(eslint@9.31.0(jiti@2.5.1)) + vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.5.1)) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.22)(eslint@9.31.0(jiti@2.5.1)): + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1)): dependencies: - '@vue/compiler-sfc': 3.5.22 - eslint: 9.31.0(jiti@2.5.1) + '@vue/compiler-sfc': 3.5.21 + eslint: 9.36.0(jiti@2.5.1) eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-typegen@2.3.0(eslint@9.31.0(jiti@2.5.1)): + eslint-typegen@2.3.0(eslint@9.36.0(jiti@2.5.1)): dependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) json-schema-to-typescript-lite: 15.0.0 ohash: 2.0.11 @@ -9169,17 +8636,17 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.31.0(jiti@2.5.1): + eslint@9.36.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.36.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -9187,7 +8654,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -9266,22 +8733,9 @@ snapshots: exsolve@1.0.7: {} - externality@1.0.2: + fast-check@3.23.2: dependencies: - enhanced-resolve: 5.18.2 - mlly: 1.7.4 - pathe: 1.1.2 - ufo: 1.6.1 - - extract-zip@2.0.1: - dependencies: - debug: 4.4.1 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color + pure-rand: 6.1.0 fast-copy@3.0.2: {} @@ -9305,7 +8759,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-npm-meta@0.4.4: {} + fast-npm-meta@0.4.6: {} fast-redact@3.5.0: {} @@ -9315,21 +8769,10 @@ snapshots: dependencies: reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 - fecha@4.2.3: {} - - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -9348,8 +8791,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - filter-obj@6.1.0: {} - find-up-simple@1.0.1: {} find-up@5.0.0: @@ -9370,8 +8811,6 @@ snapshots: flatted@3.3.3: {} - fn.name@1.1.0: {} - follow-redirects@1.15.11: {} fontaine@0.6.0: @@ -9380,10 +8819,10 @@ snapshots: '@capsizecss/unpack': 2.4.0 css-tree: 3.1.0 magic-regexp: 0.10.0 - magic-string: 0.30.17 + magic-string: 0.30.19 pathe: 2.0.3 ufo: 1.6.1 - unplugin: 2.3.5 + unplugin: 2.3.10 transitivePeerDependencies: - encoding @@ -9412,10 +8851,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - fraction.js@4.3.7: {} fresh@2.0.0: {} @@ -9423,10 +8858,10 @@ snapshots: fs-constants@1.0.0: optional: true - fs-extra@11.3.0: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@8.1.0: @@ -9444,11 +8879,6 @@ snapshots: gensync@1.0.0-beta.2: {} - get-amd-module-type@6.0.1: - dependencies: - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -9471,10 +8901,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@5.2.0: - dependencies: - pump: 3.0.3 - get-stream@8.0.1: {} get-tsconfig@4.10.1: @@ -9486,8 +8912,8 @@ snapshots: citty: 0.1.6 consola: 3.4.2 defu: 6.1.4 - node-fetch-native: 1.6.6 - nypm: 0.6.1 + node-fetch-native: 1.6.7 + nypm: 0.6.2 pathe: 2.0.3 git-up@8.1.1: @@ -9525,7 +8951,7 @@ snapshots: globals@14.0.0: {} - globals@16.3.0: {} + globals@16.4.0: {} globby@14.1.0: dependencies: @@ -9536,10 +8962,6 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.3.0 - gonzales-pe@4.3.0: - dependencies: - minimist: 1.2.8 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -9548,21 +8970,21 @@ snapshots: graphemesplit@2.6.0: dependencies: - js-base64: 3.7.7 + js-base64: 3.7.8 unicode-trie: 2.0.0 gzip-size@7.0.0: dependencies: duplexer: 0.1.2 - h3@1.15.3: + h3@1.15.4: dependencies: cookie-es: 1.2.2 crossws: 0.3.5 defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.2 + node-mock-http: 1.0.3 radix3: 1.1.2 ufo: 1.6.1 uncrypto: 0.1.3 @@ -9585,9 +9007,9 @@ snapshots: hookable@5.5.3: {} - hosted-git-info@7.0.2: + html-encoding-sniffer@4.0.0: dependencies: - lru-cache: 10.4.3 + whatwg-encoding: 3.1.1 htmlparser2@10.0.0: dependencies: @@ -9604,12 +9026,19 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + http-shutdown@1.2.2: {} https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9641,15 +9070,13 @@ snapshots: exsolve: 1.0.7 mocked-exports: 0.1.1 pathe: 2.0.3 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 imurmurhash@0.1.4: {} indent-string@5.0.0: {} - index-to-position@1.1.0: {} - inherits@2.0.4: {} ini@1.3.8: @@ -9659,9 +9086,9 @@ snapshots: ioredis@5.7.0: dependencies: - '@ioredis/commands': 1.3.0 + '@ioredis/commands': 1.4.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -9671,7 +9098,7 @@ snapshots: transitivePeerDependencies: - supports-color - ipx@2.1.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0): + ipx@2.1.1(db0@0.3.2)(ioredis@5.7.0): dependencies: '@fastify/accept-negotiator': 1.1.0 citty: 0.1.6 @@ -9679,7 +9106,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 etag: 1.8.1 - h3: 1.15.3 + h3: 1.15.4 image-meta: 0.2.1 listhen: 1.9.0 ofetch: 1.4.1 @@ -9687,7 +9114,7 @@ snapshots: sharp: 0.32.6 svgo: 3.3.2 ufo: 1.6.1 - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) + unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -9702,27 +9129,26 @@ snapshots: - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - bare-buffer - db0 - idb-keyval - ioredis + - react-native-b4a - uploadthing optional: true iron-webcrypto@1.2.1: {} - is-arrayish@0.3.2: {} + is-arrayish@0.3.4: + optional: true is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-builtin-module@5.0.0: dependencies: builtin-modules: 5.0.0 @@ -9754,7 +9180,7 @@ snapshots: is-language-code@3.1.0: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 is-module@1.0.0: {} @@ -9762,7 +9188,7 @@ snapshots: is-path-inside@4.0.0: {} - is-plain-obj@2.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-reference@1.2.1: dependencies: @@ -9776,12 +9202,6 @@ snapshots: is-stream@3.0.0: {} - is-stream@4.0.1: {} - - is-url-superb@4.0.0: {} - - is-url@1.2.4: {} - is-what@4.1.16: {} is-wsl@2.2.0: @@ -9812,13 +9232,11 @@ snapshots: dependencies: canvas-renderer: 2.2.1 - jiti@2.4.2: {} - jiti@2.5.1: {} joycon@3.1.1: {} - js-base64@3.7.7: {} + js-base64@3.7.8: {} js-tokens@4.0.0: {} @@ -9828,7 +9246,37 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@4.1.0: {} + jsdoc-type-pratt-parser@4.8.0: {} + + jsdoc-type-pratt-parser@5.1.1: {} + + jsdom@27.0.0(postcss@8.5.6): + dependencies: + '@asamuzakjp/dom-selector': 6.5.5 + cssstyle: 5.3.0(postcss@8.5.6) + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - postcss + - supports-color + - utf-8-validate jsesc@3.0.2: {} @@ -9838,7 +9286,7 @@ snapshots: json-schema-to-typescript-lite@15.0.0: dependencies: - '@apidevtools/json-schema-ref-parser': 14.1.1 + '@apidevtools/json-schema-ref-parser': 14.2.1(@types/json-schema@7.0.15) '@types/json-schema': 7.0.15 json-schema-traverse@0.4.1: {} @@ -9864,16 +9312,12 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - junk@4.0.1: {} - - jwt-decode@4.0.0: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -9886,15 +9330,7 @@ snapshots: knitwork@1.2.0: {} - kuler@2.0.0: {} - - lambda-local@2.2.0: - dependencies: - commander: 10.0.1 - dotenv: 16.6.1 - winston: 3.17.0 - - launch-editor@2.11.0: + launch-editor@2.11.1: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 @@ -9940,7 +9376,7 @@ snapshots: lightningcss@1.30.1: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.0 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 @@ -9965,10 +9401,10 @@ snapshots: crossws: 0.3.5 defu: 6.1.4 get-port-please: 3.2.0 - h3: 1.15.3 + h3: 1.15.4 http-shutdown: 1.2.2 jiti: 2.5.1 - mlly: 1.7.4 + mlly: 1.8.0 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.9.0 @@ -9978,11 +9414,11 @@ snapshots: load-tsconfig@0.2.5: {} - local-pkg@1.1.1: + local-pkg@1.1.2: dependencies: - mlly: 1.7.4 - pkg-types: 2.2.0 - quansync: 0.2.10 + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 locate-path@6.0.0: dependencies: @@ -9992,18 +9428,10 @@ snapshots: dependencies: p-locate: 6.0.0 - lodash-es@4.17.21: {} - - lodash.castarray@4.4.0: {} - - lodash.debounce@4.0.8: {} - lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} - lodash.isplainobject@4.0.6: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -10012,44 +9440,33 @@ snapshots: lodash@4.17.21: {} - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - lru-cache@10.4.3: {} + lru-cache@11.2.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - luxon@3.7.1: {} + luxon@3.7.2: {} magic-regexp@0.10.0: dependencies: estree-walker: 3.0.3 - magic-string: 0.30.17 - mlly: 1.7.4 + magic-string: 0.30.19 + mlly: 1.8.0 regexp-tree: 0.1.27 type-level-regexp: 0.1.17 ufo: 1.6.1 - unplugin: 2.3.5 + unplugin: 2.3.10 magic-string-ast@0.7.1: dependencies: - magic-string: 0.30.17 + magic-string: 0.30.19 - magic-string-ast@1.0.0: + magic-string-ast@1.0.2: dependencies: - magic-string: 0.30.17 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + magic-string: 0.30.19 magic-string@0.30.19: dependencies: @@ -10057,8 +9474,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 source-map-js: 1.2.1 math-intrinsics@1.1.0: {} @@ -10070,16 +9487,10 @@ snapshots: mdn-data@2.12.2: {} - merge-options@3.0.4: - dependencies: - is-plain-obj: 2.1.0 - merge-stream@2.0.0: {} merge2@1.4.1: {} - micro-api-client@3.3.0: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -10187,7 +9598,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.3 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -10225,15 +9636,13 @@ snapshots: mime@3.0.0: {} - mime@4.0.7: {} + mime@4.1.0: {} mimic-fn@4.0.0: {} mimic-response@3.1.0: optional: true - min-indent@1.0.1: {} - mini-svg-data-uri@1.4.4: {} minimatch@10.0.3: @@ -10267,7 +9676,7 @@ snapshots: mkdirp@3.0.1: {} - mlly@1.7.4: + mlly@1.8.0: dependencies: acorn: 8.15.0 pathe: 2.0.3 @@ -10276,11 +9685,6 @@ snapshots: mocked-exports@0.1.1: {} - module-definition@6.0.1: - dependencies: - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - mrmime@2.0.1: {} ms@2.1.3: {} @@ -10296,33 +9700,23 @@ snapshots: napi-build-utils@2.0.0: optional: true - napi-postinstall@0.3.2: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} - netlify@13.3.5: - dependencies: - '@netlify/open-api': 2.37.0 - lodash-es: 4.17.21 - micro-api-client: 3.3.0 - node-fetch: 3.3.2 - p-wait-for: 5.0.2 - qs: 6.14.0 - - nitropack@2.12.4(@netlify/blobs@9.1.2): + nitropack@2.12.6: dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@netlify/functions': 3.1.10(rollup@4.46.2) - '@rollup/plugin-alias': 5.1.1(rollup@4.46.2) - '@rollup/plugin-commonjs': 28.0.6(rollup@4.46.2) - '@rollup/plugin-inject': 5.0.5(rollup@4.46.2) - '@rollup/plugin-json': 6.1.0(rollup@4.46.2) - '@rollup/plugin-node-resolve': 16.0.1(rollup@4.46.2) - '@rollup/plugin-replace': 6.0.2(rollup@4.46.2) - '@rollup/plugin-terser': 0.4.4(rollup@4.46.2) - '@vercel/nft': 0.29.4(rollup@4.46.2) + '@rollup/plugin-alias': 5.1.1(rollup@4.52.0) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.52.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.52.0) + '@rollup/plugin-json': 6.1.0(rollup@4.52.0) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.52.0) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) + '@rollup/plugin-terser': 0.4.4(rollup@4.52.0) + '@vercel/nft': 0.30.1(rollup@4.52.0) archiver: 7.0.1 - c12: 3.2.0(magicast@0.3.5) + c12: 3.3.0(magicast@0.3.5) chokidar: 4.0.3 citty: 0.1.6 compatx: 0.2.0 @@ -10335,13 +9729,13 @@ snapshots: defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 - esbuild: 0.25.8 + esbuild: 0.25.10 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.7 globby: 14.1.0 gzip-size: 7.0.0 - h3: 1.15.3 + h3: 1.15.4 hookable: 5.5.3 httpxy: 0.1.7 ioredis: 5.7.0 @@ -10349,21 +9743,21 @@ snapshots: klona: 2.0.6 knitwork: 1.2.0 listhen: 1.9.0 - magic-string: 0.30.17 + magic-string: 0.30.19 magicast: 0.3.5 - mime: 4.0.7 - mlly: 1.7.4 - node-fetch-native: 1.6.6 - node-mock-http: 1.0.2 + mime: 4.1.0 + mlly: 1.8.0 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.3 ofetch: 1.4.1 ohash: 2.0.11 pathe: 2.0.3 - perfect-debounce: 1.0.0 - pkg-types: 2.2.0 - pretty-bytes: 6.1.1 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + pretty-bytes: 7.0.1 radix3: 1.1.2 - rollup: 4.46.2 - rollup-plugin-visualizer: 6.0.3(rollup@4.46.2) + rollup: 4.52.0 + rollup-plugin-visualizer: 6.0.3(rollup@4.52.0) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -10374,13 +9768,13 @@ snapshots: ultrahtml: 1.6.0 uncrypto: 0.1.3 unctx: 2.4.1 - unenv: 2.0.0-rc.19 - unimport: 5.2.0 - unplugin-utils: 0.2.4 - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) + unenv: 2.0.0-rc.21 + unimport: 5.3.0 + unplugin-utils: 0.3.0 + unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) untyped: 2.0.0 - unwasm: 0.3.9 - youch: 4.1.0-beta.8 + unwasm: 0.3.11 + youch: 4.1.0-beta.11 youch-core: 0.3.3 transitivePeerDependencies: - '@azure/app-configuration' @@ -10397,6 +9791,7 @@ snapshots: - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - better-sqlite3 @@ -10404,12 +9799,13 @@ snapshots: - encoding - idb-keyval - mysql2 + - react-native-b4a - rolldown - sqlite3 - supports-color - uploadthing - node-abi@3.75.0: + node-abi@3.77.0: dependencies: semver: 7.7.2 optional: true @@ -10421,51 +9817,29 @@ snapshots: node-addon-api@8.5.0: {} - node-domexception@1.0.0: {} - - node-fetch-native@1.6.6: {} + node-fetch-native@1.6.7: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-forge@1.3.1: {} node-gyp-build@4.8.4: {} - node-mock-http@1.0.2: {} + node-mock-http@1.0.3: {} - node-releases@2.0.19: {} - - node-source-walk@7.0.1: - dependencies: - '@babel/parser': 7.28.0 + node-releases@2.0.21: {} nopt@8.1.0: dependencies: abbrev: 3.0.1 - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.7.2 - validate-npm-package-license: 3.0.4 - - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} - normalize-url@8.0.2: {} + normalize-url@8.1.0: {} npm-run-path@5.3.0: dependencies: @@ -10482,92 +9856,94 @@ snapshots: nuxt-csurf@1.6.5(magicast@0.3.5): dependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/kit': 3.19.2(magicast@0.3.5) defu: 6.1.4 uncsrf: 1.2.0 transitivePeerDependencies: - magicast - nuxt-security@2.2.0(magicast@0.3.5)(rollup@4.46.2): + nuxt-security@2.2.0(magicast@0.3.5)(rollup@4.52.0): dependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/kit': 3.19.2(magicast@0.3.5) basic-auth: 2.0.1 defu: 6.1.4 nuxt-csurf: 1.6.5(magicast@0.3.5) pathe: 1.1.2 - unplugin-remove: 1.0.3(rollup@4.46.2) + unplugin-remove: 1.0.3(rollup@4.52.0) xss: 1.0.15 transitivePeerDependencies: - magicast - rollup - supports-color - nuxt@3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.16.5)(@vue/compiler-sfc@3.5.22)(db0@0.3.2)(eslint@9.31.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3))(yaml@2.8.0): + nuxt@4.1.2(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2))(yaml@2.8.1): dependencies: - '@nuxt/cli': 3.27.0(magicast@0.3.5) + '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)) - '@nuxt/kit': 3.17.7(magicast@0.3.5) - '@nuxt/schema': 3.17.7 + '@nuxt/devtools': 2.6.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@nuxt/schema': 4.1.2 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.17.7(@types/node@22.16.5)(eslint@9.31.0(jiti@2.5.1))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.46.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vue-tsc@3.0.4(typescript@5.8.3))(vue@3.5.22(typescript@5.8.3))(yaml@2.8.0) - '@unhead/vue': 2.0.13(vue@3.5.22(typescript@5.8.3)) - '@vue/shared': 3.5.18 - c12: 3.2.0(magicast@0.3.5) + '@nuxt/vite-builder': 4.1.2(@types/node@22.18.6)(eslint@9.36.0(jiti@2.5.1))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(sass@1.93.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.7(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1) + '@unhead/vue': 2.0.17(vue@3.5.21(typescript@5.9.2)) + '@vue/shared': 3.5.21 + c12: 3.3.0(magicast@0.3.5) chokidar: 4.0.3 compatx: 0.2.0 consola: 3.4.2 cookie-es: 2.0.0 defu: 6.1.4 destr: 2.0.5 - devalue: 5.1.1 + devalue: 5.3.2 errx: 0.1.0 - esbuild: 0.25.8 + esbuild: 0.25.10 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 exsolve: 1.0.7 - h3: 1.15.3 + h3: 1.15.4 hookable: 5.5.3 ignore: 7.0.5 impound: 1.0.0 jiti: 2.5.1 klona: 2.0.6 knitwork: 1.2.0 - magic-string: 0.30.17 - mlly: 1.7.4 + magic-string: 0.30.19 + mlly: 1.8.0 mocked-exports: 0.1.1 nanotar: 0.2.0 - nitropack: 2.12.4(@netlify/blobs@9.1.2) - nypm: 0.6.1 + nitropack: 2.12.6 + nypm: 0.6.2 ofetch: 1.4.1 ohash: 2.0.11 on-change: 5.0.1 - oxc-parser: 0.76.0 + oxc-minify: 0.87.0 + oxc-parser: 0.87.0 + oxc-transform: 0.87.0 + oxc-walker: 0.5.2(oxc-parser@0.87.0) pathe: 2.0.3 - perfect-debounce: 1.0.0 - pkg-types: 2.2.0 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 radix3: 1.1.2 scule: 1.3.0 semver: 7.7.2 std-env: 3.9.0 - strip-literal: 3.0.0 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 ufo: 1.6.1 ultrahtml: 1.6.0 uncrypto: 0.1.3 unctx: 2.4.1 - unimport: 5.2.0 - unplugin: 2.3.5 - unplugin-vue-router: 0.14.0(@vue/compiler-sfc@3.5.22)(vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)) - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) + unimport: 5.3.0 + unplugin: 2.3.10 + unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.21)(typescript@5.9.2)(vue-router@4.5.1(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)) + unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) untyped: 2.0.0 - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) vue-bundle-renderer: 2.1.2 vue-devtools-stub: 0.1.0 - vue-router: 4.5.1(vue@3.5.22(typescript@5.8.3)) + vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) optionalDependencies: '@parcel/watcher': 2.5.1 - '@types/node': 22.16.5 + '@types/node': 22.18.6 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10584,6 +9960,7 @@ snapshots: - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - '@vue/compiler-sfc' - aws4fetch @@ -10601,6 +9978,7 @@ snapshots: - meow - mysql2 - optionator + - react-native-b4a - rolldown - rollup - sass @@ -10622,20 +10000,18 @@ snapshots: - xml2js - yaml - nypm@0.6.1: + nypm@0.6.2: dependencies: citty: 0.1.6 consola: 3.4.2 pathe: 2.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 tinyexec: 1.0.1 - object-inspect@1.13.4: {} - ofetch@1.4.1: dependencies: destr: 2.0.5 - node-fetch-native: 1.6.6 + node-fetch-native: 1.6.7 ufo: 1.6.1 ohash@2.0.11: {} @@ -10652,10 +10028,6 @@ snapshots: dependencies: wrappy: 1.0.2 - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -10682,6 +10054,24 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + oxc-minify@0.87.0: + optionalDependencies: + '@oxc-minify/binding-android-arm64': 0.87.0 + '@oxc-minify/binding-darwin-arm64': 0.87.0 + '@oxc-minify/binding-darwin-x64': 0.87.0 + '@oxc-minify/binding-freebsd-x64': 0.87.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.87.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.87.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.87.0 + '@oxc-minify/binding-linux-arm64-musl': 0.87.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.87.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.87.0 + '@oxc-minify/binding-linux-x64-gnu': 0.87.0 + '@oxc-minify/binding-linux-x64-musl': 0.87.0 + '@oxc-minify/binding-wasm32-wasi': 0.87.0 + '@oxc-minify/binding-win32-arm64-msvc': 0.87.0 + '@oxc-minify/binding-win32-x64-msvc': 0.87.0 + oxc-parser@0.70.0: dependencies: '@oxc-project/types': 0.70.0 @@ -10701,29 +10091,48 @@ snapshots: '@oxc-parser/binding-win32-arm64-msvc': 0.70.0 '@oxc-parser/binding-win32-x64-msvc': 0.70.0 - oxc-parser@0.76.0: + oxc-parser@0.87.0: dependencies: - '@oxc-project/types': 0.76.0 + '@oxc-project/types': 0.87.0 optionalDependencies: - '@oxc-parser/binding-android-arm64': 0.76.0 - '@oxc-parser/binding-darwin-arm64': 0.76.0 - '@oxc-parser/binding-darwin-x64': 0.76.0 - '@oxc-parser/binding-freebsd-x64': 0.76.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.76.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.76.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.76.0 - '@oxc-parser/binding-linux-arm64-musl': 0.76.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.76.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.76.0 - '@oxc-parser/binding-linux-x64-gnu': 0.76.0 - '@oxc-parser/binding-linux-x64-musl': 0.76.0 - '@oxc-parser/binding-wasm32-wasi': 0.76.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.76.0 - '@oxc-parser/binding-win32-x64-msvc': 0.76.0 + '@oxc-parser/binding-android-arm64': 0.87.0 + '@oxc-parser/binding-darwin-arm64': 0.87.0 + '@oxc-parser/binding-darwin-x64': 0.87.0 + '@oxc-parser/binding-freebsd-x64': 0.87.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.87.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.87.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.87.0 + '@oxc-parser/binding-linux-arm64-musl': 0.87.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.87.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.87.0 + '@oxc-parser/binding-linux-x64-gnu': 0.87.0 + '@oxc-parser/binding-linux-x64-musl': 0.87.0 + '@oxc-parser/binding-wasm32-wasi': 0.87.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.87.0 + '@oxc-parser/binding-win32-x64-msvc': 0.87.0 - p-event@6.0.1: + oxc-transform@0.87.0: + optionalDependencies: + '@oxc-transform/binding-android-arm64': 0.87.0 + '@oxc-transform/binding-darwin-arm64': 0.87.0 + '@oxc-transform/binding-darwin-x64': 0.87.0 + '@oxc-transform/binding-freebsd-x64': 0.87.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.87.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.87.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.87.0 + '@oxc-transform/binding-linux-arm64-musl': 0.87.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.87.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.87.0 + '@oxc-transform/binding-linux-x64-gnu': 0.87.0 + '@oxc-transform/binding-linux-x64-musl': 0.87.0 + '@oxc-transform/binding-wasm32-wasi': 0.87.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.87.0 + '@oxc-transform/binding-win32-x64-msvc': 0.87.0 + + oxc-walker@0.5.2(oxc-parser@0.87.0): dependencies: - p-timeout: 6.1.4 + magic-regexp: 0.10.0 + oxc-parser: 0.87.0 p-limit@3.1.0: dependencies: @@ -10743,12 +10152,6 @@ snapshots: p-map@7.0.3: {} - p-timeout@6.1.4: {} - - p-wait-for@5.0.2: - dependencies: - p-timeout: 6.1.4 - package-json-from-dist@1.0.1: {} package-manager-detector@1.3.0: {} @@ -10759,18 +10162,10 @@ snapshots: dependencies: callsites: 3.1.0 - parse-gitignore@2.0.0: {} - parse-imports-exports@0.2.4: dependencies: parse-statements: 1.0.11 - parse-json@8.3.0: - dependencies: - '@babel/code-frame': 7.27.1 - index-to-position: 1.1.0 - type-fest: 4.41.0 - parse-path@7.1.0: dependencies: protocols: 2.0.2 @@ -10822,10 +10217,10 @@ snapshots: peek-readable@5.4.2: {} - pend@1.2.0: {} - perfect-debounce@1.0.0: {} + perfect-debounce@2.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -10836,7 +10231,7 @@ snapshots: dependencies: split2: 4.2.0 - pino-pretty@13.0.0: + pino-pretty@13.1.1: dependencies: colorette: 2.0.20 dateformat: 4.6.3 @@ -10848,13 +10243,13 @@ snapshots: on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pump: 3.0.3 - secure-json-parse: 2.7.0 + secure-json-parse: 4.0.0 sonic-boom: 4.2.0 - strip-json-comments: 3.1.1 + strip-json-comments: 5.0.3 pino-std-serializers@7.0.0: {} - pino@9.7.0: + pino@9.10.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 @@ -10871,10 +10266,10 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 - pkg-types@2.2.0: + pkg-types@2.3.0: dependencies: confbox: 0.2.2 exsolve: 1.0.7 @@ -10890,15 +10285,15 @@ snapshots: postcss-colormin@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.6(postcss@8.5.6): + postcss-convert-values@7.0.7(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -10927,7 +10322,7 @@ snapshots: postcss-merge-rules@7.0.6(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 @@ -10947,7 +10342,7 @@ snapshots: postcss-minify-params@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -10989,7 +10384,7 @@ snapshots: postcss-normalize-unicode@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -11011,7 +10406,7 @@ snapshots: postcss-reduce-initial@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -11048,13 +10443,6 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss-values-parser@6.0.2(postcss@8.5.6): - dependencies: - color-name: 1.1.4 - is-url-superb: 4.0.0 - postcss: 8.5.6 - quote-unquote: 1.0.0 - postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -11063,52 +10451,34 @@ snapshots: prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.0 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.75.0 + node-abi: 3.77.0 pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.3 + tar-fs: 2.1.4 tunnel-agent: 0.6.0 optional: true - precinct@12.2.0: - dependencies: - '@dependents/detective-less': 5.0.1 - commander: 12.1.0 - detective-amd: 6.0.1 - detective-cjs: 6.0.1 - detective-es6: 5.0.1 - detective-postcss: 7.0.1(postcss@8.5.6) - detective-sass: 6.0.1 - detective-scss: 5.0.1 - detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.3) - detective-vue2: 2.2.0(typescript@5.8.3) - module-definition: 6.0.1 - node-source-walk: 7.0.1 - postcss: 8.5.6 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - prelude-ls@1.2.1: {} prettier@3.6.2: {} - pretty-bytes@6.1.1: {} + pretty-bytes@7.0.1: {} - prisma@6.12.0(typescript@5.8.3): + prisma@6.16.2(magicast@0.3.5)(typescript@5.9.2): dependencies: - '@prisma/config': 6.12.0 - '@prisma/engines': 6.12.0 + '@prisma/config': 6.16.2(magicast@0.3.5) + '@prisma/engines': 6.16.2 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 + transitivePeerDependencies: + - magicast process-nextick-args@2.0.1: {} @@ -11132,18 +10502,14 @@ snapshots: punycode@2.3.1: {} - qs@6.14.0: - dependencies: - side-channel: 1.1.0 + pure-rand@6.1.0: {} - quansync@0.2.10: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} - quote-unquote@1.0.0: {} - radix3@1.1.2: {} randombytes@2.1.0: @@ -11165,20 +10531,6 @@ snapshots: strip-json-comments: 2.0.1 optional: true - read-package-up@11.0.0: - dependencies: - find-up-simple: 1.0.1 - read-pkg: 9.0.1 - type-fest: 4.41.0 - - read-pkg@9.0.1: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 8.3.0 - type-fest: 4.41.0 - unicorn-magic: 0.1.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -11240,11 +10592,9 @@ snapshots: dependencies: jsesc: 3.0.2 - remove-trailing-separator@1.1.0: {} - require-directory@2.1.1: {} - require-package-name@2.0.1: {} + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -11258,54 +10608,52 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restructure@3.0.2: {} reusify@1.1.0: {} rfdc@1.4.1: {} - rollup-plugin-visualizer@6.0.3(rollup@4.46.2): + rollup-plugin-visualizer@6.0.3(rollup@4.52.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.0 - rollup@4.46.2: + rollup@4.52.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.46.2 - '@rollup/rollup-android-arm64': 4.46.2 - '@rollup/rollup-darwin-arm64': 4.46.2 - '@rollup/rollup-darwin-x64': 4.46.2 - '@rollup/rollup-freebsd-arm64': 4.46.2 - '@rollup/rollup-freebsd-x64': 4.46.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 - '@rollup/rollup-linux-arm-musleabihf': 4.46.2 - '@rollup/rollup-linux-arm64-gnu': 4.46.2 - '@rollup/rollup-linux-arm64-musl': 4.46.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 - '@rollup/rollup-linux-ppc64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-musl': 4.46.2 - '@rollup/rollup-linux-s390x-gnu': 4.46.2 - '@rollup/rollup-linux-x64-gnu': 4.46.2 - '@rollup/rollup-linux-x64-musl': 4.46.2 - '@rollup/rollup-win32-arm64-msvc': 4.46.2 - '@rollup/rollup-win32-ia32-msvc': 4.46.2 - '@rollup/rollup-win32-x64-msvc': 4.46.2 + '@rollup/rollup-android-arm-eabi': 4.52.0 + '@rollup/rollup-android-arm64': 4.52.0 + '@rollup/rollup-darwin-arm64': 4.52.0 + '@rollup/rollup-darwin-x64': 4.52.0 + '@rollup/rollup-freebsd-arm64': 4.52.0 + '@rollup/rollup-freebsd-x64': 4.52.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.0 + '@rollup/rollup-linux-arm-musleabihf': 4.52.0 + '@rollup/rollup-linux-arm64-gnu': 4.52.0 + '@rollup/rollup-linux-arm64-musl': 4.52.0 + '@rollup/rollup-linux-loong64-gnu': 4.52.0 + '@rollup/rollup-linux-ppc64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-musl': 4.52.0 + '@rollup/rollup-linux-s390x-gnu': 4.52.0 + '@rollup/rollup-linux-x64-gnu': 4.52.0 + '@rollup/rollup-linux-x64-musl': 4.52.0 + '@rollup/rollup-openharmony-arm64': 4.52.0 + '@rollup/rollup-win32-arm64-msvc': 4.52.0 + '@rollup/rollup-win32-ia32-msvc': 4.52.0 + '@rollup/rollup-win32-x64-gnu': 4.52.0 + '@rollup/rollup-win32-x64-msvc': 4.52.0 fsevents: 2.3.3 - run-applescript@7.0.0: {} + rrweb-cssom@0.8.0: {} + + run-applescript@7.1.0: {} run-parallel@1.2.0: dependencies: @@ -11323,7 +10671,7 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass@1.89.2: + sass@1.93.0: dependencies: chokidar: 4.0.3 immutable: 5.1.3 @@ -11333,6 +10681,10 @@ snapshots: sax@1.4.1: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.1 @@ -11341,7 +10693,7 @@ snapshots: scule@1.3.0: {} - secure-json-parse@2.7.0: {} + secure-json-parse@4.0.0: {} semver@6.3.1: {} @@ -11349,7 +10701,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -11385,15 +10737,16 @@ snapshots: sharp@0.32.6: dependencies: color: 4.2.3 - detect-libc: 2.0.4 + detect-libc: 2.1.0 node-addon-api: 6.1.0 prebuild-install: 7.1.3 semver: 7.7.2 simple-get: 4.0.1 - tar-fs: 3.1.0 + tar-fs: 3.1.1 tunnel-agent: 0.6.0 transitivePeerDependencies: - bare-buffer + - react-native-b4a optional: true shebang-command@2.0.0: @@ -11404,34 +10757,6 @@ snapshots: shell-quote@1.8.3: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - signal-exit@4.1.0: {} simple-concat@1.0.1: @@ -11448,15 +10773,16 @@ snapshots: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 + optional: true - sirv@3.0.1: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 @@ -11485,24 +10811,14 @@ snapshots: source-map@0.7.6: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 - spdx-exceptions@2.5.0: {} - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 - spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.21: {} + spdx-license-ids@3.0.22: {} speakingurl@14.0.1: {} @@ -11510,8 +10826,6 @@ snapshots: stable-hash-x@0.2.0: {} - stack-trace@0.0.10: {} - standard-as-callback@2.1.0: {} statuses@2.0.1: {} @@ -11535,7 +10849,9 @@ snapshots: fast-fifo: 1.3.2 text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.6.0 + bare-events: 2.7.0 + transitivePeerDependencies: + - react-native-b4a string-width@4.2.3: dependencies: @@ -11547,7 +10863,7 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string_decoder@1.1.1: dependencies: @@ -11561,21 +10877,21 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-final-newline@3.0.0: {} - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 + strip-indent@4.1.0: {} strip-json-comments@2.0.1: optional: true strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + strip-literal@3.0.0: dependencies: js-tokens: 9.0.1 @@ -11589,7 +10905,7 @@ snapshots: stylehacks@7.0.6(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.6 postcss-selector-parser: 7.1.0 @@ -11597,7 +10913,7 @@ snapshots: dependencies: copy-anything: 3.0.5 - supports-color@10.0.0: {} + supports-color@10.2.2: {} supports-color@7.2.0: dependencies: @@ -11626,6 +10942,8 @@ snapshots: picocolors: 1.1.1 sax: 1.4.1 + symbol-tree@3.2.4: {} + synckit@0.10.4: dependencies: '@pkgr/core': 0.2.9 @@ -11633,11 +10951,11 @@ snapshots: system-architecture@0.1.0: {} - tailwindcss@4.1.11: {} + tailwindcss@4.1.13: {} - tapable@2.2.2: {} + tapable@2.2.3: {} - tar-fs@2.1.3: + tar-fs@2.1.4: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -11645,15 +10963,16 @@ snapshots: tar-stream: 2.2.0 optional: true - tar-fs@3.1.0: + tar-fs@3.1.1: dependencies: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.1.6 + bare-fs: 4.4.4 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer + - react-native-b4a optional: true tar-stream@2.2.0: @@ -11667,9 +10986,11 @@ snapshots: tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.7.1 fast-fifo: 1.3.2 streamx: 2.22.1 + transitivePeerDependencies: + - react-native-b4a tar@7.4.3: dependencies: @@ -11680,18 +11001,18 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - terser@5.43.1: + terser@5.44.0: dependencies: - '@jridgewell/source-map': 0.3.10 + '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 text-decoder@1.2.3: dependencies: - b4a: 1.6.7 - - text-hex@1.0.0: {} + b4a: 1.7.1 + transitivePeerDependencies: + - react-native-b4a thread-stream@3.1.0: dependencies: @@ -11707,16 +11028,16 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tmp-promise@3.0.3: - dependencies: - tmp: 0.2.3 + tldts-core@7.0.14: {} - tmp@0.2.3: {} + tldts@7.0.14: + dependencies: + tldts-core: 7.0.14 to-regex-range@5.0.1: dependencies: @@ -11729,23 +11050,27 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - toml@3.0.0: {} - tosource@2.0.0-alpha.3: {} totalist@3.0.1: {} + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.14 + tr46@0.0.3: {} - triple-beam@1.4.1: {} + tr46@6.0.0: + dependencies: + punycode: 2.3.1 truncate-utf8-bytes@1.0.2: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 tslib@2.8.1: {} @@ -11754,7 +11079,7 @@ snapshots: safe-buffer: 5.2.1 optional: true - turndown@7.2.0: + turndown@7.2.1: dependencies: '@mixmark-io/domino': 2.2.0 @@ -11766,7 +11091,7 @@ snapshots: type-level-regexp@0.1.17: {} - typescript@5.8.3: {} + typescript@5.9.2: {} ufo@1.6.1: {} @@ -11780,14 +11105,14 @@ snapshots: dependencies: acorn: 8.15.0 estree-walker: 3.0.3 - magic-string: 0.30.17 - unplugin: 2.3.5 + magic-string: 0.30.19 + unplugin: 2.3.10 undici-types@6.21.0: {} - undici@7.13.0: {} + undici@7.16.0: {} - unenv@2.0.0-rc.19: + unenv@2.0.0-rc.21: dependencies: defu: 6.1.4 exsolve: 1.0.7 @@ -11795,7 +11120,7 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 - unhead@2.0.13: + unhead@2.0.17: dependencies: hookable: 5.5.3 @@ -11818,91 +11143,95 @@ snapshots: css-tree: 3.1.0 ohash: 2.0.11 - unimport@5.2.0: + unimport@5.3.0: dependencies: acorn: 8.15.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - local-pkg: 1.1.1 - magic-string: 0.30.17 - mlly: 1.7.4 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 pathe: 2.0.3 picomatch: 4.0.3 - pkg-types: 2.2.0 + pkg-types: 2.3.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.14 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.0 universalify@0.1.2: {} universalify@2.0.1: {} - unixify@1.0.0: + unplugin-remove@1.0.3(rollup@4.52.0): dependencies: - normalize-path: 2.1.1 - - unplugin-remove@1.0.3(rollup@4.46.2): - dependencies: - '@babel/core': 7.28.0 - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/traverse': 7.28.0 - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) - magic-string: 0.30.17 + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + magic-string: 0.30.19 unplugin: 1.16.1 transitivePeerDependencies: - rollup - supports-color - unplugin-utils@0.2.4: + unplugin-utils@0.2.5: dependencies: pathe: 2.0.3 picomatch: 4.0.3 - unplugin-vue-router@0.12.0(vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)): + unplugin-utils@0.3.0: dependencies: - '@babel/types': 7.28.2 - '@vue-macros/common': 1.16.1(vue@3.5.22(typescript@5.8.3)) + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-router@0.12.0(vue-router@4.5.1(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)): + dependencies: + '@babel/types': 7.28.4 + '@vue-macros/common': 1.16.1(vue@3.5.21(typescript@5.9.2)) ast-walker-scope: 0.6.2 chokidar: 4.0.3 fast-glob: 3.3.3 json5: 2.2.3 - local-pkg: 1.1.1 - magic-string: 0.30.17 + local-pkg: 1.1.2 + magic-string: 0.30.19 micromatch: 4.0.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 scule: 1.3.0 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 - yaml: 2.8.0 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 + yaml: 2.8.1 optionalDependencies: - vue-router: 4.5.1(vue@3.5.22(typescript@5.8.3)) + vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: - vue - unplugin-vue-router@0.14.0(@vue/compiler-sfc@3.5.22)(vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)): + unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.21)(typescript@5.9.2)(vue-router@4.5.1(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)): dependencies: - '@vue-macros/common': 3.0.0-beta.15(vue@3.5.22(typescript@5.8.3)) - '@vue/compiler-sfc': 3.5.22 - ast-walker-scope: 0.8.1 + '@vue-macros/common': 3.0.0-beta.16(vue@3.5.21(typescript@5.9.2)) + '@vue/compiler-sfc': 3.5.21 + '@vue/language-core': 3.0.7(typescript@5.9.2) + ast-walker-scope: 0.8.2 chokidar: 4.0.3 - fast-glob: 3.3.3 json5: 2.2.3 - local-pkg: 1.1.1 - magic-string: 0.30.17 - mlly: 1.7.4 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + muggle-string: 0.4.1 pathe: 2.0.3 picomatch: 4.0.3 scule: 1.3.0 - unplugin: 2.3.5 - unplugin-utils: 0.2.4 - yaml: 2.8.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 + yaml: 2.8.1 optionalDependencies: - vue-router: 4.5.1(vue@3.5.22(typescript@5.8.3)) + vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: + - typescript - vue unplugin@1.16.1: @@ -11910,15 +11239,16 @@ snapshots: acorn: 8.15.0 webpack-virtual-modules: 0.6.2 - unplugin@2.3.5: + unplugin@2.3.10: dependencies: + '@jridgewell/remapping': 2.3.5 acorn: 8.15.0 picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.2 + napi-postinstall: 0.3.3 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -11940,18 +11270,17 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - unstorage@1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0): + unstorage@1.17.1(db0@0.3.2)(ioredis@5.7.0): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 destr: 2.0.5 - h3: 1.15.3 + h3: 1.15.4 lru-cache: 10.4.3 - node-fetch-native: 1.6.6 + node-fetch-native: 1.6.7 ofetch: 1.4.1 ufo: 1.6.1 optionalDependencies: - '@netlify/blobs': 9.1.2 db0: 0.3.2 ioredis: 5.7.0 @@ -11969,18 +11298,18 @@ snapshots: knitwork: 1.2.0 scule: 1.3.0 - unwasm@0.3.9: + unwasm@0.3.11: dependencies: knitwork: 1.2.0 - magic-string: 0.30.17 - mlly: 1.7.4 - pathe: 1.1.2 - pkg-types: 1.3.1 - unplugin: 1.16.1 + magic-string: 0.30.19 + mlly: 1.8.0 + pathe: 2.0.3 + pkg-types: 2.3.0 + unplugin: 2.3.10 - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -11990,38 +11319,27 @@ snapshots: dependencies: punycode: 2.3.1 - urlpattern-polyfill@10.1.0: {} - - urlpattern-polyfill@8.0.2: {} - utf8-byte-length@1.0.5: {} util-deprecate@1.0.2: {} - uuid@11.1.0: {} - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - vite-dev-rpc@1.1.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)): + vite-dev-rpc@1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)): dependencies: birpc: 2.5.0 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vite-hot-client: 2.1.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) - vite-hot-client@2.1.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)): + vite-hot-client@2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)): dependencies: - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) - vite-node@3.2.4(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -12036,93 +11354,76 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.10.1(eslint@9.31.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue-tsc@3.0.4(typescript@5.8.3)): + vite-plugin-checker@0.10.3(eslint@9.36.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.7(typescript@5.9.2)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 npm-run-path: 6.0.0 picocolors: 1.1.1 picomatch: 4.0.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 tiny-invariant: 1.3.3 - tinyglobby: 0.2.14 - vite: 6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + tinyglobby: 0.2.15 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) vscode-uri: 3.1.0 optionalDependencies: - eslint: 9.31.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.5.1) optionator: 0.9.4 - typescript: 5.8.3 - vue-tsc: 3.0.4(typescript@5.8.3) + typescript: 5.9.2 + vue-tsc: 3.0.7(typescript@5.9.2) - vite-plugin-inspect@11.3.2(@nuxt/kit@3.18.0(magicast@0.3.5))(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)): + vite-plugin-inspect@11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)): dependencies: ansis: 4.1.0 - debug: 4.4.1 + debug: 4.4.3 error-stack-parser-es: 1.0.5 ohash: 2.0.11 open: 10.2.0 - perfect-debounce: 1.0.0 - sirv: 3.0.1 - unplugin-utils: 0.2.4 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vite-dev-rpc: 1.1.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.0 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)) optionalDependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) + '@nuxt/kit': 3.19.2(magicast@0.3.5) transitivePeerDependencies: - supports-color - vite-plugin-static-copy@3.1.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)): + vite-plugin-static-copy@3.1.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 - fs-extra: 11.3.0 + fs-extra: 11.3.2 p-map: 7.0.3 picocolors: 1.1.1 - tinyglobby: 0.2.14 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + tinyglobby: 0.2.15 + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) - vite-plugin-vue-tracer@1.0.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))(vue@3.5.22(typescript@5.8.3)): + vite-plugin-vue-tracer@1.0.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.7 - magic-string: 0.30.17 + magic-string: 0.30.19 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vue: 3.5.22(typescript@5.8.3) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) - vite@6.3.5(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): + vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.93.0)(terser@5.44.0)(yaml@2.8.1): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.46.2 - tinyglobby: 0.2.14 + rollup: 4.52.0 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.16.5 + '@types/node': 22.18.6 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.30.1 - sass: 1.89.2 - terser: 5.43.1 - yaml: 2.8.0 - - vite@7.0.6(@types/node@22.16.5)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): - dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.46.2 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.16.5 - fsevents: 2.3.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - sass: 1.89.2 - terser: 5.43.1 - yaml: 2.8.0 + sass: 1.93.0 + terser: 5.44.0 + yaml: 2.8.1 vscode-uri@3.1.0: {} @@ -12132,10 +11433,10 @@ snapshots: vue-devtools-stub@0.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.5.1)): + vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.5.1)): dependencies: - debug: 4.4.1 - eslint: 9.31.0(jiti@2.5.1) + debug: 4.4.3 + eslint: 9.36.0(jiti@2.5.1) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12144,59 +11445,63 @@ snapshots: transitivePeerDependencies: - supports-color - vue-i18n@10.0.8(vue@3.5.22(typescript@5.8.3)): + vue-i18n@10.0.8(vue@3.5.21(typescript@5.9.2)): dependencies: '@intlify/core-base': 10.0.8 '@intlify/shared': 10.0.8 '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)): + vue-router@4.5.1(vue@3.5.21(typescript@5.9.2)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - vue-tsc@3.0.4(typescript@5.8.3): + vue-tsc@3.0.7(typescript@5.9.2): dependencies: - '@volar/typescript': 2.4.20 - '@vue/language-core': 3.0.4(typescript@5.8.3) - typescript: 5.8.3 + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.0.7(typescript@5.9.2) + typescript: 5.9.2 - vue3-carousel-nuxt@1.1.6(magicast@0.3.5)(vue@3.5.22(typescript@5.8.3)): + vue3-carousel-nuxt@1.1.6(magicast@0.3.5)(vue@3.5.21(typescript@5.9.2)): dependencies: - '@nuxt/kit': 3.18.0(magicast@0.3.5) - vue3-carousel: 0.15.1(vue@3.5.22(typescript@5.8.3)) + '@nuxt/kit': 3.19.2(magicast@0.3.5) + vue3-carousel: 0.15.1(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: - magicast - vue - vue3-carousel@0.15.1(vue@3.5.22(typescript@5.8.3)): + vue3-carousel@0.15.1(vue@3.5.21(typescript@5.9.2)): dependencies: - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - vue3-carousel@0.16.0(vue@3.5.22(typescript@5.8.3)): + vue3-carousel@0.16.0(vue@3.5.21(typescript@5.9.2)): dependencies: - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - vue@3.5.22(typescript@5.8.3): + vue@3.5.21(typescript@5.9.2): dependencies: - '@vue/compiler-dom': 3.5.22 - '@vue/compiler-sfc': 3.5.22 - '@vue/runtime-dom': 3.5.22 - '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.8.3)) - '@vue/shared': 3.5.22 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-sfc': 3.5.21 + '@vue/runtime-dom': 3.5.21 + '@vue/server-renderer': 3.5.21(vue@3.5.21(typescript@5.9.2)) + '@vue/shared': 3.5.21 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - vuedraggable@4.1.0(vue@3.5.22(typescript@5.8.3)): + vuedraggable@4.1.0(vue@3.5.21(typescript@5.9.2)): dependencies: sortablejs: 1.14.0 - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.21(typescript@5.9.2) - web-streams-polyfill@3.3.3: {} + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 webidl-conversions@3.0.1: {} + webidl-conversions@8.0.0: {} + webpack-virtual-modules@0.6.2: {} whatwg-encoding@3.1.1: @@ -12205,6 +11510,11 @@ snapshots: whatwg-mimetype@4.0.0: {} + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -12218,26 +11528,6 @@ snapshots: dependencies: isexe: 3.1.1 - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.17.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 - word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -12248,17 +11538,12 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} - write-file-atomic@6.0.0: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - ws@8.18.3: {} wsl-utils@0.1.0: @@ -12267,6 +11552,10 @@ snapshots: xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + xss@1.0.15: dependencies: commander: 2.20.3 @@ -12281,9 +11570,9 @@ snapshots: yaml-eslint-parser@1.3.0: dependencies: eslint-visitor-keys: 3.4.3 - yaml: 2.8.0 + yaml: 2.8.1 - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} @@ -12297,11 +11586,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} yocto-queue@1.2.1: {} @@ -12319,18 +11603,8 @@ snapshots: cookie: 1.0.2 youch-core: 0.3.3 - youch@4.1.0-beta.8: - dependencies: - '@poppinss/colors': 4.1.5 - '@poppinss/dumper': 0.6.4 - '@speed-highlight/core': 1.2.7 - cookie: 1.0.2 - youch-core: 0.3.3 - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.7.0 - - zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c98ca1f..fdb859f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,8 @@ -overrides: - droplet: link:../../.local/share/pnpm/global/5/node_modules/@drop-oss/droplet +onlyBuiltDependencies: + - '@prisma/client' + - '@prisma/engines' + - '@tailwindcss/oxide' + - esbuild + - prisma shamefullyHoist: true diff --git a/prisma/migrations/20240928081254_create_user_and_auth_mechanisms/migration.sql b/prisma/migrations/20240928081254_create_user_and_auth_mechanisms/migration.sql deleted file mode 100644 index 58d7ae2..0000000 --- a/prisma/migrations/20240928081254_create_user_and_auth_mechanisms/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ --- CreateEnum -CREATE TYPE "AuthMec" AS ENUM ('Simple'); - --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL, - "username" TEXT NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "LinkedAuthMec" ( - "userId" TEXT NOT NULL, - "mec" "AuthMec" NOT NULL, - "credentials" TEXT[], - - CONSTRAINT "LinkedAuthMec_pkey" PRIMARY KEY ("userId","mec") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); - --- AddForeignKey -ALTER TABLE "LinkedAuthMec" ADD CONSTRAINT "LinkedAuthMec_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20240928085121_move_to_json_for_credentials/migration.sql b/prisma/migrations/20240928085121_move_to_json_for_credentials/migration.sql deleted file mode 100644 index f77b52a..0000000 --- a/prisma/migrations/20240928085121_move_to_json_for_credentials/migration.sql +++ /dev/null @@ -1,9 +0,0 @@ -/* - Warnings: - - - Changed the type of `credentials` on the `LinkedAuthMec` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. - -*/ --- AlterTable -ALTER TABLE "LinkedAuthMec" DROP COLUMN "credentials", -ADD COLUMN "credentials" JSONB NOT NULL; diff --git a/prisma/migrations/20240929000950_add_game_data/migration.sql b/prisma/migrations/20240929000950_add_game_data/migration.sql deleted file mode 100644 index 1c5b1fc..0000000 --- a/prisma/migrations/20240929000950_add_game_data/migration.sql +++ /dev/null @@ -1,76 +0,0 @@ --- CreateEnum -CREATE TYPE "MetadataSource" AS ENUM ('Custom', 'GiantBomb'); - --- CreateTable -CREATE TABLE "Game" ( - "id" TEXT NOT NULL, - "metadataSource" "MetadataSource" NOT NULL, - "metadataId" TEXT NOT NULL, - "mName" TEXT NOT NULL, - "mShortDescription" TEXT NOT NULL, - "mDescription" TEXT NOT NULL, - "mReviewCount" INTEGER NOT NULL, - "mReviewRating" DOUBLE PRECISION NOT NULL, - "mIconId" TEXT NOT NULL, - "mBannerId" TEXT NOT NULL, - "mArt" TEXT[], - "mScreenshots" TEXT[], - - CONSTRAINT "Game_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Developer" ( - "id" TEXT NOT NULL, - "metadataSource" "MetadataSource" NOT NULL, - "metadataId" TEXT NOT NULL, - "mName" TEXT NOT NULL, - - CONSTRAINT "Developer_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Publisher" ( - "id" TEXT NOT NULL, - "metadataSource" "MetadataSource" NOT NULL, - "metadataId" TEXT NOT NULL, - "mName" TEXT NOT NULL, - - CONSTRAINT "Publisher_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_GameToPublisher" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL -); - --- CreateTable -CREATE TABLE "_DeveloperToGame" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL -); - --- CreateIndex -CREATE UNIQUE INDEX "_GameToPublisher_AB_unique" ON "_GameToPublisher"("A", "B"); - --- CreateIndex -CREATE INDEX "_GameToPublisher_B_index" ON "_GameToPublisher"("B"); - --- CreateIndex -CREATE UNIQUE INDEX "_DeveloperToGame_AB_unique" ON "_DeveloperToGame"("A", "B"); - --- CreateIndex -CREATE INDEX "_DeveloperToGame_B_index" ON "_DeveloperToGame"("B"); - --- AddForeignKey -ALTER TABLE "_GameToPublisher" ADD CONSTRAINT "_GameToPublisher_A_fkey" FOREIGN KEY ("A") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_GameToPublisher" ADD CONSTRAINT "_GameToPublisher_B_fkey" FOREIGN KEY ("B") REFERENCES "Publisher"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_DeveloperToGame" ADD CONSTRAINT "_DeveloperToGame_A_fkey" FOREIGN KEY ("A") REFERENCES "Developer"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_DeveloperToGame" ADD CONSTRAINT "_DeveloperToGame_B_fkey" FOREIGN KEY ("B") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20240929010842_updates_to_metadata_schema/migration.sql b/prisma/migrations/20240929010842_updates_to_metadata_schema/migration.sql deleted file mode 100644 index 913d4c1..0000000 --- a/prisma/migrations/20240929010842_updates_to_metadata_schema/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* - Warnings: - - - Added the required column `mBanner` to the `Developer` table without a default value. This is not possible if the table is not empty. - - Added the required column `mDescription` to the `Developer` table without a default value. This is not possible if the table is not empty. - - Added the required column `mLogo` to the `Developer` table without a default value. This is not possible if the table is not empty. - - Added the required column `mShortDescription` to the `Developer` table without a default value. This is not possible if the table is not empty. - - Added the required column `mBanner` to the `Publisher` table without a default value. This is not possible if the table is not empty. - - Added the required column `mDescription` to the `Publisher` table without a default value. This is not possible if the table is not empty. - - Added the required column `mLogo` to the `Publisher` table without a default value. This is not possible if the table is not empty. - - Added the required column `mShortDescription` to the `Publisher` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Developer" ADD COLUMN "mBanner" TEXT NOT NULL, -ADD COLUMN "mDescription" TEXT NOT NULL, -ADD COLUMN "mLogo" TEXT NOT NULL, -ADD COLUMN "mShortDescription" TEXT NOT NULL; - --- AlterTable -ALTER TABLE "Publisher" ADD COLUMN "mBanner" TEXT NOT NULL, -ADD COLUMN "mDescription" TEXT NOT NULL, -ADD COLUMN "mLogo" TEXT NOT NULL, -ADD COLUMN "mShortDescription" TEXT NOT NULL; diff --git a/prisma/migrations/20241004020835_unique_constraints/migration.sql b/prisma/migrations/20241004020835_unique_constraints/migration.sql deleted file mode 100644 index a475fd5..0000000 --- a/prisma/migrations/20241004020835_unique_constraints/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[metadataSource,metadataId]` on the table `Developer` will be added. If there are existing duplicate values, this will fail. - - A unique constraint covering the columns `[metadataSource,metadataId]` on the table `Game` will be added. If there are existing duplicate values, this will fail. - - A unique constraint covering the columns `[metadataSource,metadataId]` on the table `Publisher` will be added. If there are existing duplicate values, this will fail. - -*/ --- CreateIndex -CREATE UNIQUE INDEX "Developer_metadataSource_metadataId_key" ON "Developer"("metadataSource", "metadataId"); - --- CreateIndex -CREATE UNIQUE INDEX "Game_metadataSource_metadataId_key" ON "Game"("metadataSource", "metadataId"); - --- CreateIndex -CREATE UNIQUE INDEX "Publisher_metadataSource_metadataId_key" ON "Publisher"("metadataSource", "metadataId"); diff --git a/prisma/migrations/20241004025235_add_dev_pub_websites/migration.sql b/prisma/migrations/20241004025235_add_dev_pub_websites/migration.sql deleted file mode 100644 index 0f3e9bf..0000000 --- a/prisma/migrations/20241004025235_add_dev_pub_websites/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - Added the required column `mWebsite` to the `Developer` table without a default value. This is not possible if the table is not empty. - - Added the required column `mWebsite` to the `Publisher` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Developer" ADD COLUMN "mWebsite" TEXT NOT NULL; - --- AlterTable -ALTER TABLE "Publisher" ADD COLUMN "mWebsite" TEXT NOT NULL; diff --git a/prisma/migrations/20241007043002_add_user_admin/migration.sql b/prisma/migrations/20241007043002_add_user_admin/migration.sql deleted file mode 100644 index 554507b..0000000 --- a/prisma/migrations/20241007043002_add_user_admin/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "User" ADD COLUMN "admin" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20241007065541_add_client/migration.sql b/prisma/migrations/20241007065541_add_client/migration.sql deleted file mode 100644 index efca156..0000000 --- a/prisma/migrations/20241007065541_add_client/migration.sql +++ /dev/null @@ -1,15 +0,0 @@ --- CreateEnum -CREATE TYPE "ClientCapabilities" AS ENUM ('DownloadAggregation'); - --- CreateTable -CREATE TABLE "Client" ( - "sharedToken" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "endpoint" TEXT NOT NULL, - "capabilities" "ClientCapabilities"[], - - CONSTRAINT "Client_pkey" PRIMARY KEY ("sharedToken") -); - --- AddForeignKey -ALTER TABLE "Client" ADD CONSTRAINT "Client_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20241008062519_remove_shared_token_and_add_last_connected/migration.sql b/prisma/migrations/20241008062519_remove_shared_token_and_add_last_connected/migration.sql deleted file mode 100644 index 52d9c03..0000000 --- a/prisma/migrations/20241008062519_remove_shared_token_and_add_last_connected/migration.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* - Warnings: - - - The primary key for the `Client` table will be changed. If it partially fails, the table could be left without primary key constraint. - - You are about to drop the column `sharedToken` on the `Client` table. All the data in the column will be lost. - - The required column `id` was added to the `Client` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required. - - Added the required column `lastConnected` to the `Client` table without a default value. This is not possible if the table is not empty. - - Added the required column `name` to the `Client` table without a default value. This is not possible if the table is not empty. - - Added the required column `platform` to the `Client` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Client" DROP CONSTRAINT "Client_pkey", -DROP COLUMN "sharedToken", -ADD COLUMN "id" TEXT NOT NULL, -ADD COLUMN "lastConnected" TIMESTAMP(3) NOT NULL, -ADD COLUMN "name" TEXT NOT NULL, -ADD COLUMN "platform" TEXT NOT NULL, -ADD CONSTRAINT "Client_pkey" PRIMARY KEY ("id"); diff --git a/prisma/migrations/20241009032354_add_account_details/migration.sql b/prisma/migrations/20241009032354_add_account_details/migration.sql deleted file mode 100644 index e731d26..0000000 --- a/prisma/migrations/20241009032354_add_account_details/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - Added the required column `displayName` to the `User` table without a default value. This is not possible if the table is not empty. - - Added the required column `email` to the `User` table without a default value. This is not possible if the table is not empty. - - Added the required column `profilePicture` to the `User` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "User" ADD COLUMN "displayName" TEXT NOT NULL, -ADD COLUMN "email" TEXT NOT NULL, -ADD COLUMN "profilePicture" TEXT NOT NULL; diff --git a/prisma/migrations/20241010062956_add_constraints/migration.sql b/prisma/migrations/20241010062956_add_constraints/migration.sql deleted file mode 100644 index 11e38bc..0000000 --- a/prisma/migrations/20241010062956_add_constraints/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[libraryBasePath]` on the table `Game` will be added. If there are existing duplicate values, this will fail. - - Added the required column `libraryBasePath` to the `Game` table without a default value. This is not possible if the table is not empty. - - Added the required column `versionOrder` to the `Game` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Game" ADD COLUMN "libraryBasePath" TEXT NOT NULL, -ADD COLUMN "versionOrder" TEXT NOT NULL; - --- CreateTable -CREATE TABLE "GameVersion" ( - "gameId" TEXT NOT NULL, - "versionName" TEXT NOT NULL, - - CONSTRAINT "GameVersion_pkey" PRIMARY KEY ("gameId","versionName") -); - --- CreateIndex -CREATE UNIQUE INDEX "Game_libraryBasePath_key" ON "Game"("libraryBasePath"); - --- AddForeignKey -ALTER TABLE "GameVersion" ADD CONSTRAINT "GameVersion_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20241010095344_various_fixes/migration.sql b/prisma/migrations/20241010095344_various_fixes/migration.sql deleted file mode 100644 index 030d2ee..0000000 --- a/prisma/migrations/20241010095344_various_fixes/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ -/* - Warnings: - - - The `versionOrder` column on the `Game` table would be dropped and recreated. This will lead to data loss if there is data in the column. - - Changed the type of `platform` on the `Client` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. - - Added the required column `launchCommand` to the `GameVersion` table without a default value. This is not possible if the table is not empty. - - Added the required column `platform` to the `GameVersion` table without a default value. This is not possible if the table is not empty. - - Added the required column `setupCommand` to the `GameVersion` table without a default value. This is not possible if the table is not empty. - -*/ --- CreateEnum -CREATE TYPE "Platform" AS ENUM ('windows', 'linux'); - --- AlterTable -ALTER TABLE "Client" DROP COLUMN "platform", -ADD COLUMN "platform" "Platform" NOT NULL; - --- AlterTable -ALTER TABLE "Game" DROP COLUMN "versionOrder", -ADD COLUMN "versionOrder" TEXT[]; - --- AlterTable -ALTER TABLE "GameVersion" ADD COLUMN "launchCommand" TEXT NOT NULL, -ADD COLUMN "platform" "Platform" NOT NULL, -ADD COLUMN "setupCommand" TEXT NOT NULL; diff --git a/prisma/migrations/20241010104439_added_original_query_field/migration.sql b/prisma/migrations/20241010104439_added_original_query_field/migration.sql deleted file mode 100644 index 79aa26c..0000000 --- a/prisma/migrations/20241010104439_added_original_query_field/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - Added the required column `metadataOriginalQuery` to the `Developer` table without a default value. This is not possible if the table is not empty. - - Added the required column `metadataOriginalQuery` to the `Publisher` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Developer" ADD COLUMN "metadataOriginalQuery" TEXT NOT NULL; - --- AlterTable -ALTER TABLE "Publisher" ADD COLUMN "metadataOriginalQuery" TEXT NOT NULL; diff --git a/prisma/migrations/20241010104722_fix_unique_constraints/migration.sql b/prisma/migrations/20241010104722_fix_unique_constraints/migration.sql deleted file mode 100644 index 6e22210..0000000 --- a/prisma/migrations/20241010104722_fix_unique_constraints/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[metadataSource,metadataId,metadataOriginalQuery]` on the table `Developer` will be added. If there are existing duplicate values, this will fail. - - A unique constraint covering the columns `[metadataSource,metadataId,metadataOriginalQuery]` on the table `Publisher` will be added. If there are existing duplicate values, this will fail. - -*/ --- DropIndex -DROP INDEX "Developer_metadataSource_metadataId_key"; - --- DropIndex -DROP INDEX "Publisher_metadataSource_metadataId_key"; - --- CreateIndex -CREATE UNIQUE INDEX "Developer_metadataSource_metadataId_metadataOriginalQuery_key" ON "Developer"("metadataSource", "metadataId", "metadataOriginalQuery"); - --- CreateIndex -CREATE UNIQUE INDEX "Publisher_metadataSource_metadataId_metadataOriginalQuery_key" ON "Publisher"("metadataSource", "metadataId", "metadataOriginalQuery"); diff --git a/prisma/migrations/20241011035227_add_droplet_manifest_to_game_versions/migration.sql b/prisma/migrations/20241011035227_add_droplet_manifest_to_game_versions/migration.sql deleted file mode 100644 index 97ed815..0000000 --- a/prisma/migrations/20241011035227_add_droplet_manifest_to_game_versions/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `dropletManifest` to the `GameVersion` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "GameVersion" ADD COLUMN "dropletManifest" JSONB NOT NULL; diff --git a/prisma/migrations/20241011093950_update_game_images_system/migration.sql b/prisma/migrations/20241011093950_update_game_images_system/migration.sql deleted file mode 100644 index 1b436c2..0000000 --- a/prisma/migrations/20241011093950_update_game_images_system/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `mArt` on the `Game` table. All the data in the column will be lost. - - You are about to drop the column `mBannerId` on the `Game` table. All the data in the column will be lost. - - You are about to drop the column `mScreenshots` on the `Game` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "Game" DROP COLUMN "mArt", -DROP COLUMN "mBannerId", -DROP COLUMN "mScreenshots", -ADD COLUMN "mBannerIndex" INTEGER NOT NULL DEFAULT 0, -ADD COLUMN "mImageLibrary" TEXT[]; diff --git a/prisma/migrations/20241011101243_revert_banner_system/migration.sql b/prisma/migrations/20241011101243_revert_banner_system/migration.sql deleted file mode 100644 index 667c783..0000000 --- a/prisma/migrations/20241011101243_revert_banner_system/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `mBannerIndex` on the `Game` table. All the data in the column will be lost. - - Added the required column `mBannerId` to the `Game` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Game" DROP COLUMN "mBannerIndex", -ADD COLUMN "mBannerId" TEXT NOT NULL; diff --git a/prisma/migrations/20241011103116_add_cover_image/migration.sql b/prisma/migrations/20241011103116_add_cover_image/migration.sql deleted file mode 100644 index 0b1aaa0..0000000 --- a/prisma/migrations/20241011103116_add_cover_image/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `mCoverId` to the `Game` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Game" ADD COLUMN "mCoverId" TEXT NOT NULL; diff --git a/prisma/migrations/20241014052934_add_delta_and_order/migration.sql b/prisma/migrations/20241014052934_add_delta_and_order/migration.sql deleted file mode 100644 index 9619d00..0000000 --- a/prisma/migrations/20241014052934_add_delta_and_order/migration.sql +++ /dev/null @@ -1,9 +0,0 @@ -/* - Warnings: - - - Added the required column `versionIndex` to the `GameVersion` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "GameVersion" ADD COLUMN "delta" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "versionIndex" INTEGER NOT NULL; diff --git a/prisma/migrations/20241014053941_remove_version_order/migration.sql b/prisma/migrations/20241014053941_remove_version_order/migration.sql deleted file mode 100644 index 8e05931..0000000 --- a/prisma/migrations/20241014053941_remove_version_order/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `versionOrder` on the `Game` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "Game" DROP COLUMN "versionOrder"; diff --git a/prisma/migrations/20241025091103_add_invitations/migration.sql b/prisma/migrations/20241025091103_add_invitations/migration.sql deleted file mode 100644 index 1b0b37f..0000000 --- a/prisma/migrations/20241025091103_add_invitations/migration.sql +++ /dev/null @@ -1,9 +0,0 @@ --- CreateTable -CREATE TABLE "Invitation" ( - "id" TEXT NOT NULL, - "isAdmin" BOOLEAN NOT NULL DEFAULT false, - "username" TEXT, - "email" TEXT, - - CONSTRAINT "Invitation_pkey" PRIMARY KEY ("id") -); diff --git a/prisma/migrations/20241102000813_create_application_configuration/migration.sql b/prisma/migrations/20241102000813_create_application_configuration/migration.sql deleted file mode 100644 index e07ad83..0000000 --- a/prisma/migrations/20241102000813_create_application_configuration/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- CreateTable -CREATE TABLE "ApplicationSettings" ( - "timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "enabledAuthencationMechanisms" "AuthMec"[], - - CONSTRAINT "ApplicationSettings_pkey" PRIMARY KEY ("timestamp") -); diff --git a/prisma/migrations/20241105221904_different_client_capabilities/migration.sql b/prisma/migrations/20241105221904_different_client_capabilities/migration.sql deleted file mode 100644 index e63a1dc..0000000 --- a/prisma/migrations/20241105221904_different_client_capabilities/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The values [DownloadAggregation] on the enum `ClientCapabilities` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "ClientCapabilities_new" AS ENUM ('PeerAPI', 'UserStatus'); -ALTER TABLE "Client" ALTER COLUMN "capabilities" TYPE "ClientCapabilities_new"[] USING ("capabilities"::text::"ClientCapabilities_new"[]); -ALTER TYPE "ClientCapabilities" RENAME TO "ClientCapabilities_old"; -ALTER TYPE "ClientCapabilities_new" RENAME TO "ClientCapabilities"; -DROP TYPE "ClientCapabilities_old"; -COMMIT; diff --git a/prisma/migrations/20241105222110_trackable_names_for_capabilities/migration.sql b/prisma/migrations/20241105222110_trackable_names_for_capabilities/migration.sql deleted file mode 100644 index 1638c38..0000000 --- a/prisma/migrations/20241105222110_trackable_names_for_capabilities/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The values [PeerAPI,UserStatus] on the enum `ClientCapabilities` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "ClientCapabilities_new" AS ENUM ('peerAPI', 'userStatus'); -ALTER TABLE "Client" ALTER COLUMN "capabilities" TYPE "ClientCapabilities_new"[] USING ("capabilities"::text::"ClientCapabilities_new"[]); -ALTER TYPE "ClientCapabilities" RENAME TO "ClientCapabilities_old"; -ALTER TYPE "ClientCapabilities_new" RENAME TO "ClientCapabilities"; -DROP TYPE "ClientCapabilities_old"; -COMMIT; diff --git a/prisma/migrations/20241105225732_peer_api_configuration/migration.sql b/prisma/migrations/20241105225732_peer_api_configuration/migration.sql deleted file mode 100644 index ecafb93..0000000 --- a/prisma/migrations/20241105225732_peer_api_configuration/migration.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `endpoint` on the `Client` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "Client" DROP COLUMN "endpoint"; - --- CreateTable -CREATE TABLE "ClientPeerAPIConfiguration" ( - "id" TEXT NOT NULL, - "clientId" TEXT NOT NULL, - "ipConfigurations" TEXT[], - - CONSTRAINT "ClientPeerAPIConfiguration_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "ClientPeerAPIConfiguration_clientId_key" ON "ClientPeerAPIConfiguration"("clientId"); - --- AddForeignKey -ALTER TABLE "ClientPeerAPIConfiguration" ADD CONSTRAINT "ClientPeerAPIConfiguration_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "Client"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20241105230021_move_to_endpoint_configuration/migration.sql b/prisma/migrations/20241105230021_move_to_endpoint_configuration/migration.sql deleted file mode 100644 index 619e47c..0000000 --- a/prisma/migrations/20241105230021_move_to_endpoint_configuration/migration.sql +++ /dev/null @@ -1,9 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `ipConfigurations` on the `ClientPeerAPIConfiguration` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "ClientPeerAPIConfiguration" DROP COLUMN "ipConfigurations", -ADD COLUMN "endpoints" TEXT[]; diff --git a/prisma/migrations/20241107080421_add_expiry_for_invitations/migration.sql b/prisma/migrations/20241107080421_add_expiry_for_invitations/migration.sql deleted file mode 100644 index 864239e..0000000 --- a/prisma/migrations/20241107080421_add_expiry_for_invitations/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `expires` to the `Invitation` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Invitation" ADD COLUMN "expires" TIMESTAMP(3) NOT NULL; diff --git a/prisma/migrations/20241116053120_add_notifications/migration.sql b/prisma/migrations/20241116053120_add_notifications/migration.sql deleted file mode 100644 index 230e67c..0000000 --- a/prisma/migrations/20241116053120_add_notifications/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- CreateTable -CREATE TABLE "Notification" ( - "id" TEXT NOT NULL, - "nonce" TEXT, - "userId" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT NOT NULL, - "actions" TEXT[], - "read" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "Notification_nonce_key" ON "Notification"("nonce"); - --- AddForeignKey -ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20241116054212_add_created_time_stamp_to_notifications/migration.sql b/prisma/migrations/20241116054212_add_created_time_stamp_to_notifications/migration.sql deleted file mode 100644 index ec5756c..0000000 --- a/prisma/migrations/20241116054212_add_created_time_stamp_to_notifications/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Notification" ADD COLUMN "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; diff --git a/prisma/migrations/20241122215933_add_created_timestamps_for_games/migration.sql b/prisma/migrations/20241122215933_add_created_timestamps_for_games/migration.sql deleted file mode 100644 index b383c57..0000000 --- a/prisma/migrations/20241122215933_add_created_timestamps_for_games/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "Game" ADD COLUMN "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; - --- AlterTable -ALTER TABLE "GameVersion" ADD COLUMN "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; diff --git a/prisma/migrations/20241124042825_add_released_date_for_the_game/migration.sql b/prisma/migrations/20241124042825_add_released_date_for_the_game/migration.sql deleted file mode 100644 index b2bea83..0000000 --- a/prisma/migrations/20241124042825_add_released_date_for_the_game/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `mReleased` to the `Game` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Game" ADD COLUMN "mReleased" TIMESTAMP(3) NOT NULL; diff --git a/prisma/migrations/20241223022005_add_umu_id_to_game_version/migration.sql b/prisma/migrations/20241223022005_add_umu_id_to_game_version/migration.sql deleted file mode 100644 index 9cac164..0000000 --- a/prisma/migrations/20241223022005_add_umu_id_to_game_version/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "GameVersion" ADD COLUMN "umuIdOverride" TEXT; diff --git a/prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql b/prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql deleted file mode 100644 index c68ac5c..0000000 --- a/prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- DropForeignKey -ALTER TABLE "GameVersion" DROP CONSTRAINT "GameVersion_gameId_fkey"; - --- AddForeignKey -ALTER TABLE "GameVersion" ADD CONSTRAINT "GameVersion_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20241223100418_update_to_prisma_6/migration.sql b/prisma/migrations/20241223100418_update_to_prisma_6/migration.sql deleted file mode 100644 index 6d8bac7..0000000 --- a/prisma/migrations/20241223100418_update_to_prisma_6/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ --- AlterTable -ALTER TABLE "_DeveloperToGame" ADD CONSTRAINT "_DeveloperToGame_AB_pkey" PRIMARY KEY ("A", "B"); - --- DropIndex -DROP INDEX "_DeveloperToGame_AB_unique"; - --- AlterTable -ALTER TABLE "_GameToPublisher" ADD CONSTRAINT "_GameToPublisher_AB_pkey" PRIMARY KEY ("A", "B"); - --- DropIndex -DROP INDEX "_GameToPublisher_AB_unique"; diff --git a/prisma/migrations/20241226065709_rename_custom_to_manual/migration.sql b/prisma/migrations/20241226065709_rename_custom_to_manual/migration.sql deleted file mode 100644 index 7110139..0000000 --- a/prisma/migrations/20241226065709_rename_custom_to_manual/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ -/* - Warnings: - - - The values [Custom] on the enum `MetadataSource` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "MetadataSource_new" AS ENUM ('Manual', 'GiantBomb'); -ALTER TABLE "Game" ALTER COLUMN "metadataSource" TYPE "MetadataSource_new" USING ("metadataSource"::text::"MetadataSource_new"); -ALTER TABLE "Developer" ALTER COLUMN "metadataSource" TYPE "MetadataSource_new" USING ("metadataSource"::text::"MetadataSource_new"); -ALTER TABLE "Publisher" ALTER COLUMN "metadataSource" TYPE "MetadataSource_new" USING ("metadataSource"::text::"MetadataSource_new"); -ALTER TYPE "MetadataSource" RENAME TO "MetadataSource_old"; -ALTER TYPE "MetadataSource_new" RENAME TO "MetadataSource"; -DROP TYPE "MetadataSource_old"; -COMMIT; diff --git a/prisma/migrations/20241226230207_add_image_carousel/migration.sql b/prisma/migrations/20241226230207_add_image_carousel/migration.sql deleted file mode 100644 index 44ccbfb..0000000 --- a/prisma/migrations/20241226230207_add_image_carousel/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Game" ADD COLUMN "mImageCarousel" INTEGER[]; diff --git a/prisma/migrations/20241227033610_move_image_carousel_to_image_ids/migration.sql b/prisma/migrations/20241227033610_move_image_carousel_to_image_ids/migration.sql deleted file mode 100644 index f86124c..0000000 --- a/prisma/migrations/20241227033610_move_image_carousel_to_image_ids/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Game" ALTER COLUMN "mImageCarousel" SET DATA TYPE TEXT[]; diff --git a/prisma/migrations/20241230053403_add_args_and_only_setup/migration.sql b/prisma/migrations/20241230053403_add_args_and_only_setup/migration.sql deleted file mode 100644 index 14383ee..0000000 --- a/prisma/migrations/20241230053403_add_args_and_only_setup/migration.sql +++ /dev/null @@ -1,6 +0,0 @@ --- AlterTable -ALTER TABLE "GameVersion" ADD COLUMN "launchArgs" TEXT[], -ADD COLUMN "onlySetup" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "setupArgs" TEXT[], -ALTER COLUMN "launchCommand" DROP NOT NULL, -ALTER COLUMN "setupCommand" DROP NOT NULL; diff --git a/prisma/migrations/20250103202348_add_collections/migration.sql b/prisma/migrations/20250103202348_add_collections/migration.sql deleted file mode 100644 index 3dd7f22..0000000 --- a/prisma/migrations/20250103202348_add_collections/migration.sql +++ /dev/null @@ -1,29 +0,0 @@ --- CreateTable -CREATE TABLE "Collection" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "isDefault" BOOLEAN NOT NULL DEFAULT false, - "userId" TEXT NOT NULL, - - CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_CollectionToGame" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_CollectionToGame_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateIndex -CREATE INDEX "_CollectionToGame_B_index" ON "_CollectionToGame"("B"); - --- AddForeignKey -ALTER TABLE "Collection" ADD CONSTRAINT "Collection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_CollectionToGame" ADD CONSTRAINT "_CollectionToGame_A_fkey" FOREIGN KEY ("A") REFERENCES "Collection"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_CollectionToGame" ADD CONSTRAINT "_CollectionToGame_B_fkey" FOREIGN KEY ("B") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250109005948_use_collection_entry_to_ensure_unique_games/migration.sql b/prisma/migrations/20250109005948_use_collection_entry_to_ensure_unique_games/migration.sql deleted file mode 100644 index 0e4a76f..0000000 --- a/prisma/migrations/20250109005948_use_collection_entry_to_ensure_unique_games/migration.sql +++ /dev/null @@ -1,28 +0,0 @@ -/* - Warnings: - - - You are about to drop the `_CollectionToGame` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE "_CollectionToGame" DROP CONSTRAINT "_CollectionToGame_A_fkey"; - --- DropForeignKey -ALTER TABLE "_CollectionToGame" DROP CONSTRAINT "_CollectionToGame_B_fkey"; - --- DropTable -DROP TABLE "_CollectionToGame"; - --- CreateTable -CREATE TABLE "CollectionEntry" ( - "collectionId" TEXT NOT NULL, - "gameId" TEXT NOT NULL, - - CONSTRAINT "CollectionEntry_pkey" PRIMARY KEY ("collectionId","gameId") -); - --- AddForeignKey -ALTER TABLE "CollectionEntry" ADD CONSTRAINT "CollectionEntry_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "CollectionEntry" ADD CONSTRAINT "CollectionEntry_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250128060446_casacad_e_delete_for_collection_entries/migration.sql b/prisma/migrations/20250128060446_casacad_e_delete_for_collection_entries/migration.sql deleted file mode 100644 index fb40ca3..0000000 --- a/prisma/migrations/20250128060446_casacad_e_delete_for_collection_entries/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- DropForeignKey -ALTER TABLE "CollectionEntry" DROP CONSTRAINT "CollectionEntry_collectionId_fkey"; - --- AddForeignKey -ALTER TABLE "CollectionEntry" ADD CONSTRAINT "CollectionEntry_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250128102738_add_news/migration.sql b/prisma/migrations/20250128102738_add_news/migration.sql deleted file mode 100644 index 68b2aca..0000000 --- a/prisma/migrations/20250128102738_add_news/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ --- CreateTable -CREATE TABLE "news" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "excerpt" TEXT NOT NULL, - "tags" TEXT[], - "image" TEXT, - "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "authorId" TEXT NOT NULL, - - CONSTRAINT "news_pkey" PRIMARY KEY ("id") -); - --- AddForeignKey -ALTER TABLE "news" ADD CONSTRAINT "news_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250204010021_add_tokens/migration.sql b/prisma/migrations/20250204010021_add_tokens/migration.sql deleted file mode 100644 index 3023727..0000000 --- a/prisma/migrations/20250204010021_add_tokens/migration.sql +++ /dev/null @@ -1,15 +0,0 @@ --- CreateEnum -CREATE TYPE "APITokenMode" AS ENUM ('User', 'System'); - --- CreateTable -CREATE TABLE "APIToken" ( - "token" TEXT NOT NULL, - "mode" "APITokenMode" NOT NULL, - "userId" TEXT, - "acls" TEXT[], - - CONSTRAINT "APIToken_pkey" PRIMARY KEY ("token") -); - --- AddForeignKey -ALTER TABLE "APIToken" ADD CONSTRAINT "APIToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20250204020918_add_collection_entry_casacade_delete/migration.sql b/prisma/migrations/20250204020918_add_collection_entry_casacade_delete/migration.sql deleted file mode 100644 index 846ce19..0000000 --- a/prisma/migrations/20250204020918_add_collection_entry_casacade_delete/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- DropForeignKey -ALTER TABLE "CollectionEntry" DROP CONSTRAINT "CollectionEntry_gameId_fkey"; - --- AddForeignKey -ALTER TABLE "CollectionEntry" ADD CONSTRAINT "CollectionEntry_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250208004345_add_api_token_name/migration.sql b/prisma/migrations/20250208004345_add_api_token_name/migration.sql deleted file mode 100644 index 26cfe96..0000000 --- a/prisma/migrations/20250208004345_add_api_token_name/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `name` to the `APIToken` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "APIToken" ADD COLUMN "name" TEXT NOT NULL; diff --git a/prisma/migrations/20250208005625_add_id_to_token/migration.sql b/prisma/migrations/20250208005625_add_id_to_token/migration.sql deleted file mode 100644 index 2a9e0b0..0000000 --- a/prisma/migrations/20250208005625_add_id_to_token/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The primary key for the `APIToken` table will be changed. If it partially fails, the table could be left without primary key constraint. - - The required column `id` was added to the `APIToken` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required. - -*/ --- AlterTable -ALTER TABLE "APIToken" DROP CONSTRAINT "APIToken_pkey", -ADD COLUMN "id" TEXT NOT NULL, -ADD CONSTRAINT "APIToken_pkey" PRIMARY KEY ("id"); - --- CreateIndex -CREATE INDEX "APIToken_token_idx" ON "APIToken"("token"); diff --git a/prisma/migrations/20250211230021_ensure_non_null_launch_and_setup_commands/migration.sql b/prisma/migrations/20250211230021_ensure_non_null_launch_and_setup_commands/migration.sql deleted file mode 100644 index 79a655d..0000000 --- a/prisma/migrations/20250211230021_ensure_non_null_launch_and_setup_commands/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - Warnings: - - - Made the column `launchCommand` on table `GameVersion` required. This step will fail if there are existing NULL values in that column. - - Made the column `setupCommand` on table `GameVersion` required. This step will fail if there are existing NULL values in that column. - -*/ -UPDATE "GameVersion" -SET "launchCommand" = '' -WHERE "launchCommand" is NULL; - -UPDATE "GameVersion" -SET "setupCommand" = '' -WHERE "launchCommand" is NULL; - --- AlterTable -ALTER TABLE "GameVersion" ALTER COLUMN "launchCommand" SET NOT NULL, -ALTER COLUMN "launchCommand" SET DEFAULT '', -ALTER COLUMN "setupCommand" SET NOT NULL, -ALTER COLUMN "setupCommand" SET DEFAULT ''; diff --git a/prisma/migrations/20250309234300_news_articles/migration.sql b/prisma/migrations/20250309234300_news_articles/migration.sql deleted file mode 100644 index 23a25c0..0000000 --- a/prisma/migrations/20250309234300_news_articles/migration.sql +++ /dev/null @@ -1,52 +0,0 @@ -/* - Warnings: - - - You are about to drop the `news` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE "news" DROP CONSTRAINT "news_authorId_fkey"; - --- DropTable -DROP TABLE "news"; - --- CreateTable -CREATE TABLE "Tag" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - - CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Article" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT NOT NULL, - "content" TEXT NOT NULL, - "image" TEXT, - "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "authorId" TEXT, - - CONSTRAINT "Article_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_ArticleToTag" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_ArticleToTag_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateIndex -CREATE INDEX "_ArticleToTag_B_index" ON "_ArticleToTag"("B"); - --- AddForeignKey -ALTER TABLE "Article" ADD CONSTRAINT "Article_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_ArticleToTag" ADD CONSTRAINT "_ArticleToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_ArticleToTag" ADD CONSTRAINT "_ArticleToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250309234801_make_tags_unique/migration.sql b/prisma/migrations/20250309234801_make_tags_unique/migration.sql deleted file mode 100644 index 918aee1..0000000 --- a/prisma/migrations/20250309234801_make_tags_unique/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[name]` on the table `Tag` will be added. If there are existing duplicate values, this will fail. - -*/ --- CreateIndex -CREATE UNIQUE INDEX "Tag_name_key" ON "Tag"("name"); diff --git a/prisma/migrations/20250309234846_make_tokens_unique/migration.sql b/prisma/migrations/20250309234846_make_tokens_unique/migration.sql deleted file mode 100644 index a09d63c..0000000 --- a/prisma/migrations/20250309234846_make_tokens_unique/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[token]` on the table `APIToken` will be added. If there are existing duplicate values, this will fail. - -*/ --- CreateIndex -CREATE UNIQUE INDEX "APIToken_token_key" ON "APIToken"("token"); diff --git a/prisma/migrations/20250311073601_add_macos_as_a_platform/migration.sql b/prisma/migrations/20250311073601_add_macos_as_a_platform/migration.sql deleted file mode 100644 index f2f6840..0000000 --- a/prisma/migrations/20250311073601_add_macos_as_a_platform/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterEnum -ALTER TYPE "Platform" ADD VALUE 'macos'; diff --git a/prisma/migrations/20250312230736_add_metadata_providers_to_appconfig/migration.sql b/prisma/migrations/20250312230736_add_metadata_providers_to_appconfig/migration.sql deleted file mode 100644 index 54f1097..0000000 --- a/prisma/migrations/20250312230736_add_metadata_providers_to_appconfig/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "ApplicationSettings" ADD COLUMN "metadataProviders" TEXT[]; diff --git a/prisma/migrations/20250313042306_add_igdb_pcgamingwiki_metadata/migration.sql b/prisma/migrations/20250313042306_add_igdb_pcgamingwiki_metadata/migration.sql deleted file mode 100644 index 152b5fb..0000000 --- a/prisma/migrations/20250313042306_add_igdb_pcgamingwiki_metadata/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. - - -ALTER TYPE "MetadataSource" ADD VALUE 'PCGamingWiki'; -ALTER TYPE "MetadataSource" ADD VALUE 'IGDB'; diff --git a/prisma/migrations/20250313053250_add_enable_fields_to_auth_and_users/migration.sql b/prisma/migrations/20250313053250_add_enable_fields_to_auth_and_users/migration.sql deleted file mode 100644 index de27367..0000000 --- a/prisma/migrations/20250313053250_add_enable_fields_to_auth_and_users/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "LinkedAuthMec" ADD COLUMN "enabled" BOOLEAN NOT NULL DEFAULT true; - --- AlterTable -ALTER TABLE "User" ADD COLUMN "enabled" BOOLEAN NOT NULL DEFAULT true; diff --git a/prisma/migrations/20250314153636_store_ca_and_session_in_db/migration.sql b/prisma/migrations/20250314153636_store_ca_and_session_in_db/migration.sql deleted file mode 100644 index b342bf4..0000000 --- a/prisma/migrations/20250314153636_store_ca_and_session_in_db/migration.sql +++ /dev/null @@ -1,17 +0,0 @@ --- CreateTable -CREATE TABLE "Certificate" ( - "id" TEXT NOT NULL, - "privateKey" TEXT NOT NULL, - "certificate" TEXT NOT NULL, - "blacklisted" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "Certificate_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Session" ( - "token" TEXT NOT NULL, - "data" JSONB NOT NULL, - - CONSTRAINT "Session_pkey" PRIMARY KEY ("token") -); diff --git a/prisma/migrations/20250324014736_add_auth_mek_version/migration.sql b/prisma/migrations/20250324014736_add_auth_mek_version/migration.sql deleted file mode 100644 index a6bdfb7..0000000 --- a/prisma/migrations/20250324014736_add_auth_mek_version/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "LinkedAuthMec" ADD COLUMN "version" INTEGER NOT NULL DEFAULT 1; diff --git a/prisma/migrations/20250401082200_add_save_slots/migration.sql b/prisma/migrations/20250401082200_add_save_slots/migration.sql deleted file mode 100644 index d55a36c..0000000 --- a/prisma/migrations/20250401082200_add_save_slots/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ --- AlterEnum -ALTER TYPE "ClientCapabilities" ADD VALUE 'save'; - --- CreateTable -CREATE TABLE "SaveSlot" ( - "gameId" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "index" INTEGER NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "playtime" DOUBLE PRECISION NOT NULL, - "lastUsedClientId" TEXT NOT NULL, - "data" TEXT[], - - CONSTRAINT "SaveSlot_pkey" PRIMARY KEY ("gameId","userId","index") -); - --- AddForeignKey -ALTER TABLE "SaveSlot" ADD CONSTRAINT "SaveSlot_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "SaveSlot" ADD CONSTRAINT "SaveSlot_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "SaveSlot" ADD CONSTRAINT "SaveSlot_lastUsedClientId_fkey" FOREIGN KEY ("lastUsedClientId") REFERENCES "Client"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250401082605_add_save_slot_limits_to_application_settings/migration.sql b/prisma/migrations/20250401082605_add_save_slot_limits_to_application_settings/migration.sql deleted file mode 100644 index 158a843..0000000 --- a/prisma/migrations/20250401082605_add_save_slot_limits_to_application_settings/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- AlterTable -ALTER TABLE "ApplicationSettings" ADD COLUMN "saveSlotCountLimit" INTEGER NOT NULL DEFAULT 5, -ADD COLUMN "saveSlotSizeLimit" DOUBLE PRECISION NOT NULL DEFAULT 10; diff --git a/prisma/migrations/20250401083942_rename_save_to_cloud_saves/migration.sql b/prisma/migrations/20250401083942_rename_save_to_cloud_saves/migration.sql deleted file mode 100644 index 50afe85..0000000 --- a/prisma/migrations/20250401083942_rename_save_to_cloud_saves/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The values [save] on the enum `ClientCapabilities` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "ClientCapabilities_new" AS ENUM ('peerAPI', 'userStatus', 'cloudSaves'); -ALTER TABLE "Client" ALTER COLUMN "capabilities" TYPE "ClientCapabilities_new"[] USING ("capabilities"::text::"ClientCapabilities_new"[]); -ALTER TYPE "ClientCapabilities" RENAME TO "ClientCapabilities_old"; -ALTER TYPE "ClientCapabilities_new" RENAME TO "ClientCapabilities"; -DROP TYPE "ClientCapabilities_old"; -COMMIT; diff --git a/prisma/migrations/20250401084907_add_history_limit/migration.sql b/prisma/migrations/20250401084907_add_history_limit/migration.sql deleted file mode 100644 index fca349d..0000000 --- a/prisma/migrations/20250401084907_add_history_limit/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "ApplicationSettings" ADD COLUMN "saveSlotHistoryLimit" INTEGER NOT NULL DEFAULT 3; diff --git a/prisma/migrations/20250401085406_add_default_to_playtime/migration.sql b/prisma/migrations/20250401085406_add_default_to_playtime/migration.sql deleted file mode 100644 index 2e48923..0000000 --- a/prisma/migrations/20250401085406_add_default_to_playtime/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "SaveSlot" ALTER COLUMN "playtime" SET DEFAULT 0; diff --git a/prisma/migrations/20250401091937_add_history_and_hashes/migration.sql b/prisma/migrations/20250401091937_add_history_and_hashes/migration.sql deleted file mode 100644 index 1c39120..0000000 --- a/prisma/migrations/20250401091937_add_history_and_hashes/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `data` on the `SaveSlot` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "SaveSlot" DROP COLUMN "data", -ADD COLUMN "history" TEXT[], -ADD COLUMN "historyChecksums" TEXT[]; diff --git a/prisma/migrations/20250403233442_apply_store_changes/migration.sql b/prisma/migrations/20250403233442_apply_store_changes/migration.sql deleted file mode 100644 index 2a71099..0000000 --- a/prisma/migrations/20250403233442_apply_store_changes/migration.sql +++ /dev/null @@ -1,13 +0,0 @@ -/* - Warnings: - - - Added the required column `expiresAt` to the `Session` table without a default value. This is not possible if the table is not empty. - - Added the required column `userId` to the `Session` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Session" ADD COLUMN "expiresAt" TIMESTAMP(3) NOT NULL, -ADD COLUMN "userId" TEXT NOT NULL; - --- AddForeignKey -ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250405062945_make_last_accessed_optional_on_save_slots/migration.sql b/prisma/migrations/20250405062945_make_last_accessed_optional_on_save_slots/migration.sql deleted file mode 100644 index fef07e3..0000000 --- a/prisma/migrations/20250405062945_make_last_accessed_optional_on_save_slots/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- DropForeignKey -ALTER TABLE "SaveSlot" DROP CONSTRAINT "SaveSlot_lastUsedClientId_fkey"; - --- AlterTable -ALTER TABLE "SaveSlot" ALTER COLUMN "lastUsedClientId" DROP NOT NULL; - --- AddForeignKey -ALTER TABLE "SaveSlot" ADD CONSTRAINT "SaveSlot_lastUsedClientId_fkey" FOREIGN KEY ("lastUsedClientId") REFERENCES "Client"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20250407090729_add_client_token_mode/migration.sql b/prisma/migrations/20250407090729_add_client_token_mode/migration.sql deleted file mode 100644 index 3af3976..0000000 --- a/prisma/migrations/20250407090729_add_client_token_mode/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterEnum -ALTER TYPE "APITokenMode" ADD VALUE 'Client'; diff --git a/prisma/migrations/20250407091012_add_client_token_field_to_apitoken/migration.sql b/prisma/migrations/20250407091012_add_client_token_field_to_apitoken/migration.sql deleted file mode 100644 index 406edd4..0000000 --- a/prisma/migrations/20250407091012_add_client_token_field_to_apitoken/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "APIToken" ADD COLUMN "clientId" TEXT; - --- AddForeignKey -ALTER TABLE "APIToken" ADD CONSTRAINT "APIToken_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "Client"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250414002714_add_object_hash/migration.sql b/prisma/migrations/20250414002714_add_object_hash/migration.sql deleted file mode 100644 index b0c17b0..0000000 --- a/prisma/migrations/20250414002714_add_object_hash/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- CreateTable -CREATE TABLE "ObjectHash" ( - "id" TEXT NOT NULL, - "hash" TEXT NOT NULL, - - CONSTRAINT "ObjectHash_pkey" PRIMARY KEY ("id") -); diff --git a/prisma/migrations/20250507120031_add_openid_authmek/migration.sql b/prisma/migrations/20250507120031_add_openid_authmek/migration.sql deleted file mode 100644 index c48e6a0..0000000 --- a/prisma/migrations/20250507120031_add_openid_authmek/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterEnum -ALTER TYPE "AuthMec" ADD VALUE 'OpenID'; diff --git a/prisma/migrations/20250507223112_remove_authentication_option_from_applicationsettings/migration.sql b/prisma/migrations/20250507223112_remove_authentication_option_from_applicationsettings/migration.sql deleted file mode 100644 index 0397f5f..0000000 --- a/prisma/migrations/20250507223112_remove_authentication_option_from_applicationsettings/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `enabledAuthencationMechanisms` on the `ApplicationSettings` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "ApplicationSettings" DROP COLUMN "enabledAuthencationMechanisms"; diff --git a/prisma/migrations/20250508153613_add_screenshots/migration.sql b/prisma/migrations/20250508153613_add_screenshots/migration.sql deleted file mode 100644 index 08869af..0000000 --- a/prisma/migrations/20250508153613_add_screenshots/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ --- CreateTable -CREATE TABLE "Screenshot" ( - "id" TEXT NOT NULL, - "gameId" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "objectId" TEXT NOT NULL, - "private" BOOLEAN NOT NULL DEFAULT true, - "createdAt" TIMESTAMPTZ(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Screenshot_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE INDEX "Screenshot_gameId_userId_idx" ON "Screenshot"("gameId", "userId"); - --- AddForeignKey -ALTER TABLE "Screenshot" ADD CONSTRAINT "Screenshot_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Screenshot" ADD CONSTRAINT "Screenshot_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250508224553_cleanup_old_objects/migration.sql b/prisma/migrations/20250508224553_cleanup_old_objects/migration.sql deleted file mode 100644 index 2de26c3..0000000 --- a/prisma/migrations/20250508224553_cleanup_old_objects/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ - --- Rename game table columns -ALTER TABLE "Game" RENAME COLUMN "mIconId" TO "mIconObjectId"; -ALTER TABLE "Game" RENAME COLUMN "mBannerId" TO "mBannerObjectId"; -ALTER TABLE "Game" RENAME COLUMN "mCoverId" TO "mCoverObjectId"; -ALTER TABLE "Game" RENAME COLUMN "mImageCarousel" TO "mImageCarouselObjectIds"; -ALTER TABLE "Game" RENAME COLUMN "mImageLibrary" TO "mImageLibraryObjectIds"; - --- Rename saveslot table columns -ALTER TABLE "SaveSlot" RENAME COLUMN "history" TO "historyObjectIds"; - --- Rename article table columns -ALTER TABLE "Article" RENAME COLUMN "image" TO "imageObjectId"; - --- Rename user table columns -ALTER TABLE "User" RENAME COLUMN "profilePicture" TO "profilePictureObjectId"; diff --git a/prisma/migrations/20250509003340_init_unified_company_metadata/migration.sql b/prisma/migrations/20250509003340_init_unified_company_metadata/migration.sql deleted file mode 100644 index ac49e82..0000000 --- a/prisma/migrations/20250509003340_init_unified_company_metadata/migration.sql +++ /dev/null @@ -1,35 +0,0 @@ --- CreateTable -CREATE TABLE "Company" ( - "id" TEXT NOT NULL, - "metadataSource" "MetadataSource" NOT NULL, - "metadataId" TEXT NOT NULL, - "metadataOriginalQuery" TEXT NOT NULL, - "mName" TEXT NOT NULL, - "mShortDescription" TEXT NOT NULL, - "mDescription" TEXT NOT NULL, - "mLogoObjectId" TEXT NOT NULL, - "mBannerObjectId" TEXT NOT NULL, - "mWebsite" TEXT NOT NULL, - - CONSTRAINT "Company_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "CompanyGameRelation" ( - "companyId" TEXT NOT NULL, - "gameId" TEXT NOT NULL, - "developer" BOOLEAN NOT NULL DEFAULT false, - "publisher" BOOLEAN NOT NULL DEFAULT false -); - --- CreateIndex -CREATE UNIQUE INDEX "Company_metadataSource_metadataId_key" ON "Company"("metadataSource", "metadataId"); - --- CreateIndex -CREATE UNIQUE INDEX "CompanyGameRelation_companyId_gameId_key" ON "CompanyGameRelation"("companyId", "gameId"); - --- AddForeignKey -ALTER TABLE "CompanyGameRelation" ADD CONSTRAINT "CompanyGameRelation_companyId_fkey" FOREIGN KEY ("companyId") REFERENCES "Company"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "CompanyGameRelation" ADD CONSTRAINT "CompanyGameRelation_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250510013650_remove_devlopers_and_publishers/migration.sql b/prisma/migrations/20250510013650_remove_devlopers_and_publishers/migration.sql deleted file mode 100644 index 00fb46d..0000000 --- a/prisma/migrations/20250510013650_remove_devlopers_and_publishers/migration.sql +++ /dev/null @@ -1,76 +0,0 @@ -/* - Warnings: - - - You are about to drop the `CompanyGameRelation` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `Developer` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `Publisher` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `_DeveloperToGame` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `_GameToPublisher` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE "CompanyGameRelation" DROP CONSTRAINT "CompanyGameRelation_companyId_fkey"; - --- DropForeignKey -ALTER TABLE "CompanyGameRelation" DROP CONSTRAINT "CompanyGameRelation_gameId_fkey"; - --- DropForeignKey -ALTER TABLE "_DeveloperToGame" DROP CONSTRAINT "_DeveloperToGame_A_fkey"; - --- DropForeignKey -ALTER TABLE "_DeveloperToGame" DROP CONSTRAINT "_DeveloperToGame_B_fkey"; - --- DropForeignKey -ALTER TABLE "_GameToPublisher" DROP CONSTRAINT "_GameToPublisher_A_fkey"; - --- DropForeignKey -ALTER TABLE "_GameToPublisher" DROP CONSTRAINT "_GameToPublisher_B_fkey"; - --- DropTable -DROP TABLE "CompanyGameRelation"; - --- DropTable -DROP TABLE "Developer"; - --- DropTable -DROP TABLE "Publisher"; - --- DropTable -DROP TABLE "_DeveloperToGame"; - --- DropTable -DROP TABLE "_GameToPublisher"; - --- CreateTable -CREATE TABLE "_developers" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_developers_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateTable -CREATE TABLE "_publishers" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_publishers_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateIndex -CREATE INDEX "_developers_B_index" ON "_developers"("B"); - --- CreateIndex -CREATE INDEX "_publishers_B_index" ON "_publishers"("B"); - --- AddForeignKey -ALTER TABLE "_developers" ADD CONSTRAINT "_developers_A_fkey" FOREIGN KEY ("A") REFERENCES "Company"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_developers" ADD CONSTRAINT "_developers_B_fkey" FOREIGN KEY ("B") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_publishers" ADD CONSTRAINT "_publishers_A_fkey" FOREIGN KEY ("A") REFERENCES "Company"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_publishers" ADD CONSTRAINT "_publishers_B_fkey" FOREIGN KEY ("B") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250511154134_add_tags_to_games/migration.sql b/prisma/migrations/20250511154134_add_tags_to_games/migration.sql deleted file mode 100644 index fb10131..0000000 --- a/prisma/migrations/20250511154134_add_tags_to_games/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ --- CreateTable -CREATE TABLE "_GameToTag" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_GameToTag_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateIndex -CREATE INDEX "_GameToTag_B_index" ON "_GameToTag"("B"); - --- AddForeignKey -ALTER TABLE "_GameToTag" ADD CONSTRAINT "_GameToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_GameToTag" ADD CONSTRAINT "_GameToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql b/prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql deleted file mode 100644 index 035b237..0000000 --- a/prisma/migrations/20250514193830_allow_notification_nonce_reuse_per_user/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[userId,nonce]` on the table `Notification` will be added. If there are existing duplicate values, this will fail. - -*/ --- DropIndex -DROP INDEX "Notification_nonce_key"; - --- CreateIndex -CREATE UNIQUE INDEX "Notification_userId_nonce_key" ON "Notification"("userId", "nonce"); diff --git a/prisma/migrations/20250515021331_add_game_ratings/migration.sql b/prisma/migrations/20250515021331_add_game_ratings/migration.sql deleted file mode 100644 index 52a2f5f..0000000 --- a/prisma/migrations/20250515021331_add_game_ratings/migration.sql +++ /dev/null @@ -1,41 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `mReviewCount` on the `Game` table. All the data in the column will be lost. - - You are about to drop the column `mReviewRating` on the `Game` table. All the data in the column will be lost. - -*/ --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. - - -ALTER TYPE "MetadataSource" ADD VALUE 'Metacritic'; -ALTER TYPE "MetadataSource" ADD VALUE 'OpenCritic'; - --- AlterTable -ALTER TABLE "Game" DROP COLUMN "mReviewCount", -DROP COLUMN "mReviewRating"; - --- CreateTable -CREATE TABLE "GameRating" ( - "id" TEXT NOT NULL, - "metadataSource" "MetadataSource" NOT NULL, - "metadataId" TEXT NOT NULL, - "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "mReviewCount" INTEGER NOT NULL, - "mReviewRating" DOUBLE PRECISION NOT NULL, - "mReviewHref" TEXT, - "gameId" TEXT NOT NULL, - - CONSTRAINT "GameRating_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "GameRating_metadataSource_metadataId_key" ON "GameRating"("metadataSource", "metadataId"); - --- AddForeignKey -ALTER TABLE "GameRating" ADD CONSTRAINT "GameRating_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql b/prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql deleted file mode 100644 index 2f6fdd8..0000000 --- a/prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Notification" ADD COLUMN "acls" TEXT[]; diff --git a/prisma/migrations/20250601022736_add_database_library/migration.sql b/prisma/migrations/20250601022736_add_database_library/migration.sql deleted file mode 100644 index e51f2fa..0000000 --- a/prisma/migrations/20250601022736_add_database_library/migration.sql +++ /dev/null @@ -1,53 +0,0 @@ -/* - Warnings: - - - You are about to drop the `ClientPeerAPIConfiguration` table. If the table is not empty, all the data it contains will be lost. - -*/ --- CreateEnum -CREATE TYPE "LibraryBackend" AS ENUM ('Filesystem'); - --- AlterEnum -ALTER TYPE "ClientCapabilities" ADD VALUE 'trackPlaytime'; - --- DropForeignKey -ALTER TABLE "ClientPeerAPIConfiguration" DROP CONSTRAINT "ClientPeerAPIConfiguration_clientId_fkey"; - --- AlterTable -ALTER TABLE "Screenshot" ALTER COLUMN "private" DROP DEFAULT; - --- DropTable -DROP TABLE "ClientPeerAPIConfiguration"; - --- CreateTable -CREATE TABLE "Library" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "backend" "LibraryBackend" NOT NULL, - "options" JSONB NOT NULL, - - CONSTRAINT "Library_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Playtime" ( - "gameId" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "seconds" INTEGER NOT NULL, - "updatedAt" TIMESTAMPTZ(6) NOT NULL, - "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Playtime_pkey" PRIMARY KEY ("gameId","userId") -); - --- CreateIndex -CREATE INDEX "Playtime_userId_idx" ON "Playtime"("userId"); - --- CreateIndex -CREATE INDEX "Screenshot_userId_idx" ON "Screenshot"("userId"); - --- AddForeignKey -ALTER TABLE "Playtime" ADD CONSTRAINT "Playtime_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Playtime" ADD CONSTRAINT "Playtime_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql b/prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql deleted file mode 100644 index e50aac1..0000000 --- a/prisma/migrations/20250601032211_add_library_relation_to_game/migration.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* -Warnings: - -- You are about to drop the column `libraryBasePath` on the `Game` table. All the data in the column will be lost. - -*/ --- DropIndex -DROP INDEX "Game_libraryBasePath_key"; - --- AlterTable -ALTER TABLE "Game" RENAME COLUMN "libraryBasePath" TO "libraryPath"; - -ALTER TABLE "Game" ADD COLUMN "libraryId" TEXT; - --- AddForeignKey -ALTER TABLE "Game" -ADD CONSTRAINT "Game_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library" ("id") ON DELETE SET NULL ON UPDATE CASCADE; \ No newline at end of file diff --git a/prisma/migrations/20250601032938_add_unique_constraint/migration.sql b/prisma/migrations/20250601032938_add_unique_constraint/migration.sql deleted file mode 100644 index f460020..0000000 --- a/prisma/migrations/20250601032938_add_unique_constraint/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[libraryId,libraryPath]` on the table `Game` will be added. If there are existing duplicate values, this will fail. - -*/ --- CreateIndex -CREATE UNIQUE INDEX "Game_libraryId_libraryPath_key" ON "Game"("libraryId", "libraryPath"); diff --git a/prisma/migrations/20250606013242_add_tasks_to_database/migration.sql b/prisma/migrations/20250606013242_add_tasks_to_database/migration.sql deleted file mode 100644 index e3aa449..0000000 --- a/prisma/migrations/20250606013242_add_tasks_to_database/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ --- CreateTable -CREATE TABLE "Task" ( - "id" TEXT NOT NULL, - "taskGroup" TEXT NOT NULL, - "started" TIMESTAMP(3) NOT NULL, - "ended" TIMESTAMP(3) NOT NULL, - "success" BOOLEAN NOT NULL, - "error" JSONB, - "progress" DOUBLE PRECISION NOT NULL, - "log" TEXT[], - "acls" TEXT[], - - CONSTRAINT "Task_pkey" PRIMARY KEY ("id") -); diff --git a/prisma/migrations/20250606023802_add_name_to_task/migration.sql b/prisma/migrations/20250606023802_add_name_to_task/migration.sql deleted file mode 100644 index db4f781..0000000 --- a/prisma/migrations/20250606023802_add_name_to_task/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `name` to the `Task` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Task" ADD COLUMN "name" TEXT NOT NULL; diff --git a/prisma/migrations/20250608010030_delete_user_cascade/migration.sql b/prisma/migrations/20250608010030_delete_user_cascade/migration.sql deleted file mode 100644 index d9e569a..0000000 --- a/prisma/migrations/20250608010030_delete_user_cascade/migration.sql +++ /dev/null @@ -1,41 +0,0 @@ --- DropForeignKey -ALTER TABLE "APIToken" DROP CONSTRAINT "APIToken_userId_fkey"; - --- DropForeignKey -ALTER TABLE "Article" DROP CONSTRAINT "Article_authorId_fkey"; - --- DropForeignKey -ALTER TABLE "Client" DROP CONSTRAINT "Client_userId_fkey"; - --- DropForeignKey -ALTER TABLE "Collection" DROP CONSTRAINT "Collection_userId_fkey"; - --- DropForeignKey -ALTER TABLE "LinkedAuthMec" DROP CONSTRAINT "LinkedAuthMec_userId_fkey"; - --- DropForeignKey -ALTER TABLE "Notification" DROP CONSTRAINT "Notification_userId_fkey"; - --- DropForeignKey -ALTER TABLE "Session" DROP CONSTRAINT "Session_userId_fkey"; - --- AddForeignKey -ALTER TABLE "LinkedAuthMec" ADD CONSTRAINT "LinkedAuthMec_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "APIToken" ADD CONSTRAINT "APIToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Client" ADD CONSTRAINT "Client_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Collection" ADD CONSTRAINT "Collection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Article" ADD CONSTRAINT "Article_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql b/prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql deleted file mode 100644 index c0cd66d..0000000 --- a/prisma/migrations/20250621205541_add_show_title_description_on_game_panel/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "ApplicationSettings" ADD COLUMN "showGamePanelTextDecoration" BOOLEAN NOT NULL DEFAULT true; diff --git a/prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql b/prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql deleted file mode 100644 index 355bd24..0000000 --- a/prisma/migrations/20250702102624_add_flat_fs_provider/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterEnum -ALTER TYPE "LibraryBackend" ADD VALUE 'FlatFilesystem'; diff --git a/prisma/migrations/20250720070939_static_genres/migration.sql b/prisma/migrations/20250720070939_static_genres/migration.sql deleted file mode 100644 index df31459..0000000 --- a/prisma/migrations/20250720070939_static_genres/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- CreateEnum -CREATE TYPE "Genre" AS ENUM ('Action', 'Strategy', 'Sports', 'Adventure', 'Roleplay', 'Racing', 'Simulation', 'Educational', 'Fighting', 'Shooter', 'RealTimeStrategy', 'CardGame', 'BoardGame', 'Compilation', 'MMORPG', 'MinigameCollection', 'Puzzle', 'MusicRhythm'); - --- AlterTable -ALTER TABLE "Game" ADD COLUMN "genres" "Genre"[]; diff --git a/prisma/migrations/20250721053244_update_genre_names/migration.sql b/prisma/migrations/20250721053244_update_genre_names/migration.sql deleted file mode 100644 index 63accfe..0000000 --- a/prisma/migrations/20250721053244_update_genre_names/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The values [RealTimeStrategy,CardGame,BoardGame,MinigameCollection,MusicRhythm] on the enum `Genre` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "Genre_new" AS ENUM ('Action', 'Strategy', 'Sports', 'Adventure', 'Roleplay', 'Racing', 'Simulation', 'Educational', 'Fighting', 'Shooter', 'RTS', 'Card', 'Board', 'Compilation', 'MMORPG', 'Minigames', 'Puzzle', 'Rhythm'); -ALTER TABLE "Game" ALTER COLUMN "genres" TYPE "Genre_new"[] USING ("genres"::text::"Genre_new"[]); -ALTER TYPE "Genre" RENAME TO "Genre_old"; -ALTER TYPE "Genre_new" RENAME TO "Genre"; -DROP TYPE "Genre_old"; -COMMIT; diff --git a/prisma/migrations/20250721053514_add_featured/migration.sql b/prisma/migrations/20250721053514_add_featured/migration.sql deleted file mode 100644 index 89aeeb4..0000000 --- a/prisma/migrations/20250721053514_add_featured/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Game" ADD COLUMN "featured" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20250721061200_remove_genres/migration.sql b/prisma/migrations/20250721061200_remove_genres/migration.sql deleted file mode 100644 index 4f4f1df..0000000 --- a/prisma/migrations/20250721061200_remove_genres/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `genres` on the `Game` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "Game" DROP COLUMN "genres"; - --- DropEnum -DROP TYPE "Genre"; diff --git a/prisma/migrations/20250721062509_add_pg_trgm/migration.sql b/prisma/migrations/20250721062509_add_pg_trgm/migration.sql deleted file mode 100644 index 567fbd0..0000000 --- a/prisma/migrations/20250721062509_add_pg_trgm/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- Add pg_trgm -CREATE EXTENSION pg_trgm; - --- Create index for tag names --- CREATE INDEX trgm_tag_name ON "Tag" USING GIST (name gist_trgm_ops(siglen=32)); \ No newline at end of file diff --git a/prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql b/prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql deleted file mode 100644 index 02b93b5..0000000 --- a/prisma/migrations/20250721063518_add_index_for_tag_name/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- CreateIndex -CREATE INDEX "Tag_name_idx" ON "Tag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql b/prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql deleted file mode 100644 index cbd80c5..0000000 --- a/prisma/migrations/20250721070713_split_game_and_news_tags/migration.sql +++ /dev/null @@ -1,87 +0,0 @@ -/* - Warnings: - - - You are about to drop the `Tag` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `_ArticleToTag` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `_GameToTag` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE "_ArticleToTag" DROP CONSTRAINT "_ArticleToTag_A_fkey"; - --- DropForeignKey -ALTER TABLE "_ArticleToTag" DROP CONSTRAINT "_ArticleToTag_B_fkey"; - --- DropForeignKey -ALTER TABLE "_GameToTag" DROP CONSTRAINT "_GameToTag_A_fkey"; - --- DropForeignKey -ALTER TABLE "_GameToTag" DROP CONSTRAINT "_GameToTag_B_fkey"; - --- DropTable -DROP TABLE "Tag"; - --- DropTable -DROP TABLE "_ArticleToTag"; - --- DropTable -DROP TABLE "_GameToTag"; - --- CreateTable -CREATE TABLE "GameTag" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - - CONSTRAINT "GameTag_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "NewsTag" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - - CONSTRAINT "NewsTag_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "_GameToGameTag" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_GameToGameTag_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateTable -CREATE TABLE "_ArticleToNewsTag" ( - "A" TEXT NOT NULL, - "B" TEXT NOT NULL, - - CONSTRAINT "_ArticleToNewsTag_AB_pkey" PRIMARY KEY ("A","B") -); - --- CreateIndex -CREATE UNIQUE INDEX "GameTag_name_key" ON "GameTag"("name"); - --- CreateIndex -CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); - --- CreateIndex -CREATE UNIQUE INDEX "NewsTag_name_key" ON "NewsTag"("name"); - --- CreateIndex -CREATE INDEX "_GameToGameTag_B_index" ON "_GameToGameTag"("B"); - --- CreateIndex -CREATE INDEX "_ArticleToNewsTag_B_index" ON "_ArticleToNewsTag"("B"); - --- AddForeignKey -ALTER TABLE "_GameToGameTag" ADD CONSTRAINT "_GameToGameTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_GameToGameTag" ADD CONSTRAINT "_GameToGameTag_B_fkey" FOREIGN KEY ("B") REFERENCES "GameTag"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_ArticleToNewsTag" ADD CONSTRAINT "_ArticleToNewsTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_ArticleToNewsTag" ADD CONSTRAINT "_ArticleToNewsTag_B_fkey" FOREIGN KEY ("B") REFERENCES "NewsTag"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250801035031_add_delete_casacde/migration.sql b/prisma/migrations/20250801035031_add_delete_casacde/migration.sql deleted file mode 100644 index 645377a..0000000 --- a/prisma/migrations/20250801035031_add_delete_casacde/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ --- DropForeignKey -ALTER TABLE "Game" DROP CONSTRAINT "Game_libraryId_fkey"; - --- DropIndex -DROP INDEX "GameTag_name_idx"; - --- CreateIndex -CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); - --- AddForeignKey -ALTER TABLE "Game" ADD CONSTRAINT "Game_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql b/prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql deleted file mode 100644 index 7f096a1..0000000 --- a/prisma/migrations/20250815014713_use_task_id_started_composite_id/migration.sql +++ /dev/null @@ -1,15 +0,0 @@ -/* - Warnings: - - - The primary key for the `Task` table will be changed. If it partially fails, the table could be left without primary key constraint. - -*/ --- DropIndex -DROP INDEX "GameTag_name_idx"; - --- AlterTable -ALTER TABLE "Task" DROP CONSTRAINT "Task_pkey", -ADD CONSTRAINT "Task_pkey" PRIMARY KEY ("id", "started"); - --- CreateIndex -CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20250823005001_add_api_token_expiry/migration.sql b/prisma/migrations/20250823005001_add_api_token_expiry/migration.sql deleted file mode 100644 index c028e99..0000000 --- a/prisma/migrations/20250823005001_add_api_token_expiry/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- DropIndex -DROP INDEX "GameTag_name_idx"; - --- AlterTable -ALTER TABLE "APIToken" ADD COLUMN "expiresAt" TIMESTAMP(3); - --- CreateIndex -CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20250906060327_init/migration.sql b/prisma/migrations/20250906060327_init/migration.sql new file mode 100644 index 0000000..021b5cb --- /dev/null +++ b/prisma/migrations/20250906060327_init/migration.sql @@ -0,0 +1,765 @@ + +-- enable pg_trgm +CREATE EXTENSION pg_trgm; + +-- CreateEnum +CREATE TYPE "public"."Platform" AS ENUM ('windows', 'linux', 'macos'); + +-- CreateEnum +CREATE TYPE "public"."LibraryBackend" AS ENUM ('Filesystem', 'FlatFilesystem'); + +-- CreateEnum +CREATE TYPE "public"."LibraryMode" AS ENUM ('Game', 'Redist', 'DLC', 'Mod'); + +-- CreateEnum +CREATE TYPE "public"."AuthMec" AS ENUM ('Simple', 'OpenID'); + +-- CreateEnum +CREATE TYPE "public"."APITokenMode" AS ENUM ('User', 'System', 'Client'); + +-- CreateEnum +CREATE TYPE "public"."ClientCapabilities" AS ENUM ('peerAPI', 'userStatus', 'cloudSaves', 'trackPlaytime'); + +-- CreateEnum +CREATE TYPE "public"."HardwarePlatform" AS ENUM ('windows', 'linux', 'macos'); + +-- CreateEnum +CREATE TYPE "public"."MetadataSource" AS ENUM ('Manual', 'GiantBomb', 'PCGamingWiki', 'IGDB', 'Metacritic', 'OpenCritic'); + +-- CreateTable +CREATE TABLE "public"."ApplicationSettings" ( + "timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "metadataProviders" TEXT[], + "saveSlotCountLimit" INTEGER NOT NULL DEFAULT 5, + "saveSlotSizeLimit" DOUBLE PRECISION NOT NULL DEFAULT 10, + "saveSlotHistoryLimit" INTEGER NOT NULL DEFAULT 3, + "showGamePanelTextDecoration" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "ApplicationSettings_pkey" PRIMARY KEY ("timestamp") +); + +-- CreateTable +CREATE TABLE "public"."Library" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "backend" "public"."LibraryBackend" NOT NULL, + "options" JSONB NOT NULL, + "mode" "public"."LibraryMode" NOT NULL DEFAULT 'Game', + + CONSTRAINT "Library_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."LinkedAuthMec" ( + "userId" TEXT NOT NULL, + "mec" "public"."AuthMec" NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "version" INTEGER NOT NULL DEFAULT 1, + "credentials" JSONB NOT NULL, + + CONSTRAINT "LinkedAuthMec_pkey" PRIMARY KEY ("userId","mec") +); + +-- CreateTable +CREATE TABLE "public"."Invitation" ( + "id" TEXT NOT NULL, + "isAdmin" BOOLEAN NOT NULL DEFAULT false, + "username" TEXT, + "email" TEXT, + "expires" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Invitation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."APIToken" ( + "id" TEXT NOT NULL, + "token" TEXT NOT NULL, + "mode" "public"."APITokenMode" NOT NULL, + "name" TEXT NOT NULL, + "userId" TEXT, + "clientId" TEXT, + "acls" TEXT[], + "expiresAt" TIMESTAMP(3), + + CONSTRAINT "APIToken_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Certificate" ( + "id" TEXT NOT NULL, + "privateKey" TEXT NOT NULL, + "certificate" TEXT NOT NULL, + "blacklisted" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "Certificate_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Session" ( + "token" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "userId" TEXT NOT NULL, + "data" JSONB NOT NULL, + + CONSTRAINT "Session_pkey" PRIMARY KEY ("token") +); + +-- CreateTable +CREATE TABLE "public"."Client" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "capabilities" "public"."ClientCapabilities"[], + "name" TEXT NOT NULL, + "platform" "public"."HardwarePlatform" NOT NULL, + "lastConnected" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Client_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Collection" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "isDefault" BOOLEAN NOT NULL DEFAULT false, + "userId" TEXT NOT NULL, + + CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."CollectionEntry" ( + "collectionId" TEXT NOT NULL, + "gameId" TEXT NOT NULL, + + CONSTRAINT "CollectionEntry_pkey" PRIMARY KEY ("collectionId","gameId") +); + +-- CreateTable +CREATE TABLE "public"."UserPlatform" ( + "id" TEXT NOT NULL, + "platformName" TEXT NOT NULL, + "iconSvg" TEXT NOT NULL, + "fileExtensions" TEXT[] DEFAULT ARRAY[]::TEXT[], + "redistId" TEXT, + + CONSTRAINT "UserPlatform_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."PlatformLink" ( + "id" TEXT NOT NULL, + "platform" "public"."HardwarePlatform", + "userPlatformId" TEXT, + + CONSTRAINT "PlatformLink_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."LaunchOption" ( + "launchId" TEXT NOT NULL, + "versionId" TEXT NOT NULL, + "launchGId" TEXT, + "installGId" TEXT, + "uninstallGId" TEXT, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "command" TEXT NOT NULL, + "args" TEXT NOT NULL DEFAULT '', + + CONSTRAINT "LaunchOption_pkey" PRIMARY KEY ("launchId") +); + +-- CreateTable +CREATE TABLE "public"."Version" ( + "versionId" TEXT NOT NULL, + "versionPath" TEXT NOT NULL, + "versionName" TEXT NOT NULL, + "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "gameId" TEXT, + "redistId" TEXT, + "dlcId" TEXT, + "modId" TEXT, + "dropletManifest" JSONB NOT NULL, + + CONSTRAINT "Version_pkey" PRIMARY KEY ("versionId") +); + +-- CreateTable +CREATE TABLE "public"."GameVersion" ( + "versionId" TEXT NOT NULL, + "installId" TEXT, + "uninstallId" TEXT, + "onlySetup" BOOLEAN NOT NULL DEFAULT false, + "umuIdOverride" TEXT, + "versionIndex" INTEGER NOT NULL, + "delta" BOOLEAN NOT NULL DEFAULT false, + "hidden" BOOLEAN NOT NULL DEFAULT false, + "platformId" TEXT NOT NULL, + + CONSTRAINT "GameVersion_pkey" PRIMARY KEY ("versionId") +); + +-- CreateTable +CREATE TABLE "public"."DLCVersion" ( + "versionId" TEXT NOT NULL, + "platformId" TEXT NOT NULL, + + CONSTRAINT "DLCVersion_pkey" PRIMARY KEY ("versionId") +); + +-- CreateTable +CREATE TABLE "public"."RedistVersion" ( + "versionId" TEXT NOT NULL, + "platformId" TEXT NOT NULL, + + CONSTRAINT "RedistVersion_pkey" PRIMARY KEY ("versionId") +); + +-- CreateTable +CREATE TABLE "public"."ModVersion" ( + "versionId" TEXT NOT NULL, + "dependencies" TEXT[], + "platformId" TEXT NOT NULL, + + CONSTRAINT "ModVersion_pkey" PRIMARY KEY ("versionId") +); + +-- CreateTable +CREATE TABLE "public"."SaveSlot" ( + "gameId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "index" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "playtime" DOUBLE PRECISION NOT NULL DEFAULT 0, + "lastUsedClientId" TEXT, + "historyObjectIds" TEXT[], + "historyChecksums" TEXT[], + + CONSTRAINT "SaveSlot_pkey" PRIMARY KEY ("gameId","userId","index") +); + +-- CreateTable +CREATE TABLE "public"."Screenshot" ( + "id" TEXT NOT NULL, + "gameId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "objectId" TEXT NOT NULL, + "private" BOOLEAN NOT NULL, + "createdAt" TIMESTAMPTZ(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Screenshot_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Playtime" ( + "gameId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "seconds" INTEGER NOT NULL, + "updatedAt" TIMESTAMPTZ(6) NOT NULL, + "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Playtime_pkey" PRIMARY KEY ("gameId","userId") +); + +-- CreateTable +CREATE TABLE "public"."ObjectHash" ( + "id" TEXT NOT NULL, + "hash" TEXT NOT NULL, + + CONSTRAINT "ObjectHash_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Game" ( + "id" TEXT NOT NULL, + "metadataSource" "public"."MetadataSource" NOT NULL, + "metadataId" TEXT NOT NULL, + "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "mName" TEXT NOT NULL, + "mShortDescription" TEXT NOT NULL, + "mDescription" TEXT NOT NULL, + "mReleased" TIMESTAMP(3) NOT NULL, + "featured" BOOLEAN NOT NULL DEFAULT false, + "mIconObjectId" TEXT NOT NULL, + "mBannerObjectId" TEXT NOT NULL, + "mCoverObjectId" TEXT NOT NULL, + "mImageCarouselObjectIds" TEXT[], + "mImageLibraryObjectIds" TEXT[], + "libraryId" TEXT NOT NULL, + "libraryPath" TEXT NOT NULL, + + CONSTRAINT "Game_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."DLC" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "iconObjectId" TEXT NOT NULL, + "libraryId" TEXT NOT NULL, + "libraryPath" TEXT NOT NULL, + + CONSTRAINT "DLC_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."GameDLCMetadata" ( + "id" TEXT NOT NULL, + "mName" TEXT NOT NULL, + "mShortDescription" TEXT NOT NULL, + "mDescription" TEXT NOT NULL, + "mIconObjectId" TEXT NOT NULL, + "mBannerObjectId" TEXT NOT NULL, + "mCoverObjectId" TEXT NOT NULL, + "mImageCarouselObjectIds" TEXT[], + "mImageLibraryObjectIds" TEXT[], + + CONSTRAINT "GameDLCMetadata_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Redist" ( + "id" TEXT NOT NULL, + "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "mName" TEXT NOT NULL, + "mShortDescription" TEXT NOT NULL, + "mIconObjectId" TEXT NOT NULL, + "libraryId" TEXT NOT NULL, + "libraryPath" TEXT NOT NULL, + + CONSTRAINT "Redist_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Mod" ( + "id" TEXT NOT NULL, + "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "gameId" TEXT NOT NULL, + "user" BOOLEAN NOT NULL DEFAULT true, + "mName" TEXT NOT NULL, + "mShortDescription" TEXT NOT NULL, + "mDescription" TEXT NOT NULL, + "mReleased" TIMESTAMP(3) NOT NULL, + "mIconObjectId" TEXT NOT NULL, + "mBannerObjectId" TEXT NOT NULL, + "mCoverObjectId" TEXT NOT NULL, + "mImageCarouselObjectIds" TEXT[], + "mImageLibraryObjectIds" TEXT[], + "libraryId" TEXT NOT NULL, + "libraryPath" TEXT NOT NULL, + + CONSTRAINT "Mod_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."GameTag" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "GameTag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."GameRating" ( + "id" TEXT NOT NULL, + "metadataSource" "public"."MetadataSource" NOT NULL, + "metadataId" TEXT NOT NULL, + "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "mReviewCount" INTEGER NOT NULL, + "mReviewRating" DOUBLE PRECISION NOT NULL, + "mReviewHref" TEXT, + "gameId" TEXT NOT NULL, + + CONSTRAINT "GameRating_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Company" ( + "id" TEXT NOT NULL, + "metadataSource" "public"."MetadataSource" NOT NULL, + "metadataId" TEXT NOT NULL, + "metadataOriginalQuery" TEXT NOT NULL, + "mName" TEXT NOT NULL, + "mShortDescription" TEXT NOT NULL, + "mDescription" TEXT NOT NULL, + "mLogoObjectId" TEXT NOT NULL, + "mBannerObjectId" TEXT NOT NULL, + "mWebsite" TEXT NOT NULL, + + CONSTRAINT "Company_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."NewsTag" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "NewsTag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Article" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + "content" TEXT NOT NULL, + "imageObjectId" TEXT, + "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "authorId" TEXT, + + CONSTRAINT "Article_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Task" ( + "id" TEXT NOT NULL, + "taskGroup" TEXT NOT NULL, + "name" TEXT NOT NULL, + "started" TIMESTAMP(3) NOT NULL, + "ended" TIMESTAMP(3) NOT NULL, + "success" BOOLEAN NOT NULL, + "error" JSONB, + "progress" DOUBLE PRECISION NOT NULL, + "log" TEXT[], + "acls" TEXT[], + + CONSTRAINT "Task_pkey" PRIMARY KEY ("id","started") +); + +-- CreateTable +CREATE TABLE "public"."User" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "admin" BOOLEAN NOT NULL DEFAULT false, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "email" TEXT NOT NULL, + "displayName" TEXT NOT NULL, + "profilePictureObjectId" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."Notification" ( + "id" TEXT NOT NULL, + "nonce" TEXT, + "userId" TEXT NOT NULL, + "acls" TEXT[], + "created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + "actions" TEXT[], + "read" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."_GameVersionToRedistVersion" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_GameVersionToRedistVersion_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_DLCVersionToRedistVersion" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_DLCVersionToRedistVersion_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_GameToGameTag" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_GameToGameTag_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_GameTagToMod" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_GameTagToMod_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_developers" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_developers_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_publishers" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_publishers_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "public"."_ArticleToNewsTag" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_ArticleToNewsTag_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateIndex +CREATE UNIQUE INDEX "APIToken_token_key" ON "public"."APIToken"("token"); + +-- CreateIndex +CREATE INDEX "APIToken_token_idx" ON "public"."APIToken"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserPlatform_redistId_key" ON "public"."UserPlatform"("redistId"); + +-- CreateIndex +CREATE UNIQUE INDEX "LaunchOption_installGId_key" ON "public"."LaunchOption"("installGId"); + +-- CreateIndex +CREATE UNIQUE INDEX "LaunchOption_uninstallGId_key" ON "public"."LaunchOption"("uninstallGId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Version_versionId_key" ON "public"."Version"("versionId"); + +-- CreateIndex +CREATE UNIQUE INDEX "GameVersion_installId_key" ON "public"."GameVersion"("installId"); + +-- CreateIndex +CREATE UNIQUE INDEX "GameVersion_uninstallId_key" ON "public"."GameVersion"("uninstallId"); + +-- CreateIndex +CREATE INDEX "Screenshot_gameId_userId_idx" ON "public"."Screenshot"("gameId", "userId"); + +-- CreateIndex +CREATE INDEX "Screenshot_userId_idx" ON "public"."Screenshot"("userId"); + +-- CreateIndex +CREATE INDEX "Playtime_userId_idx" ON "public"."Playtime"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Game_metadataSource_metadataId_key" ON "public"."Game"("metadataSource", "metadataId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Game_libraryId_libraryPath_key" ON "public"."Game"("libraryId", "libraryPath"); + +-- CreateIndex +CREATE UNIQUE INDEX "Redist_libraryId_libraryPath_key" ON "public"."Redist"("libraryId", "libraryPath"); + +-- CreateIndex +CREATE UNIQUE INDEX "GameTag_name_key" ON "public"."GameTag"("name"); + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); + +-- CreateIndex +CREATE UNIQUE INDEX "GameRating_metadataSource_metadataId_key" ON "public"."GameRating"("metadataSource", "metadataId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Company_metadataSource_metadataId_key" ON "public"."Company"("metadataSource", "metadataId"); + +-- CreateIndex +CREATE UNIQUE INDEX "NewsTag_name_key" ON "public"."NewsTag"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_username_key" ON "public"."User"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "Notification_userId_nonce_key" ON "public"."Notification"("userId", "nonce"); + +-- CreateIndex +CREATE INDEX "_GameVersionToRedistVersion_B_index" ON "public"."_GameVersionToRedistVersion"("B"); + +-- CreateIndex +CREATE INDEX "_DLCVersionToRedistVersion_B_index" ON "public"."_DLCVersionToRedistVersion"("B"); + +-- CreateIndex +CREATE INDEX "_GameToGameTag_B_index" ON "public"."_GameToGameTag"("B"); + +-- CreateIndex +CREATE INDEX "_GameTagToMod_B_index" ON "public"."_GameTagToMod"("B"); + +-- CreateIndex +CREATE INDEX "_developers_B_index" ON "public"."_developers"("B"); + +-- CreateIndex +CREATE INDEX "_publishers_B_index" ON "public"."_publishers"("B"); + +-- CreateIndex +CREATE INDEX "_ArticleToNewsTag_B_index" ON "public"."_ArticleToNewsTag"("B"); + +-- AddForeignKey +ALTER TABLE "public"."LinkedAuthMec" ADD CONSTRAINT "LinkedAuthMec_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."APIToken" ADD CONSTRAINT "APIToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."APIToken" ADD CONSTRAINT "APIToken_clientId_fkey" FOREIGN KEY ("clientId") REFERENCES "public"."Client"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Client" ADD CONSTRAINT "Client_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Collection" ADD CONSTRAINT "Collection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."CollectionEntry" ADD CONSTRAINT "CollectionEntry_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "public"."Collection"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."CollectionEntry" ADD CONSTRAINT "CollectionEntry_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."UserPlatform" ADD CONSTRAINT "UserPlatform_redistId_fkey" FOREIGN KEY ("redistId") REFERENCES "public"."Redist"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."PlatformLink" ADD CONSTRAINT "PlatformLink_userPlatformId_fkey" FOREIGN KEY ("userPlatformId") REFERENCES "public"."UserPlatform"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."LaunchOption" ADD CONSTRAINT "redistVersion_fkey" FOREIGN KEY ("versionId") REFERENCES "public"."RedistVersion"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."LaunchOption" ADD CONSTRAINT "LaunchOption_launchGId_fkey" FOREIGN KEY ("launchGId") REFERENCES "public"."GameVersion"("versionId") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Version" ADD CONSTRAINT "game_link" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Version" ADD CONSTRAINT "redist_link" FOREIGN KEY ("redistId") REFERENCES "public"."Redist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Version" ADD CONSTRAINT "dlc_link" FOREIGN KEY ("dlcId") REFERENCES "public"."DLC"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Version" ADD CONSTRAINT "mod_link" FOREIGN KEY ("modId") REFERENCES "public"."Mod"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."GameVersion" ADD CONSTRAINT "GameVersion_versionId_fkey" FOREIGN KEY ("versionId") REFERENCES "public"."Version"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."GameVersion" ADD CONSTRAINT "GameVersion_installId_fkey" FOREIGN KEY ("installId") REFERENCES "public"."LaunchOption"("launchId") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."GameVersion" ADD CONSTRAINT "GameVersion_uninstallId_fkey" FOREIGN KEY ("uninstallId") REFERENCES "public"."LaunchOption"("launchId") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."GameVersion" ADD CONSTRAINT "GameVersion_platformId_fkey" FOREIGN KEY ("platformId") REFERENCES "public"."PlatformLink"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."DLCVersion" ADD CONSTRAINT "DLCVersion_versionId_fkey" FOREIGN KEY ("versionId") REFERENCES "public"."Version"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."DLCVersion" ADD CONSTRAINT "DLCVersion_platformId_fkey" FOREIGN KEY ("platformId") REFERENCES "public"."PlatformLink"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."RedistVersion" ADD CONSTRAINT "RedistVersion_versionId_fkey" FOREIGN KEY ("versionId") REFERENCES "public"."Version"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."RedistVersion" ADD CONSTRAINT "RedistVersion_platformId_fkey" FOREIGN KEY ("platformId") REFERENCES "public"."PlatformLink"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ModVersion" ADD CONSTRAINT "ModVersion_versionId_fkey" FOREIGN KEY ("versionId") REFERENCES "public"."Version"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ModVersion" ADD CONSTRAINT "ModVersion_platformId_fkey" FOREIGN KEY ("platformId") REFERENCES "public"."PlatformLink"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."SaveSlot" ADD CONSTRAINT "SaveSlot_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."SaveSlot" ADD CONSTRAINT "SaveSlot_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."SaveSlot" ADD CONSTRAINT "SaveSlot_lastUsedClientId_fkey" FOREIGN KEY ("lastUsedClientId") REFERENCES "public"."Client"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Screenshot" ADD CONSTRAINT "Screenshot_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Screenshot" ADD CONSTRAINT "Screenshot_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Playtime" ADD CONSTRAINT "Playtime_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Playtime" ADD CONSTRAINT "Playtime_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Game" ADD CONSTRAINT "Game_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "public"."Library"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."DLC" ADD CONSTRAINT "DLC_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "public"."Library"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."GameDLCMetadata" ADD CONSTRAINT "GameDLCMetadata_id_fkey" FOREIGN KEY ("id") REFERENCES "public"."DLC"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Redist" ADD CONSTRAINT "Redist_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "public"."Library"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Mod" ADD CONSTRAINT "Mod_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Mod" ADD CONSTRAINT "Mod_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "public"."Library"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."GameRating" ADD CONSTRAINT "GameRating_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Article" ADD CONSTRAINT "Article_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_GameVersionToRedistVersion" ADD CONSTRAINT "_GameVersionToRedistVersion_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."GameVersion"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_GameVersionToRedistVersion" ADD CONSTRAINT "_GameVersionToRedistVersion_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."RedistVersion"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_DLCVersionToRedistVersion" ADD CONSTRAINT "_DLCVersionToRedistVersion_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."DLCVersion"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_DLCVersionToRedistVersion" ADD CONSTRAINT "_DLCVersionToRedistVersion_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."RedistVersion"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_GameToGameTag" ADD CONSTRAINT "_GameToGameTag_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_GameToGameTag" ADD CONSTRAINT "_GameToGameTag_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."GameTag"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_GameTagToMod" ADD CONSTRAINT "_GameTagToMod_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."GameTag"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_GameTagToMod" ADD CONSTRAINT "_GameTagToMod_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."Mod"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_developers" ADD CONSTRAINT "_developers_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Company"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_developers" ADD CONSTRAINT "_developers_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_publishers" ADD CONSTRAINT "_publishers_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Company"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_publishers" ADD CONSTRAINT "_publishers_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ArticleToNewsTag" ADD CONSTRAINT "_ArticleToNewsTag_A_fkey" FOREIGN KEY ("A") REFERENCES "public"."Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."_ArticleToNewsTag" ADD CONSTRAINT "_ArticleToNewsTag_B_fkey" FOREIGN KEY ("B") REFERENCES "public"."NewsTag"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250906060713_rename_to_hardware_platform/migration.sql b/prisma/migrations/20250906060713_rename_to_hardware_platform/migration.sql new file mode 100644 index 0000000..c4a4d3f --- /dev/null +++ b/prisma/migrations/20250906060713_rename_to_hardware_platform/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - You are about to drop the column `platform` on the `PlatformLink` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."PlatformLink" DROP COLUMN "platform", +ADD COLUMN "hardwarePlatform" "public"."HardwarePlatform"; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20250906062106_rename_redist_version_id/migration.sql b/prisma/migrations/20250906062106_rename_redist_version_id/migration.sql new file mode 100644 index 0000000..522ac2f --- /dev/null +++ b/prisma/migrations/20250906062106_rename_redist_version_id/migration.sql @@ -0,0 +1,21 @@ +/* + Warnings: + + - You are about to drop the column `versionId` on the `LaunchOption` table. All the data in the column will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "public"."LaunchOption" DROP CONSTRAINT "redistVersion_fkey"; + +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."LaunchOption" DROP COLUMN "versionId", +ADD COLUMN "redistVersionId" TEXT; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); + +-- AddForeignKey +ALTER TABLE "public"."LaunchOption" ADD CONSTRAINT "redistVersion_fkey" FOREIGN KEY ("redistVersionId") REFERENCES "public"."RedistVersion"("versionId") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250906063020_refine_platform_link/migration.sql b/prisma/migrations/20250906063020_refine_platform_link/migration.sql new file mode 100644 index 0000000..232e688 --- /dev/null +++ b/prisma/migrations/20250906063020_refine_platform_link/migration.sql @@ -0,0 +1,20 @@ +/* + Warnings: + + - You are about to drop the column `userPlatformId` on the `PlatformLink` table. All the data in the column will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "public"."PlatformLink" DROP CONSTRAINT "PlatformLink_userPlatformId_fkey"; + +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."PlatformLink" DROP COLUMN "userPlatformId"; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); + +-- AddForeignKey +ALTER TABLE "public"."PlatformLink" ADD CONSTRAINT "PlatformLink_id_fkey" FOREIGN KEY ("id") REFERENCES "public"."UserPlatform"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250906070635_remove_hard_relation_for_user_platform/migration.sql b/prisma/migrations/20250906070635_remove_hard_relation_for_user_platform/migration.sql new file mode 100644 index 0000000..1d88338 --- /dev/null +++ b/prisma/migrations/20250906070635_remove_hard_relation_for_user_platform/migration.sql @@ -0,0 +1,8 @@ +-- DropForeignKey +ALTER TABLE "public"."PlatformLink" DROP CONSTRAINT "PlatformLink_id_fkey"; + +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20250906081518_enforce_redists_as_only_source_of_user_platform_for_now/migration.sql b/prisma/migrations/20250906081518_enforce_redists_as_only_source_of_user_platform_for_now/migration.sql new file mode 100644 index 0000000..2b125cc --- /dev/null +++ b/prisma/migrations/20250906081518_enforce_redists_as_only_source_of_user_platform_for_now/migration.sql @@ -0,0 +1,20 @@ +/* + Warnings: + + - Made the column `redistId` on table `UserPlatform` required. This step will fail if there are existing NULL values in that column. + +*/ +-- DropForeignKey +ALTER TABLE "public"."UserPlatform" DROP CONSTRAINT "UserPlatform_redistId_fkey"; + +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."UserPlatform" ALTER COLUMN "redistId" SET NOT NULL; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); + +-- AddForeignKey +ALTER TABLE "public"."UserPlatform" ADD CONSTRAINT "UserPlatform_redistId_fkey" FOREIGN KEY ("redistId") REFERENCES "public"."Redist"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20250906091448_remove_platform/migration.sql b/prisma/migrations/20250906091448_remove_platform/migration.sql new file mode 100644 index 0000000..0ff5153 --- /dev/null +++ b/prisma/migrations/20250906091448_remove_platform/migration.sql @@ -0,0 +1,8 @@ +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- DropEnum +DROP TYPE "public"."Platform"; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20250925223539_add_pre_and_post_install_for_redist_version/migration.sql b/prisma/migrations/20250925223539_add_pre_and_post_install_for_redist_version/migration.sql new file mode 100644 index 0000000..11ceb10 --- /dev/null +++ b/prisma/migrations/20250925223539_add_pre_and_post_install_for_redist_version/migration.sql @@ -0,0 +1,41 @@ +/* + Warnings: + + - A unique constraint covering the columns `[installRId]` on the table `LaunchOption` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[uninstallRId]` on the table `LaunchOption` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[installId]` on the table `RedistVersion` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[uninstallId]` on the table `RedistVersion` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."LaunchOption" ADD COLUMN "installRId" TEXT, +ADD COLUMN "uninstallRId" TEXT; + +-- AlterTable +ALTER TABLE "public"."RedistVersion" ADD COLUMN "installId" TEXT, +ADD COLUMN "onlySetup" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "uninstallId" TEXT; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); + +-- CreateIndex +CREATE UNIQUE INDEX "LaunchOption_installRId_key" ON "public"."LaunchOption"("installRId"); + +-- CreateIndex +CREATE UNIQUE INDEX "LaunchOption_uninstallRId_key" ON "public"."LaunchOption"("uninstallRId"); + +-- CreateIndex +CREATE UNIQUE INDEX "RedistVersion_installId_key" ON "public"."RedistVersion"("installId"); + +-- CreateIndex +CREATE UNIQUE INDEX "RedistVersion_uninstallId_key" ON "public"."RedistVersion"("uninstallId"); + +-- AddForeignKey +ALTER TABLE "public"."RedistVersion" ADD CONSTRAINT "RedistVersion_installId_fkey" FOREIGN KEY ("installId") REFERENCES "public"."LaunchOption"("launchId") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."RedistVersion" ADD CONSTRAINT "RedistVersion_uninstallId_fkey" FOREIGN KEY ("uninstallId") REFERENCES "public"."LaunchOption"("launchId") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20250925225034_add_delta_versioning_to_redist/migration.sql b/prisma/migrations/20250925225034_add_delta_versioning_to_redist/migration.sql new file mode 100644 index 0000000..174c04b --- /dev/null +++ b/prisma/migrations/20250925225034_add_delta_versioning_to_redist/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - Added the required column `versionIndex` to the `RedistVersion` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."RedistVersion" ADD COLUMN "delta" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "versionIndex" INTEGER NOT NULL; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20251107223657_move_version_index/migration.sql b/prisma/migrations/20251107223657_move_version_index/migration.sql new file mode 100644 index 0000000..58eb513 --- /dev/null +++ b/prisma/migrations/20251107223657_move_version_index/migration.sql @@ -0,0 +1,18 @@ +/* + Warnings: + + - You are about to drop the column `versionIndex` on the `GameVersion` table. All the data in the column will be lost. + - Added the required column `versionIndex` to the `Version` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."GameVersion" DROP COLUMN "versionIndex"; + +-- AlterTable +ALTER TABLE "public"."Version" ADD COLUMN "versionIndex" INTEGER NOT NULL; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/migrations/20251109232837_move_hidden_to_version/migration.sql b/prisma/migrations/20251109232837_move_hidden_to_version/migration.sql new file mode 100644 index 0000000..373114a --- /dev/null +++ b/prisma/migrations/20251109232837_move_hidden_to_version/migration.sql @@ -0,0 +1,17 @@ +/* + Warnings: + + - You are about to drop the column `hidden` on the `GameVersion` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "public"."GameTag_name_idx"; + +-- AlterTable +ALTER TABLE "public"."GameVersion" DROP COLUMN "hidden"; + +-- AlterTable +ALTER TABLE "public"."Version" ADD COLUMN "hidden" BOOLEAN NOT NULL DEFAULT false; + +-- CreateIndex +CREATE INDEX "GameTag_name_idx" ON "public"."GameTag" USING GIST ("name" gist_trgm_ops(siglen=32)); diff --git a/prisma/models/app.prisma b/prisma/models/app.prisma index 338af50..65996f8 100644 --- a/prisma/models/app.prisma +++ b/prisma/models/app.prisma @@ -10,23 +10,28 @@ model ApplicationSettings { showGamePanelTextDecoration Boolean @default(true) } -enum Platform { - Windows @map("windows") - Linux @map("linux") - macOS @map("macos") -} - enum LibraryBackend { Filesystem FlatFilesystem } +enum LibraryMode { + Game + Redist + DLC + Mod +} + model Library { id String @id @default(uuid()) name String backend LibraryBackend options Json + mode LibraryMode @default(Game) - games Game[] + games Game[] + redists Redist[] + dlcs DLC[] + mods Mod[] } diff --git a/prisma/models/client.prisma b/prisma/models/client.prisma index 6dd7208..253b97a 100644 --- a/prisma/models/client.prisma +++ b/prisma/models/client.prisma @@ -14,7 +14,7 @@ model Client { capabilities ClientCapabilities[] name String - platform Platform + platform HardwarePlatform lastConnected DateTime lastAccessedSaves SaveSlot[] diff --git a/prisma/models/content.prisma b/prisma/models/content.prisma index 1d8a002..b1f9896 100644 --- a/prisma/models/content.prisma +++ b/prisma/models/content.prisma @@ -1,185 +1,217 @@ -enum MetadataSource { - Manual - GiantBomb - Steam - PCGamingWiki - IGDB - Metacritic - OpenCritic +enum HardwarePlatform { + Windows @map("windows") + Linux @map("linux") + macOS @map("macos") + // Switch @map("switch") + // etc + + // @@map("Platform") } -model Game { - id String @id @default(uuid()) +model UserPlatform { + id String @id @default(uuid()) - metadataSource MetadataSource - metadataId String - created DateTime @default(now()) + platformName String + iconSvg String + fileExtensions String[] @default([]) - // Any field prefixed with m is filled in from metadata - // Acts as a cache so we can search and filter it - mName String // Name of game - mShortDescription String // Short description - mDescription String // Supports markdown - mReleased DateTime // When the game was released + redistId String @unique + redist Redist @relation(fields: [redistId], references: [id], onDelete: Cascade, onUpdate: Cascade) - ratings GameRating[] - - featured Boolean @default(false) - - mIconObjectId String // linked to objects in s3 - mBannerObjectId String // linked to objects in s3 - mCoverObjectId String - mImageCarouselObjectIds String[] // linked to below array - mImageLibraryObjectIds String[] // linked to objects in s3 - - versions GameVersion[] - - // These fields will not be optional in the next version - // Any game without a library ID will be assigned one at startup, based on the defaults - libraryId String? - library Library? @relation(fields: [libraryId], references: [id], onDelete: Cascade, onUpdate: Cascade) - libraryPath String - - collections CollectionEntry[] - saves SaveSlot[] - screenshots Screenshot[] - tags GameTag[] - playtime Playtime[] - - developers Company[] @relation(name: "developers") - publishers Company[] @relation(name: "publishers") - - @@unique([metadataSource, metadataId], name: "metadataKey") - @@unique([libraryId, libraryPath], name: "libraryKey") + //platform PlatformLink[] } -model GameTag { - id String @id @default(uuid()) - name String @unique +model PlatformLink { + id String @id // This is either the ID of the user platform, or a repeat of the HardwarePlatform enum. It's cursed. - games Game[] + hardwarePlatform HardwarePlatform? + // Waiting on weak reference + // userPlatform UserPlatform? @relation(fields: [id], references: [id]) - @@index([name(ops: raw("gist_trgm_ops(siglen=32)"))], type: Gist) + gameVersions GameVersion[] + dlcVersions DLCVersion[] + redistVerisons RedistVersion[] + modVersions ModVersion[] } +/** + */ +model LaunchOption { + launchId String @id @default(uuid()) -model GameRating { - id String @id @default(uuid()) + redistVersionId String? + redistVersion RedistVersion? @relation(fields: [redistVersionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade, map: "redistVersion_fkey") - metadataSource MetadataSource - metadataId String - created DateTime @default(now()) + launchGId String? + launchGVersion GameVersion? @relation(name: "launches", fields: [launchGId], references: [versionId]) + installGId String? @unique + installGVersion GameVersion? @relation(name: "install") + uninstallGId String? @unique + uninstallGVersion GameVersion? @relation(name: "uninstall") - mReviewCount Int - mReviewRating Float // 0 to 1 + installRId String? @unique + installRVersion RedistVersion? @relation(name: "install_redist") + uninstallRId String? @unique + uninstallRVersion RedistVersion? @relation(name: "uninstall_redist") - mReviewHref String? + name String + description String - game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) - gameId String - - @@unique([metadataSource, metadataId], name: "metadataKey") + command String + args String @default("") } -// A particular set of files that relate to the version +// Platform agnostic object +model Version { + versionId String @id @unique @default(uuid()) + + versionPath String + + versionName String + versionIndex Int + created DateTime @default(now()) + hidden Boolean @default(false) + + gameId String? + game Game? @relation(fields: [gameId], references: [id], map: "game_link", onDelete: Cascade, onUpdate: Cascade) + gameVersions GameVersion[] + + redistId String? + redist Redist? @relation(fields: [redistId], references: [id], map: "redist_link", onDelete: Cascade, onUpdate: Cascade) + redistVersions RedistVersion[] + + dlcId String? + dlc DLC? @relation(fields: [dlcId], references: [id], map: "dlc_link", onDelete: Cascade, onUpdate: Cascade) + dlcVersions DLCVersion[] + + modId String? + mod Mod? @relation(fields: [modId], references: [id], map: "mod_link", onDelete: Cascade, onUpdate: Cascade) + modVersions ModVersion[] + + dropletManifest Json // Results from droplet +} + +// Platform specific object model GameVersion { - gameId String - game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) - versionName String // Sub directory for the game files + versionId String @id + version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) - created DateTime @default(now()) + redistDeps RedistVersion[] - platform Platform + launches LaunchOption[] @relation(name: "launches") - launchCommand String @default("") // Command to run to start. Platform-specific. Windows games on Linux will wrap this command in Proton/Wine - launchArgs String[] - setupCommand String @default("") // Command to setup game (dependencies and such) - setupArgs String[] - onlySetup Boolean @default(false) + installId String? @unique + install LaunchOption? @relation(name: "install", fields: [installId], references: [launchId]) + uninstallId String? @unique + uninstall LaunchOption? @relation(name: "uninstall", fields: [uninstallId], references: [launchId]) + onlySetup Boolean @default(false) - umuIdOverride String? + umuIdOverride String? - dropletManifest Json // Results from droplet + delta Boolean @default(false) - versionIndex Int - delta Boolean @default(false) + platformId String + platform PlatformLink @relation(fields: [platformId], references: [id]) +} - @@id([gameId, versionName]) +// Platform specific object +model DLCVersion { + versionId String @id + version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) + + redistDeps RedistVersion[] + + platformId String + platform PlatformLink @relation(fields: [platformId], references: [id]) +} + +// Platform specific object +model RedistVersion { + versionId String @id + version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) + + installId String? @unique + install LaunchOption? @relation(name: "install_redist", fields: [installId], references: [launchId]) + uninstallId String? @unique + uninstall LaunchOption? @relation(name: "uninstall_redist", fields: [uninstallId], references: [launchId]) + onlySetup Boolean @default(false) + + launches LaunchOption[] + + versionIndex Int + delta Boolean @default(false) + + gameDependees GameVersion[] + dlcDependees DLCVersion[] + + platformId String + platform PlatformLink @relation(fields: [platformId], references: [id]) +} + +// Platform specific object +model ModVersion { + versionId String @id + version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) + + dependencies String[] + + platformId String + platform PlatformLink @relation(fields: [platformId], references: [id]) } // A save slot for a game model SaveSlot { - gameId String - game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) - userId String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - index Int + gameId String + game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + index Int - createdAt DateTime @default(now()) - playtime Float @default(0) // hours + createdAt DateTime @default(now()) + playtime Float @default(0) // hours - lastUsedClientId String? - lastUsedClient Client? @relation(fields: [lastUsedClientId], references: [id]) + lastUsedClientId String? + lastUsedClient Client? @relation(fields: [lastUsedClientId], references: [id]) - historyObjectIds String[] // list of objects - historyChecksums String[] // list of hashes + historyObjectIds String[] // list of objects + historyChecksums String[] // list of hashes - @@id([gameId, userId, index], name: "id") + @@id([gameId, userId, index], name: "id") } model Screenshot { - id String @id @default(uuid()) + id String @id @default(uuid()) - gameId String - game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) - userId String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) + gameId String + game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) - objectId String - private Boolean // if other users can see + objectId String + private Boolean // if other users can see - createdAt DateTime @default(now()) @db.Timestamptz(0) + createdAt DateTime @default(now()) @db.Timestamptz(0) - @@index([gameId, userId]) - @@index([userId]) + @@index([gameId, userId]) + @@index([userId]) } model Playtime { - gameId String - game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) - userId String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) + gameId String + game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) - seconds Int // seconds user has spent playing the game + seconds Int // seconds user has spent playing the game - updatedAt DateTime @updatedAt @db.Timestamptz(6) - createdAt DateTime @default(now()) @db.Timestamptz(6) + updatedAt DateTime @updatedAt @db.Timestamptz(6) + createdAt DateTime @default(now()) @db.Timestamptz(6) - @@id([gameId, userId]) - @@index([userId]) -} - -model Company { - id String @id @default(uuid()) - - metadataSource MetadataSource - metadataId String - metadataOriginalQuery String - - mName String - mShortDescription String - mDescription String - mLogoObjectId String - mBannerObjectId String - mWebsite String - - developed Game[] @relation(name: "developers") - published Game[] @relation(name: "publishers") - - @@unique([metadataSource, metadataId], name: "metadataKey") + @@id([gameId, userId]) + @@index([userId]) } model ObjectHash { - id String @id - hash String + id String @id + hash String } diff --git a/prisma/models/metadata.prisma b/prisma/models/metadata.prisma new file mode 100644 index 0000000..ab10150 --- /dev/null +++ b/prisma/models/metadata.prisma @@ -0,0 +1,180 @@ +enum MetadataSource { + Manual + GiantBomb + PCGamingWiki + IGDB + Metacritic + OpenCritic + Steam +} + +model Game { + id String @id @default(uuid()) + + metadataSource MetadataSource + metadataId String + created DateTime @default(now()) + + // Any field prefixed with m is filled in from metadata + // Acts as a cache so we can search and filter it + mName String // Name of game + mShortDescription String // Short description + mDescription String // Supports markdown + mReleased DateTime // When the game was released + + ratings GameRating[] + + featured Boolean @default(false) + + mIconObjectId String // linked to objects in s3 + mBannerObjectId String // linked to objects in s3 + mCoverObjectId String + mImageCarouselObjectIds String[] // linked to below array + mImageLibraryObjectIds String[] // linked to objects in s3 + + versions Version[] + mods Mod[] + + libraryId String + library Library @relation(fields: [libraryId], references: [id], onDelete: Cascade, onUpdate: Cascade) + libraryPath String + + collections CollectionEntry[] + saves SaveSlot[] + screenshots Screenshot[] + tags GameTag[] + playtime Playtime[] + + developers Company[] @relation(name: "developers") + publishers Company[] @relation(name: "publishers") + + @@unique([metadataSource, metadataId], name: "metadataKey") + @@unique([libraryId, libraryPath], name: "libraryKey") +} + +model DLC { + id String @id @default(uuid()) + + name String + description String + iconObjectId String + + libraryId String + library Library @relation(fields: [libraryId], references: [id], onDelete: Cascade, onUpdate: Cascade) + libraryPath String + + versions Version[] + metadata GameDLCMetadata? +} + +model GameDLCMetadata { + id String @id + dlc DLC @relation(fields: [id], references: [id]) + + mName String + mShortDescription String + mDescription String + + mIconObjectId String // linked to objects in s3 + mBannerObjectId String // linked to objects in s3 + mCoverObjectId String + mImageCarouselObjectIds String[] // linked to below array + mImageLibraryObjectIds String[] // linked to objects in s3 +} + +model Redist { + id String @id @default(uuid()) + created DateTime @default(now()) + + mName String + mShortDescription String + mIconObjectId String + + libraryId String + library Library @relation(fields: [libraryId], references: [id], onDelete: Cascade, onUpdate: Cascade) + libraryPath String + + versions Version[] + platform UserPlatform? + + @@unique([libraryId, libraryPath], name: "libraryKey") +} + +model Mod { + id String @id @default(uuid()) + created DateTime @default(now()) + + gameId String + game Game @relation(fields: [gameId], references: [id]) + + // If this mod is user-provided + user Boolean @default(true) + + mName String + mShortDescription String + mDescription String + + mReleased DateTime + + mIconObjectId String // linked to objects in s3 + mBannerObjectId String // linked to objects in s3 + mCoverObjectId String + mImageCarouselObjectIds String[] // linked to below array + mImageLibraryObjectIds String[] // linked to objects in s3 + + libraryId String + library Library @relation(fields: [libraryId], references: [id], onDelete: Cascade, onUpdate: Cascade) + libraryPath String + + tags GameTag[] + + versions Version[] +} + +model GameTag { + id String @id @default(uuid()) + name String @unique + + games Game[] + mods Mod[] + + @@index([name(ops: raw("gist_trgm_ops(siglen=32)"))], type: Gist) +} + +model GameRating { + id String @id @default(uuid()) + + metadataSource MetadataSource + metadataId String + created DateTime @default(now()) + + mReviewCount Int + mReviewRating Float // 0 to 1 + + mReviewHref String? + + game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) + gameId String + + @@unique([metadataSource, metadataId], name: "metadataKey") +} + +model Company { + id String @id @default(uuid()) + + metadataSource MetadataSource + metadataId String + metadataOriginalQuery String + + mName String + mShortDescription String + mDescription String + mLogoObjectId String + mBannerObjectId String + mWebsite String + + developed Game[] @relation(name: "developers") + published Game[] @relation(name: "publishers") + + @@unique([metadataSource, metadataId], name: "metadataKey") +} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8fc2d88..a08fa9a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -10,15 +10,6 @@ generator client { binaryTargets = ["native", "debian-openssl-3.0.x"] } -/** - * generator arktype { - * provider = "yarn prismark" - * output = "./validate" - * fileName = "schema.ts" - * nullish = true - * } - */ - datasource db { provider = "postgresql" url = env("DATABASE_URL") diff --git a/server/api/v1/admin/auth/index.get.ts b/server/api/v1/admin/auth/index.get.ts index 4ea1523..ceae889 100644 --- a/server/api/v1/admin/auth/index.get.ts +++ b/server/api/v1/admin/auth/index.get.ts @@ -1,6 +1,6 @@ -import { AuthMec } from "~/prisma/client/enums"; -import aclManager from "~/server/internal/acls"; -import authManager from "~/server/internal/auth"; +import { AuthMec } from "~~/prisma/client/enums"; +import aclManager from "~~/server/internal/acls"; +import authManager from "~~/server/internal/auth"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["auth:read", "setup"]); diff --git a/server/api/v1/admin/auth/invitation/index.delete.ts b/server/api/v1/admin/auth/invitation/index.delete.ts index 195aae5..a7e01b0 100644 --- a/server/api/v1/admin/auth/invitation/index.delete.ts +++ b/server/api/v1/admin/auth/invitation/index.delete.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const DeleteInvite = type({ id: "string", diff --git a/server/api/v1/admin/auth/invitation/index.get.ts b/server/api/v1/admin/auth/invitation/index.get.ts index 0724e49..bb910ed 100644 --- a/server/api/v1/admin/auth/invitation/index.get.ts +++ b/server/api/v1/admin/auth/invitation/index.get.ts @@ -1,7 +1,7 @@ -import aclManager from "~/server/internal/acls"; -import { systemConfig } from "~/server/internal/config/sys-conf"; -import prisma from "~/server/internal/db/database"; -import taskHandler from "~/server/internal/tasks"; +import aclManager from "~~/server/internal/acls"; +import { systemConfig } from "~~/server/internal/config/sys-conf"; +import prisma from "~~/server/internal/db/database"; +import taskHandler from "~~/server/internal/tasks"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, [ diff --git a/server/api/v1/admin/auth/invitation/index.post.ts b/server/api/v1/admin/auth/invitation/index.post.ts index 69d3649..43d1d82 100644 --- a/server/api/v1/admin/auth/invitation/index.post.ts +++ b/server/api/v1/admin/auth/invitation/index.post.ts @@ -1,8 +1,8 @@ -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; import { SharedRegisterValidator } from "../../../auth/signup/simple.post"; -import { systemConfig } from "~/server/internal/config/sys-conf"; +import { systemConfig } from "~~/server/internal/config/sys-conf"; const CreateInvite = SharedRegisterValidator.partial() .and({ diff --git a/server/api/v1/admin/company/[id]/banner.post.ts b/server/api/v1/admin/company/[id]/banner.post.ts index 0c8744a..10146cf 100644 --- a/server/api/v1/admin/company/[id]/banner.post.ts +++ b/server/api/v1/admin/company/[id]/banner.post.ts @@ -1,7 +1,7 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import objectHandler from "~/server/internal/objects"; -import { handleFileUpload } from "~/server/internal/utils/handlefileupload"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import objectHandler from "~~/server/internal/objects"; +import { handleFileUpload } from "~~/server/internal/utils/handlefileupload"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["company:update"]); @@ -15,13 +15,13 @@ export default defineEventHandler(async (h3) => { }); if (!company) - throw createError({ statusCode: 400, statusMessage: "Invalid company id" }); + throw createError({ statusCode: 400, message: "Invalid company id" }); const result = await handleFileUpload(h3, {}, ["internal:read"], 1); if (!result) throw createError({ statusCode: 400, - statusMessage: "File upload required (multipart form)", + message: "File upload required (multipart form)", }); const [ids, , pull, dump] = result; @@ -29,7 +29,7 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "Upload at least one file.", + message: "Upload at least one file.", }); try { diff --git a/server/api/v1/admin/company/[id]/game.delete.ts b/server/api/v1/admin/company/[id]/game.delete.ts index 0a9fe21..1fe3145 100644 --- a/server/api/v1/admin/company/[id]/game.delete.ts +++ b/server/api/v1/admin/company/[id]/game.delete.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const GameDelete = type({ id: "string", diff --git a/server/api/v1/admin/company/[id]/game.patch.ts b/server/api/v1/admin/company/[id]/game.patch.ts index 9e0260f..2565775 100644 --- a/server/api/v1/admin/company/[id]/game.patch.ts +++ b/server/api/v1/admin/company/[id]/game.patch.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const GamePatch = type({ action: "'developed' | 'published'", diff --git a/server/api/v1/admin/company/[id]/game.post.ts b/server/api/v1/admin/company/[id]/game.post.ts index f873118..662aac7 100644 --- a/server/api/v1/admin/company/[id]/game.post.ts +++ b/server/api/v1/admin/company/[id]/game.post.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const GamePost = type({ published: "boolean", @@ -20,7 +20,7 @@ export default defineEventHandler(async (h3) => { if (!body.published && !body.developed) throw createError({ statusCode: 400, - statusMessage: "Must be related (either developed or published).", + message: "Must be related (either developed or published).", }); const publisherConnect = body.published diff --git a/server/api/v1/admin/company/[id]/icon.post.ts b/server/api/v1/admin/company/[id]/icon.post.ts index 0a4cefd..d6d6178 100644 --- a/server/api/v1/admin/company/[id]/icon.post.ts +++ b/server/api/v1/admin/company/[id]/icon.post.ts @@ -1,7 +1,7 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import objectHandler from "~/server/internal/objects"; -import { handleFileUpload } from "~/server/internal/utils/handlefileupload"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import objectHandler from "~~/server/internal/objects"; +import { handleFileUpload } from "~~/server/internal/utils/handlefileupload"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["company:update"]); @@ -15,13 +15,13 @@ export default defineEventHandler(async (h3) => { }); if (!company) - throw createError({ statusCode: 400, statusMessage: "Invalid company id" }); + throw createError({ statusCode: 400, message: "Invalid company id" }); const result = await handleFileUpload(h3, {}, ["internal:read"], 1); if (!result) throw createError({ statusCode: 400, - statusMessage: "File upload required (multipart form)", + message: "File upload required (multipart form)", }); const [ids, , pull, dump] = result; @@ -29,7 +29,7 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "Upload at least one file.", + message: "Upload at least one file.", }); try { diff --git a/server/api/v1/admin/company/[id]/index.delete.ts b/server/api/v1/admin/company/[id]/index.delete.ts index b27d393..a17928b 100644 --- a/server/api/v1/admin/company/[id]/index.delete.ts +++ b/server/api/v1/admin/company/[id]/index.delete.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["company:delete"]); @@ -9,6 +9,6 @@ export default defineEventHandler(async (h3) => { const company = await prisma.company.deleteMany({ where: { id } }); if (company.count == 0) - throw createError({ statusCode: 404, statusMessage: "Company not found" }); + throw createError({ statusCode: 404, message: "Company not found" }); return; }); diff --git a/server/api/v1/admin/company/[id]/index.get.ts b/server/api/v1/admin/company/[id]/index.get.ts index 50c4115..c911b15 100644 --- a/server/api/v1/admin/company/[id]/index.get.ts +++ b/server/api/v1/admin/company/[id]/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["company:read"]); @@ -23,7 +23,7 @@ export default defineEventHandler(async (h3) => { }, }); if (!company) - throw createError({ statusCode: 404, statusMessage: "Company not found" }); + throw createError({ statusCode: 404, message: "Company not found" }); const games = await prisma.game.findMany({ where: { OR: [ diff --git a/server/api/v1/admin/company/[id]/index.patch.ts b/server/api/v1/admin/company/[id]/index.patch.ts index 74511e2..ce0481a 100644 --- a/server/api/v1/admin/company/[id]/index.patch.ts +++ b/server/api/v1/admin/company/[id]/index.patch.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["company:update"]); diff --git a/server/api/v1/admin/company/index.get.ts b/server/api/v1/admin/company/index.get.ts index dac5ae2..042c546 100644 --- a/server/api/v1/admin/company/index.get.ts +++ b/server/api/v1/admin/company/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["company:read"]); diff --git a/server/api/v1/admin/company/index.post.ts b/server/api/v1/admin/company/index.post.ts index cbea4a1..8255f4b 100644 --- a/server/api/v1/admin/company/index.post.ts +++ b/server/api/v1/admin/company/index.post.ts @@ -1,10 +1,10 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; import * as jdenticon from "jdenticon"; -import { ObjectTransactionalHandler } from "~/server/internal/objects/transactional"; -import prisma from "~/server/internal/db/database"; -import { MetadataSource } from "~/prisma/client/enums"; +import { ObjectTransactionalHandler } from "~~/server/internal/objects/transactional"; +import prisma from "~~/server/internal/db/database"; +import { MetadataSource } from "~~/prisma/client/enums"; const CompanyCreate = type({ name: "string", diff --git a/server/api/v1/admin/game/[id]/index.delete.ts b/server/api/v1/admin/game/[id]/index.delete.ts index 66e7027..20c2f2a 100644 --- a/server/api/v1/admin/game/[id]/index.delete.ts +++ b/server/api/v1/admin/game/[id]/index.delete.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:delete"]); @@ -7,7 +7,7 @@ export default defineEventHandler(async (h3) => { const gameId = getRouterParam(h3, "id")!; - libraryManager.deleteGame(gameId); + await libraryManager.deleteGame(gameId); return {}; }); diff --git a/server/api/v1/admin/game/[id]/index.get.ts b/server/api/v1/admin/game/[id]/index.get.ts index 54f1af8..ffc65e1 100644 --- a/server/api/v1/admin/game/[id]/index.get.ts +++ b/server/api/v1/admin/game/[id]/index.get.ts @@ -1,7 +1,6 @@ -import type { GameVersion } from "~/prisma/client/client"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:read"]); @@ -15,24 +14,32 @@ export default defineEventHandler(async (h3) => { }, include: { versions: { - orderBy: { - versionIndex: "asc", - }, omit: { dropletManifest: true, }, + include: { + gameVersions: { + include: { + install: true, + uninstall: true, + launches: true, + }, + }, + }, }, tags: true, }, }); if (!game || !game.libraryId) - throw createError({ statusCode: 404, statusMessage: "Game ID not found" }); + throw createError({ statusCode: 404, message: "Game ID not found" }); - const getGameVersionSize = async (version: GameVersion) => { + const getGameVersionSize = async ( + version: Omit<(typeof game)["versions"][number], "dropletManifest">, + ) => { const size = await libraryManager.getGameVersionSize( gameId, - version.versionName, + version.versionId, ); return { ...version, size }; }; diff --git a/server/api/v1/admin/game/[id]/index.patch.ts b/server/api/v1/admin/game/[id]/index.patch.ts index 410adee..819bf08 100644 --- a/server/api/v1/admin/game/[id]/index.patch.ts +++ b/server/api/v1/admin/game/[id]/index.patch.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:update"]); diff --git a/server/api/v1/admin/game/[id]/metadata.post.ts b/server/api/v1/admin/game/[id]/metadata.post.ts index cd1dcbc..9a267a1 100644 --- a/server/api/v1/admin/game/[id]/metadata.post.ts +++ b/server/api/v1/admin/game/[id]/metadata.post.ts @@ -1,7 +1,13 @@ -import type { Prisma } from "~/prisma/client/client"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import { handleFileUpload } from "~/server/internal/utils/handlefileupload"; +import { ArkErrors, type } from "arktype"; +import type { Prisma } from "~~/prisma/client/client"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import { handleFileUpload } from "~~/server/internal/utils/handlefileupload"; + +const UpdateMetadata = type({ + name: "string?", + description: "string?", +}); export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:update"]); @@ -11,7 +17,7 @@ export default defineEventHandler(async (h3) => { if (!form) throw createError({ statusCode: 400, - statusMessage: "This endpoint requires multipart form data.", + message: "This endpoint requires multipart form data.", }); const gameId = getRouterParam(h3, "id")!; @@ -20,20 +26,20 @@ export default defineEventHandler(async (h3) => { if (!uploadResult) throw createError({ statusCode: 400, - statusMessage: "Failed to upload file", + message: "Failed to upload file", }); const [ids, options, pull, dump] = uploadResult; const id = ids.at(0); - // handleFileUpload reads the rest of the options for us. - const name = options.name; - const description = options.description; + const body = UpdateMetadata(options); + if (body instanceof ArkErrors) + throw createError({ statusCode: 400, message: body.summary }); const updateModel: Prisma.GameUpdateInput = { - mName: name, - mShortDescription: description, + ...(body.name ? { mName: body.name } : undefined), + ...(body.description ? { mShortDescription: body.description } : undefined), }; // handle if user uploaded new icon diff --git a/server/api/v1/admin/game/[id]/tags.patch.ts b/server/api/v1/admin/game/[id]/tags.patch.ts index d7192ad..df1acfc 100644 --- a/server/api/v1/admin/game/[id]/tags.patch.ts +++ b/server/api/v1/admin/game/[id]/tags.patch.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const PatchTags = type({ tags: "string[]", diff --git a/server/api/v1/admin/game/image/index.delete.ts b/server/api/v1/admin/game/image/index.delete.ts index d89ae76..0802885 100644 --- a/server/api/v1/admin/game/image/index.delete.ts +++ b/server/api/v1/admin/game/image/index.delete.ts @@ -1,8 +1,8 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import objectHandler from "~/server/internal/objects"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import objectHandler from "~~/server/internal/objects"; import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; const DeleteGameImage = type({ gameId: "string", @@ -32,20 +32,20 @@ export default defineEventHandler<{ }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); const imageIndex = game.mImageLibraryObjectIds.findIndex((e) => e == imageId); if (imageIndex == -1) - throw createError({ statusCode: 400, statusMessage: "Image not found" }); + throw createError({ statusCode: 400, message: "Image not found" }); game.mImageLibraryObjectIds.splice(imageIndex, 1); await objectHandler.deleteAsSystem(imageId); if (game.mBannerObjectId === imageId) { - game.mBannerObjectId = game.mImageLibraryObjectIds[0]; + game.mBannerObjectId = game.mImageLibraryObjectIds[0] ?? ""; } if (game.mCoverObjectId === imageId) { - game.mCoverObjectId = game.mImageLibraryObjectIds[0]; + game.mCoverObjectId = game.mImageLibraryObjectIds[0] ?? ""; } const result = await prisma.game.update({ diff --git a/server/api/v1/admin/game/image/index.post.ts b/server/api/v1/admin/game/image/index.post.ts index e230e9f..ed03351 100644 --- a/server/api/v1/admin/game/image/index.post.ts +++ b/server/api/v1/admin/game/image/index.post.ts @@ -1,6 +1,6 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import { handleFileUpload } from "~/server/internal/utils/handlefileupload"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import { handleFileUpload } from "~~/server/internal/utils/handlefileupload"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:image:new"]); @@ -10,14 +10,14 @@ export default defineEventHandler(async (h3) => { if (!form) throw createError({ statusCode: 400, - statusMessage: "This endpoint requires multipart form data.", + message: "This endpoint requires multipart form data.", }); const uploadResult = await handleFileUpload(h3, {}, ["internal:read"]); if (!uploadResult) throw createError({ statusCode: 400, - statusMessage: "Failed to upload file", + message: "Failed to upload file", }); const [ids, options, pull, dump] = uploadResult; @@ -25,21 +25,21 @@ export default defineEventHandler(async (h3) => { dump(); throw createError({ statusCode: 400, - statusMessage: "Did not upload a file", + message: "Did not upload a file", }); } - const gameId = options.id; + const gameId = options.id as string; if (!gameId) throw createError({ statusCode: 400, - statusMessage: "No game ID attached", + message: "No game ID attached", }); const hasGame = (await prisma.game.count({ where: { id: gameId } })) != 0; if (!hasGame) { dump(); - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); } const result = await prisma.game.update({ diff --git a/server/api/v1/admin/game/index.get.ts b/server/api/v1/admin/game/index.get.ts index c7ca363..3e9194d 100644 --- a/server/api/v1/admin/game/index.get.ts +++ b/server/api/v1/admin/game/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:read"]); diff --git a/server/api/v1/admin/game/version/index.delete.ts b/server/api/v1/admin/game/version/index.delete.ts index 6037858..415b42e 100644 --- a/server/api/v1/admin/game/version/index.delete.ts +++ b/server/api/v1/admin/game/version/index.delete.ts @@ -1,11 +1,10 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; const DeleteVersion = type({ id: "string", - versionName: "string", }).configure(throwingArktype); export default defineEventHandler<{ body: typeof DeleteVersion }>( @@ -17,10 +16,8 @@ export default defineEventHandler<{ body: typeof DeleteVersion }>( const body = await readDropValidatedBody(h3, DeleteVersion); - const gameId = body.id.toString(); - const version = body.versionName.toString(); + await libraryManager.deleteGameVersion(body.id); - await libraryManager.deleteGameVersion(gameId, version); return {}; }, ); diff --git a/server/api/v1/admin/game/version/index.patch.ts b/server/api/v1/admin/game/version/index.patch.ts index 54e0547..bbeee21 100644 --- a/server/api/v1/admin/game/version/index.patch.ts +++ b/server/api/v1/admin/game/version/index.patch.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const UpdateVersionOrder = type({ id: "string", @@ -16,57 +16,24 @@ export default defineEventHandler<{ body: typeof UpdateVersionOrder }>( if (!allowed) throw createError({ statusCode: 403 }); const body = await readDropValidatedBody(h3, UpdateVersionOrder); - const gameId = body.id; // We expect an array of the version names for this game - const unsortedVersions = await prisma.gameVersion.findMany({ - where: { - versionName: { in: body.versions }, - }, - select: { - versionName: true, - versionIndex: true, - delta: true, - platform: true, - }, - }); - - const versions = body.versions - .map((e) => unsortedVersions.find((v) => v.versionName === e)) - .filter((e) => e !== undefined); - - if (versions.length !== unsortedVersions.length) - throw createError({ - statusCode: 500, - statusMessage: "Sorting versions yielded less results, somehow.", - }); - - // Validate the new order - const has: { [key: string]: boolean } = {}; - for (const version of versions) { - if (version.delta && !has[version.platform]) - throw createError({ - statusCode: 400, - statusMessage: `"${version.versionName}" requires a base version to apply the delta to.`, - }); - has[version.platform] = true; - } + const versions = body.versions; await prisma.$transaction( - versions.map((version, versionIndex) => - prisma.gameVersion.update({ + versions.map((versionId, versionIndex) => + prisma.version.update({ where: { - gameId_versionName: { - gameId: gameId, - versionName: version.versionName, - }, + versionId, }, data: { versionIndex: versionIndex, }, + select: {}, }), ), ); - return versions; + setResponseStatus(h3, 201); + return; }, ); diff --git a/server/api/v1/admin/home/index.get.ts b/server/api/v1/admin/home/index.get.ts index 4cdcd02..e95c85e 100644 --- a/server/api/v1/admin/home/index.get.ts +++ b/server/api/v1/admin/home/index.get.ts @@ -1,8 +1,8 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import { systemConfig } from "~/server/internal/config/sys-conf"; -import libraryManager from "~/server/internal/library"; -import userStatsManager from "~/server/internal/userstats"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import { systemConfig } from "~~/server/internal/config/sys-conf"; +import libraryManager from "~~/server/internal/library"; +import userStatsManager from "~~/server/internal/userstats"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["game:read"]); diff --git a/server/api/v1/admin/import/game/index.get.ts b/server/api/v1/admin/import/game/index.get.ts index 8ef65fb..f32e2ea 100644 --- a/server/api/v1/admin/import/game/index.get.ts +++ b/server/api/v1/admin/import/game/index.get.ts @@ -1,8 +1,8 @@ -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; export default defineEventHandler(async (h3) => { - const allowed = await aclManager.allowSystemACL(h3, ["import:game:read"]); + const allowed = await aclManager.allowSystemACL(h3, ["import:game:read", "import:redist:read"]); if (!allowed) throw createError({ statusCode: 403 }); const unimportedGames = await libraryManager.fetchUnimportedGames(); diff --git a/server/api/v1/admin/import/game/index.post.ts b/server/api/v1/admin/import/game/index.post.ts index e3e3247..01aef8e 100644 --- a/server/api/v1/admin/import/game/index.post.ts +++ b/server/api/v1/admin/import/game/index.post.ts @@ -1,8 +1,8 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; -import metadataHandler from "~/server/internal/metadata"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; +import metadataHandler from "~~/server/internal/metadata"; const ImportGameBody = type({ library: "string", @@ -27,14 +27,14 @@ export default defineEventHandler<{ body: typeof ImportGameBody.infer }>( if (!path) throw createError({ statusCode: 400, - statusMessage: "Path missing from body", + message: "Path missing from body", }); const valid = await libraryManager.checkUnimportedGamePath(library, path); if (!valid) throw createError({ statusCode: 400, - statusMessage: "Invalid library or game.", + message: "Invalid library or game.", }); const taskId = metadata @@ -44,7 +44,7 @@ export default defineEventHandler<{ body: typeof ImportGameBody.infer }>( if (!taskId) throw createError({ statusCode: 400, - statusMessage: + message: "Duplicate metadata import. Please chose a different game or metadata provider.", }); diff --git a/server/api/v1/admin/import/game/search.get.ts b/server/api/v1/admin/import/game/search.get.ts index a68f45d..531955d 100644 --- a/server/api/v1/admin/import/game/search.get.ts +++ b/server/api/v1/admin/import/game/search.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import metadataHandler from "~/server/internal/metadata"; +import aclManager from "~~/server/internal/acls"; +import metadataHandler from "~~/server/internal/metadata"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["import:game:read"]); @@ -8,14 +8,14 @@ export default defineEventHandler(async (h3) => { const query = getQuery(h3); const search = query.q?.toString(); if (!search) - throw createError({ statusCode: 400, statusMessage: "Invalid search" }); + throw createError({ statusCode: 400, message: "Invalid search" }); const results = await metadataHandler.search(search); if (results.length == 0) throw createError({ statusCode: 404, - statusMessage: "No metadata provider returned search results.", + message: "No metadata provider returned search results.", }); return results; diff --git a/server/api/v1/admin/import/redist/index.get.ts b/server/api/v1/admin/import/redist/index.get.ts new file mode 100644 index 0000000..8620668 --- /dev/null +++ b/server/api/v1/admin/import/redist/index.get.ts @@ -0,0 +1,3 @@ +import handler from "../game/index.get"; + +export default handler; \ No newline at end of file diff --git a/server/api/v1/admin/import/redist/index.post.ts b/server/api/v1/admin/import/redist/index.post.ts new file mode 100644 index 0000000..9fd768d --- /dev/null +++ b/server/api/v1/admin/import/redist/index.post.ts @@ -0,0 +1,92 @@ +import { ArkErrors, type } from "arktype"; +import aclManager from "~~/server/internal/acls"; +import { handleFileUpload } from "~~/server/internal/utils/handlefileupload"; +import * as jdenticon from "jdenticon"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; +import jsdom from "jsdom"; + +export const ImportRedist = type({ + library: "string", + path: "string", + + name: "string", + description: "string", + + "platform?": type({ + name: "string", + icon: "string", + fileExts: type("string").pipe.try((s) => JSON.parse(s), type("string.alphanumeric").array()), + }), +}); + +export default defineEventHandler(async (h3) => { + const allowed = await aclManager.allowSystemACL(h3, ["import:redist:new"]); + if (!allowed) throw createError({ statusCode: 403 }); + + const body = await handleFileUpload(h3, {}, ["internal:read"], 1); + if (!body) throw createError({ statusCode: 400, message: "Body required." }); + + const [ids, rawOptions, pull, , add] = body; + const id = ids.at(0); + + const options = ImportRedist(rawOptions); + if (options instanceof ArkErrors) + throw createError({ statusCode: 400, message: options.summary }); + + const valid = await libraryManager.checkUnimportedGamePath( + options.library, + options.path, + ); + if (!valid) + throw createError({ + statusCode: 400, + message: "Invalid library or game.", + }); + + const icon = id ?? add(jdenticon.toPng(options.name, 512)); + + let svgContent = ""; + if (options.platform) { + // This logic is duplicated on the client to make viewing there possible. + // TODO?: refactor into a single function. Not totally sure if this is a good idea though, + // because they do different things + const dom = new jsdom.JSDOM(options.platform.icon); + const svg = dom.window.document.getElementsByTagName("svg").item(0); + if (!svg) + throw createError({ + statusCode: 400, + statusMessage: "No SVG in uploaded image.", + }); + svg.removeAttribute("width"); + svg.removeAttribute("height"); + svgContent = svg.outerHTML; + } + + const redist = await prisma.redist.create({ + data: { + libraryId: options.library, + libraryPath: options.path, + + mName: options.name, + mShortDescription: options.description, + mIconObjectId: icon, + + platform: { + ...(options.platform + ? { + create: { + platformName: options.platform.name, + iconSvg: svgContent, + fileExtensions: options.platform.fileExts.map((v) => `.${v}`), + }, + } + : undefined), + }, + }, + }); + + await pull(); + + return redist; +}); diff --git a/server/api/v1/admin/import/version/index.get.ts b/server/api/v1/admin/import/version/index.get.ts index 893d295..c10427a 100644 --- a/server/api/v1/admin/import/version/index.get.ts +++ b/server/api/v1/admin/import/version/index.get.ts @@ -1,32 +1,36 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; +import { ArkErrors, type } from "arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import libraryManager, { VersionImportModes } from "~~/server/internal/library"; + +export const PreloadQuery = type({ + id: "string", + mode: type.enumerated(...VersionImportModes), +}); export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["import:version:read"]); if (!allowed) throw createError({ statusCode: 403 }); - const query = await getQuery(h3); - const gameId = query.id?.toString(); - if (!gameId) - throw createError({ - statusCode: 400, - statusMessage: "Missing id in request params", - }); + const rawQuery = await getQuery(h3); + const query = PreloadQuery(rawQuery); + if (query instanceof ArkErrors) + throw createError({ statusCode: 400, message: query.summary }); - const game = await prisma.game.findUnique({ - where: { id: gameId }, - select: { libraryId: true, libraryPath: true }, - }); - if (!game || !game.libraryId) - throw createError({ statusCode: 404, statusMessage: "Game not found" }); + const value: { libraryId: string; libraryPath: string } | undefined = + await // eslint-disable-next-line @typescript-eslint/no-explicit-any + (prisma[query.mode] as any).findUnique({ + where: { id: query.id }, + select: { libraryId: true, libraryPath: true }, + }); + if (!value) throw createError({ statusCode: 404, message: "Not found" }); const unimportedVersions = await libraryManager.fetchUnimportedGameVersions( - game.libraryId, - game.libraryPath, + value.libraryId, + value.libraryPath, ); if (!unimportedVersions) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); return unimportedVersions; }); diff --git a/server/api/v1/admin/import/version/index.post.ts b/server/api/v1/admin/import/version/index.post.ts index ab9ad1c..34c8fce 100644 --- a/server/api/v1/admin/import/version/index.post.ts +++ b/server/api/v1/admin/import/version/index.post.ts @@ -1,88 +1,71 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; -import { parsePlatform } from "~/server/internal/utils/parseplatform"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; -const ImportVersion = type({ +export const LaunchCommands = type({ + name: "string > 0", + description: "string = ''", + launchCommand: "string > 0", + launchArgs: "string = ''", +}).array(); + +const ImportVersionBase = type({ id: "string", version: "string", + name: "string?", platform: "string", - launch: "string = ''", - launchArgs: "string = ''", - setup: "string = ''", - setupArgs: "string = ''", - onlySetup: "boolean = false", delta: "boolean = false", +}); + +const ImportGameVersion = type({ + mode: "'game'", + onlySetup: "boolean = false", umuId: "string = ''", -}).configure(throwingArktype); + + install: "string?", + installArgs: "string?", + launches: LaunchCommands, + uninstall: "string?", + uninstallArgs: "string?", +}); + +const ImportRedistVersion = type({ + mode: "'redist'", + install: "string?", + installArgs: "string?", + launches: LaunchCommands, + uninstall: "string?", + uninstallArgs: "string?", +}); + +export const ImportVersion = ImportVersionBase.and( + ImportGameVersion.or(ImportRedistVersion), +).configure(throwingArktype); + +export type ImportGameVersion = typeof ImportVersionBase.infer & + typeof ImportGameVersion.infer; + +export type ImportRedistVersion = typeof ImportVersionBase.infer & + typeof ImportRedistVersion.infer; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["import:version:new"]); if (!allowed) throw createError({ statusCode: 403 }); - const { - id, - version, - platform, - launch, - launchArgs, - setup, - setupArgs, - onlySetup, - delta, - umuId, - } = await readDropValidatedBody(h3, ImportVersion); - - const platformParsed = parsePlatform(platform); - if (!platformParsed) - throw createError({ statusCode: 400, statusMessage: "Invalid platform." }); - - if (delta) { - const validOverlayVersions = await prisma.gameVersion.count({ - where: { gameId: id, platform: platformParsed, delta: false }, - }); - if (validOverlayVersions == 0) - throw createError({ - statusCode: 400, - statusMessage: - "Update mode requires a pre-existing version for this platform.", - }); - } - - if (onlySetup) { - if (!setup) - throw createError({ - statusCode: 400, - statusMessage: 'Setup required in "setup mode".', - }); - } else { - if (!delta && !launch) - throw createError({ - statusCode: 400, - statusMessage: "Launch executable is required for non-update versions", - }); - } + const body = await readDropValidatedBody(h3, ImportVersion); // startup & delta require more complex checking logic - const taskId = await libraryManager.importVersion(id, version, { - platform, - onlySetup, - - launch, - launchArgs, - setup, - setupArgs, - - umuId, - delta, - }); + const taskId = await libraryManager.importVersion( + body.id, + body.version, + body, + ); if (!taskId) throw createError({ statusCode: 400, - statusMessage: "Invalid options for import", + message: "Invalid options for import", }); return { taskId: taskId }; diff --git a/server/api/v1/admin/import/version/preload.get.ts b/server/api/v1/admin/import/version/preload.get.ts index d83b936..d8cafbe 100644 --- a/server/api/v1/admin/import/version/preload.get.ts +++ b/server/api/v1/admin/import/version/preload.get.ts @@ -1,27 +1,31 @@ -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; +import { ArkErrors, type } from "arktype"; +import aclManager from "~~/server/internal/acls"; +import libraryManager, { VersionImportModes } from "~~/server/internal/library"; + +export const PreloadQuery = type({ + id: "string", + version: "string", + mode: type.enumerated(...VersionImportModes), +}); export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["import:version:read"]); if (!allowed) throw createError({ statusCode: 403 }); - const query = await getQuery(h3); - const gameId = query.id?.toString(); - const versionName = query.version?.toString(); - if (!gameId || !versionName) - throw createError({ - statusCode: 400, - statusMessage: "Missing id or version in request params", - }); + const rawQuery = await getQuery(h3); + const query = PreloadQuery(rawQuery); + if (query instanceof ArkErrors) + throw createError({ statusCode: 400, message: query.summary }); const preload = await libraryManager.fetchUnimportedVersionInformation( - gameId, - versionName, + query.id, + query.mode, + query.version, ); if (!preload) throw createError({ statusCode: 400, - statusMessage: "Invalid game or version id/name", + message: "Invalid game or version id/name", }); return preload; diff --git a/server/api/v1/admin/index.get.ts b/server/api/v1/admin/index.get.ts index 9d52d0f..6faaff1 100644 --- a/server/api/v1/admin/index.get.ts +++ b/server/api/v1/admin/index.get.ts @@ -1,4 +1,4 @@ -import aclManager from "~/server/internal/acls"; +import aclManager from "~~/server/internal/acls"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, []); diff --git a/server/api/v1/admin/library/index.get.ts b/server/api/v1/admin/library/index.get.ts index 5df358b..99187f0 100644 --- a/server/api/v1/admin/library/index.get.ts +++ b/server/api/v1/admin/library/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["library:read"]); @@ -7,9 +7,15 @@ export default defineEventHandler(async (h3) => { const unimportedGames = await libraryManager.fetchUnimportedGames(); const games = await libraryManager.fetchGamesWithStatus(); + const redists = await libraryManager.fetchRedistsWithStatus(); const libraries = await libraryManager.fetchLibraries(); // Fetch other library data here - return { unimportedGames, games, hasLibraries: libraries.length > 0 }; + return { + unimportedGames, + games, + redists, + hasLibraries: libraries.length > 0, + }; }); diff --git a/server/api/v1/admin/library/sources/index.delete.ts b/server/api/v1/admin/library/sources/index.delete.ts index 165a9b2..e33e47c 100644 --- a/server/api/v1/admin/library/sources/index.delete.ts +++ b/server/api/v1/admin/library/sources/index.delete.ts @@ -1,8 +1,8 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; const DeleteLibrarySource = type({ id: "string", diff --git a/server/api/v1/admin/library/sources/index.get.ts b/server/api/v1/admin/library/sources/index.get.ts index 25b0f0b..89c2d63 100644 --- a/server/api/v1/admin/library/sources/index.get.ts +++ b/server/api/v1/admin/library/sources/index.get.ts @@ -1,6 +1,6 @@ -import type { LibraryModel } from "~/prisma/client/models"; -import aclManager from "~/server/internal/acls"; -import libraryManager from "~/server/internal/library"; +import type { LibraryModel } from "~~/prisma/client/models"; +import aclManager from "~~/server/internal/acls"; +import libraryManager from "~~/server/internal/library"; export type WorkingLibrarySource = LibraryModel & { working: boolean; diff --git a/server/api/v1/admin/library/sources/index.patch.ts b/server/api/v1/admin/library/sources/index.patch.ts index 7cec327..57d4a48 100644 --- a/server/api/v1/admin/library/sources/index.patch.ts +++ b/server/api/v1/admin/library/sources/index.patch.ts @@ -1,10 +1,10 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; -import type { WorkingLibrarySource } from "~/server/api/v1/admin/library/sources/index.get"; -import { libraryConstructors } from "~/server/plugins/05.library-init"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; +import type { WorkingLibrarySource } from "~~/server/api/v1/admin/library/sources/index.get"; +import { libraryConstructors } from "~~/server/plugins/05.library-init"; const UpdateLibrarySource = type({ id: "string", @@ -26,7 +26,7 @@ export default defineEventHandler<{ body: typeof UpdateLibrarySource.infer }>( if (!source) throw createError({ statusCode: 400, - statusMessage: "Library source not found", + message: "Library source not found", }); const constructor = libraryConstructors[source.backend]; @@ -61,7 +61,7 @@ export default defineEventHandler<{ body: typeof UpdateLibrarySource.infer }>( } catch (e) { throw createError({ statusCode: 400, - statusMessage: `Failed to create source: ${e}`, + message: `Failed to create source: ${e}`, }); } }, diff --git a/server/api/v1/admin/library/sources/index.post.ts b/server/api/v1/admin/library/sources/index.post.ts index 68ccce8..8dad442 100644 --- a/server/api/v1/admin/library/sources/index.post.ts +++ b/server/api/v1/admin/library/sources/index.post.ts @@ -1,12 +1,12 @@ import { type } from "arktype"; import { randomUUID } from "crypto"; -import { LibraryBackend } from "~/prisma/client/enums"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; -import { libraryConstructors } from "~/server/plugins/05.library-init"; -import type { WorkingLibrarySource } from "~/server/api/v1/admin/library/sources/index.get"; +import { LibraryBackend } from "~~/prisma/client/enums"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; +import { libraryConstructors } from "~~/server/plugins/05.library-init"; +import type { WorkingLibrarySource } from "~~/server/api/v1/admin/library/sources/index.get"; const CreateLibrarySource = type({ name: "string", @@ -29,7 +29,7 @@ export default defineEventHandler<{ body: typeof CreateLibrarySource.infer }>( if (!backend) throw createError({ statusCode: 400, - statusMessage: "Invalid source backend.", + message: "Invalid source backend.", }); const constructor = libraryConstructors[backend]; @@ -64,7 +64,7 @@ export default defineEventHandler<{ body: typeof CreateLibrarySource.infer }>( } catch (e) { throw createError({ statusCode: 400, - statusMessage: `Failed to create source: ${e}`, + message: `Failed to create source: ${e}`, }); } }, diff --git a/server/api/v1/admin/news/[id]/index.delete.ts b/server/api/v1/admin/news/[id]/index.delete.ts index 30c4913..9fbb104 100644 --- a/server/api/v1/admin/news/[id]/index.delete.ts +++ b/server/api/v1/admin/news/[id]/index.delete.ts @@ -1,6 +1,6 @@ import { defineEventHandler, createError } from "h3"; -import aclManager from "~/server/internal/acls"; -import newsManager from "~/server/internal/news"; +import aclManager from "~~/server/internal/acls"; +import newsManager from "~~/server/internal/news"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["news:delete"]); diff --git a/server/api/v1/admin/news/[id]/index.get.ts b/server/api/v1/admin/news/[id]/index.get.ts index 50161e3..cb54b25 100644 --- a/server/api/v1/admin/news/[id]/index.get.ts +++ b/server/api/v1/admin/news/[id]/index.get.ts @@ -1,6 +1,6 @@ import { defineEventHandler, createError } from "h3"; -import aclManager from "~/server/internal/acls"; -import newsManager from "~/server/internal/news"; +import aclManager from "~~/server/internal/acls"; +import newsManager from "~~/server/internal/news"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["news:read"]); diff --git a/server/api/v1/admin/news/index.get.ts b/server/api/v1/admin/news/index.get.ts index 392f4b7..316c565 100644 --- a/server/api/v1/admin/news/index.get.ts +++ b/server/api/v1/admin/news/index.get.ts @@ -1,6 +1,6 @@ import { defineEventHandler, getQuery } from "h3"; -import aclManager from "~/server/internal/acls"; -import newsManager from "~/server/internal/news"; +import aclManager from "~~/server/internal/acls"; +import newsManager from "~~/server/internal/news"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["news:read"]); @@ -14,13 +14,13 @@ export default defineEventHandler(async (h3) => { const orderBy = query.order as "asc" | "desc"; if (orderBy) { if (typeof orderBy !== "string" || !["asc", "desc"].includes(orderBy)) - throw createError({ statusCode: 400, statusMessage: "Invalid order" }); + throw createError({ statusCode: 400, message: "Invalid order" }); } const tags = query.tags as string[] | undefined; if (tags) { if (typeof tags !== "object" || !Array.isArray(tags)) - throw createError({ statusCode: 400, statusMessage: "Invalid tags" }); + throw createError({ statusCode: 400, message: "Invalid tags" }); } const options = { diff --git a/server/api/v1/admin/news/index.post.ts b/server/api/v1/admin/news/index.post.ts index fb09c2e..1de0fae 100644 --- a/server/api/v1/admin/news/index.post.ts +++ b/server/api/v1/admin/news/index.post.ts @@ -1,8 +1,8 @@ import { ArkErrors, type } from "arktype"; import { defineEventHandler, createError } from "h3"; -import aclManager from "~/server/internal/acls"; -import newsManager from "~/server/internal/news"; -import { handleFileUpload } from "~/server/internal/utils/handlefileupload"; +import aclManager from "~~/server/internal/acls"; +import newsManager from "~~/server/internal/news"; +import { handleFileUpload } from "~~/server/internal/utils/handlefileupload"; const CreateNews = type({ title: "string", @@ -19,27 +19,27 @@ export default defineEventHandler(async (h3) => { if (!form) throw createError({ statusCode: 400, - statusMessage: "This endpoint requires multipart form data.", + message: "This endpoint requires multipart form data.", }); const uploadResult = await handleFileUpload(h3, {}, ["internal:read"], 1); if (!uploadResult) throw createError({ statusCode: 400, - statusMessage: "Failed to upload file", + message: "Failed to upload file", }); const [imageIds, options, pull, _dump] = uploadResult; const body = await CreateNews(options); if (body instanceof ArkErrors) - throw createError({ statusCode: 400, statusMessage: body.summary }); + throw createError({ statusCode: 400, message: body.summary }); const parsedTags = JSON.parse(body.tags); if (typeof parsedTags !== "object" || !Array.isArray(parsedTags)) throw createError({ statusCode: 400, - statusMessage: "Tags must be an array", + message: "Tags must be an array", }); const imageId = imageIds.at(0); diff --git a/server/api/v1/admin/platforms.get.ts b/server/api/v1/admin/platforms.get.ts new file mode 100644 index 0000000..3dcbe37 --- /dev/null +++ b/server/api/v1/admin/platforms.get.ts @@ -0,0 +1,11 @@ +import aclManager from "~~/server/internal/acls" +import prisma from "~~/server/internal/db/database"; + +export default defineEventHandler(async (h3) => { + const allowed = await aclManager.allowSystemACL(h3, ["import:version:read"]); + if(!allowed) throw createError({statusCode: 403}); + + const userPlatforms = await prisma.userPlatform.findMany({}); + + return userPlatforms; +}) diff --git a/server/api/v1/admin/redist/[id]/index.delete.ts b/server/api/v1/admin/redist/[id]/index.delete.ts new file mode 100644 index 0000000..ab39b94 --- /dev/null +++ b/server/api/v1/admin/redist/[id]/index.delete.ts @@ -0,0 +1,19 @@ +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; + +export default defineEventHandler(async (h3) => { + const allowed = await aclManager.allowSystemACL(h3, ["redist:delete"]); + if (!allowed) throw createError({ statusCode: 403 }); + + const id = getRouterParam(h3, "id")!; + + const { count } = await prisma.redist.deleteMany({ + where: { + id, + }, + }); + + if (count == 0) throw createError({ statusCode: 404 }); + + return; +}); diff --git a/server/api/v1/admin/redist/[id]/index.get.ts b/server/api/v1/admin/redist/[id]/index.get.ts new file mode 100644 index 0000000..751be85 --- /dev/null +++ b/server/api/v1/admin/redist/[id]/index.get.ts @@ -0,0 +1,38 @@ +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; + +export default defineEventHandler(async (h3) => { + const allowed = await aclManager.allowSystemACL(h3, ["redist:read"]); + if (!allowed) throw createError({ statusCode: 403 }); + + const id = getRouterParam(h3, "id")!; + + const redist = await prisma.redist.findUnique({ + where: { + id, + }, + include: { + platform: true, + versions: true, + }, + }); + if (!redist) + throw createError({ + statusCode: 404, + message: "Redistributable not found.", + }); + + const unimportedVersions = await libraryManager.fetchUnimportedGameVersions( + redist.libraryId, + redist.libraryPath, + ); + + if (!unimportedVersions) + throw createError({ + statusCode: 500, + message: "Failed to fetch unimported versions for redistributable.", + }); + + return { redist, unimportedVersions }; +}); diff --git a/server/api/v1/admin/redist/[id]/index.patch.ts b/server/api/v1/admin/redist/[id]/index.patch.ts new file mode 100644 index 0000000..7aa7d95 --- /dev/null +++ b/server/api/v1/admin/redist/[id]/index.patch.ts @@ -0,0 +1,27 @@ +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; + +export default defineEventHandler(async (h3) => { + const allowed = await aclManager.allowSystemACL(h3, ["redist:update"]); + if (!allowed) throw createError({ statusCode: 403 }); + + const body = await readBody(h3); + + const id = body.id; + if (!id || typeof id !== "string") + throw createError({ statusCode: 400, message: "ID required in body." }); + + const updateParams = body; + delete updateParams["id"]; + + try { + return await prisma.redist.update({ + where: { + id, + }, + data: updateParams, + }); + } catch (e) { + throw createError({ statusCode: 400, message: (e as string)?.toString() }); + } +}); diff --git a/server/api/v1/admin/redist/index.get.ts b/server/api/v1/admin/redist/index.get.ts new file mode 100644 index 0000000..e131c07 --- /dev/null +++ b/server/api/v1/admin/redist/index.get.ts @@ -0,0 +1,16 @@ +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; + +export default defineEventHandler(async (h3) => { + const allowed = await aclManager.allowSystemACL(h3, ["redist:read"]); + if (!allowed) throw createError({ statusCode: 403 }); + + return await prisma.redist.findMany({ + select: { + id: true, + mName: true, + mShortDescription: true, + mIconObjectId: true, + }, + }); +}); diff --git a/server/api/v1/admin/settings/dummy-data.get.ts b/server/api/v1/admin/settings/dummy-data.get.ts index 6f62372..ff6bb30 100644 --- a/server/api/v1/admin/settings/dummy-data.get.ts +++ b/server/api/v1/admin/settings/dummy-data.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.getUserACL(h3, ["settings:read"]); diff --git a/server/api/v1/admin/settings/index.patch.ts b/server/api/v1/admin/settings/index.patch.ts index ef99441..f56da1b 100644 --- a/server/api/v1/admin/settings/index.patch.ts +++ b/server/api/v1/admin/settings/index.patch.ts @@ -1,8 +1,8 @@ import { type } from "arktype"; -import { applicationSettings } from "~/server/internal/config/application-configuration"; -import { readDropValidatedBody } from "~/server/arktype"; +import { applicationSettings } from "~~/server/internal/config/application-configuration"; +import { readDropValidatedBody } from "~~/server/arktype"; import { defineEventHandler, createError } from "h3"; -import aclManager from "~/server/internal/acls"; +import aclManager from "~~/server/internal/acls"; const UpdateSettings = type({ showGamePanelTextDecoration: "boolean", diff --git a/server/api/v1/admin/tags/[id]/index.delete.ts b/server/api/v1/admin/tags/[id]/index.delete.ts index 4279257..b37c6dc 100644 --- a/server/api/v1/admin/tags/[id]/index.delete.ts +++ b/server/api/v1/admin/tags/[id]/index.delete.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["tags:delete"]); @@ -9,6 +9,6 @@ export default defineEventHandler(async (h3) => { const tag = await prisma.gameTag.deleteMany({ where: { id } }); if (tag.count == 0) - throw createError({ statusCode: 404, statusMessage: "Tag not found" }); + throw createError({ statusCode: 404, message: "Tag not found" }); return; }); diff --git a/server/api/v1/admin/tags/index.get.ts b/server/api/v1/admin/tags/index.get.ts index d8f1c1e..1713431 100644 --- a/server/api/v1/admin/tags/index.get.ts +++ b/server/api/v1/admin/tags/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["tags:read"]); diff --git a/server/api/v1/admin/tags/index.post.ts b/server/api/v1/admin/tags/index.post.ts index 15698e7..e06eaae 100644 --- a/server/api/v1/admin/tags/index.post.ts +++ b/server/api/v1/admin/tags/index.post.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const CreateTag = type({ name: "string", diff --git a/server/api/v1/admin/task/index.get.ts b/server/api/v1/admin/task/index.get.ts index 690dce8..2395831 100644 --- a/server/api/v1/admin/task/index.get.ts +++ b/server/api/v1/admin/task/index.get.ts @@ -1,7 +1,7 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import type { TaskMessage } from "~/server/internal/tasks"; -import taskHandler from "~/server/internal/tasks"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import type { TaskMessage } from "~~/server/internal/tasks"; +import taskHandler from "~~/server/internal/tasks"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["task:read"]); @@ -10,7 +10,7 @@ export default defineEventHandler(async (h3) => { if (!allAcls) throw createError({ statusCode: 403, - statusMessage: "Somehow no ACLs on authenticated request.", + message: "Somehow no ACLs on authenticated request.", }); const runningTasks = (await taskHandler.runningTasks()).map((e) => e.id); diff --git a/server/api/v1/admin/task/index.post.ts b/server/api/v1/admin/task/index.post.ts index dc28190..2339f84 100644 --- a/server/api/v1/admin/task/index.post.ts +++ b/server/api/v1/admin/task/index.post.ts @@ -1,12 +1,11 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager from "~/server/internal/acls"; -import taskHandler from "~/server/internal/tasks"; -import type { TaskGroup } from "~/server/internal/tasks/group"; -import { taskGroups } from "~/server/internal/tasks/group"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager from "~~/server/internal/acls"; +import taskHandler from "~~/server/internal/tasks"; +import { TASK_GROUPS } from "~~/server/internal/tasks/group"; const StartTask = type({ - taskGroup: type("string"), + taskGroup: type.enumerated(...TASK_GROUPS), }).configure(throwingArktype); export default defineEventHandler(async (h3) => { @@ -14,18 +13,12 @@ export default defineEventHandler(async (h3) => { if (!allowed) throw createError({ statusCode: 403 }); const body = await readDropValidatedBody(h3, StartTask); - const taskGroup = body.taskGroup as TaskGroup; - if (!taskGroups[taskGroup]) - throw createError({ - statusCode: 400, - statusMessage: "Invalid task group.", - }); - const task = await taskHandler.runTaskGroupByName(taskGroup); + const task = await taskHandler.runTaskGroupByName(body.taskGroup); if (!task) throw createError({ statusCode: 500, - statusMessage: "Could not start task.", + message: "Could not start task.", }); return { id: task }; }); diff --git a/server/api/v1/admin/token/[id]/index.delete.ts b/server/api/v1/admin/token/[id]/index.delete.ts index 1e33730..f72e161 100644 --- a/server/api/v1/admin/token/[id]/index.delete.ts +++ b/server/api/v1/admin/token/[id]/index.delete.ts @@ -1,6 +1,6 @@ -import { APITokenMode } from "~/prisma/client/enums"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication @@ -10,14 +10,14 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "No id in router params", + message: "No id in router params", }); const deleted = await prisma.aPIToken.delete({ where: { id: id, mode: APITokenMode.System }, })!; if (!deleted) - throw createError({ statusCode: 404, statusMessage: "Token not found" }); + throw createError({ statusCode: 404, message: "Token not found" }); return; }); diff --git a/server/api/v1/admin/token/acls.get.ts b/server/api/v1/admin/token/acls.get.ts index 09b4e0f..f039315 100644 --- a/server/api/v1/admin/token/acls.get.ts +++ b/server/api/v1/admin/token/acls.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import { systemACLDescriptions } from "~/server/internal/acls/descriptions"; +import aclManager from "~~/server/internal/acls"; +import { systemACLDescriptions } from "~~/server/internal/acls/descriptions"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication diff --git a/server/api/v1/admin/token/index.get.ts b/server/api/v1/admin/token/index.get.ts index 2438a4b..ce8410e 100644 --- a/server/api/v1/admin/token/index.get.ts +++ b/server/api/v1/admin/token/index.get.ts @@ -1,6 +1,6 @@ -import { APITokenMode } from "~/prisma/client/enums"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, []); // No ACLs only allows session authentication diff --git a/server/api/v1/admin/token/index.post.ts b/server/api/v1/admin/token/index.post.ts index 421fe8d..98b000e 100644 --- a/server/api/v1/admin/token/index.post.ts +++ b/server/api/v1/admin/token/index.post.ts @@ -1,8 +1,8 @@ import { type } from "arktype"; -import { APITokenMode } from "~/prisma/client/enums"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager, { systemACLs } from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager, { systemACLs } from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const CreateToken = type({ name: "string", @@ -22,7 +22,7 @@ export default defineEventHandler(async (h3) => { if (invalidACLs.length > 0) throw createError({ statusCode: 400, - statusMessage: `Invalid ACLs: ${invalidACLs.join(", ")}`, + message: `Invalid ACLs: ${invalidACLs.join(", ")}`, }); const token = await prisma.aPIToken.create({ diff --git a/server/api/v1/admin/users/[id]/index.delete.ts b/server/api/v1/admin/users/[id]/index.delete.ts index 4b5b141..7f6025d 100644 --- a/server/api/v1/admin/users/[id]/index.delete.ts +++ b/server/api/v1/admin/users/[id]/index.delete.ts @@ -1,7 +1,7 @@ import { defineEventHandler, createError } from "h3"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import userStatsManager from "~/server/internal/userstats"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import userStatsManager from "~~/server/internal/userstats"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["user:delete"]); @@ -20,12 +20,12 @@ export default defineEventHandler(async (h3) => { if (userId === "system") throw createError({ statusCode: 400, - statusMessage: "Cannot interact with system user.", + message: "Cannot interact with system user.", }); const user = await prisma.user.findUnique({ where: { id: userId } }); if (!user) - throw createError({ statusCode: 404, statusMessage: "User not found." }); + throw createError({ statusCode: 404, message: "User not found." }); await prisma.user.delete({ where: { id: userId } }); await userStatsManager.deleteUser(); diff --git a/server/api/v1/admin/users/[id]/index.get.ts b/server/api/v1/admin/users/[id]/index.get.ts index f90db23..e6f8f1a 100644 --- a/server/api/v1/admin/users/[id]/index.get.ts +++ b/server/api/v1/admin/users/[id]/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["user:read"]); @@ -9,18 +9,18 @@ export default defineEventHandler(async (h3) => { if (!userId) throw createError({ statusCode: 400, - statusMessage: "No userId in route.", + message: "No userId in route.", }); if (userId == "system") throw createError({ statusCode: 400, - statusMessage: "Cannot delete system user.", + message: "Cannot fetch system user.", }); const user = await prisma.user.findUnique({ where: { id: userId } }); if (!user) - throw createError({ statusCode: 404, statusMessage: "User not found." }); + throw createError({ statusCode: 404, message: "User not found." }); return user; }); diff --git a/server/api/v1/admin/users/index.get.ts b/server/api/v1/admin/users/index.get.ts index 43a90fe..2db9ad7 100644 --- a/server/api/v1/admin/users/index.get.ts +++ b/server/api/v1/admin/users/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["user:read"]); diff --git a/server/api/v1/auth/index.get.ts b/server/api/v1/auth/index.get.ts index 1582f1b..ce75ba0 100644 --- a/server/api/v1/auth/index.get.ts +++ b/server/api/v1/auth/index.get.ts @@ -1,4 +1,4 @@ -import authManager from "~/server/internal/auth"; +import authManager from "~~/server/internal/auth"; export default defineEventHandler(() => { return authManager.getEnabledAuthProviders(); diff --git a/server/api/v1/auth/signin/simple.post.ts b/server/api/v1/auth/signin/simple.post.ts index 3e4ca03..3922a2f 100644 --- a/server/api/v1/auth/signin/simple.post.ts +++ b/server/api/v1/auth/signin/simple.post.ts @@ -1,13 +1,13 @@ -import { AuthMec } from "~/prisma/client/enums"; +import { AuthMec } from "~~/prisma/client/enums"; import type { JsonArray } from "@prisma/client/runtime/library"; import { type } from "arktype"; -import prisma from "~/server/internal/db/database"; -import sessionHandler from "~/server/internal/session"; +import prisma from "~~/server/internal/db/database"; +import sessionHandler from "~~/server/internal/session"; import authManager, { checkHashArgon2, checkHashBcrypt, -} from "~/server/internal/auth"; -import { logger } from "~/server/internal/logging"; +} from "~~/server/internal/auth"; +import { logger } from "~~/server/internal/logging"; const signinValidator = type({ username: "string", @@ -23,7 +23,7 @@ export default defineEventHandler<{ if (!authManager.getAuthProviders().Simple) throw createError({ statusCode: 403, - statusMessage: t("errors.auth.method.signinDisabled"), + message: t("errors.auth.method.signinDisabled"), }); const body = signinValidator(await readBody(h3)); @@ -33,7 +33,7 @@ export default defineEventHandler<{ throw createError({ statusCode: 400, - statusMessage: body.summary, + message: body.summary, }); } @@ -57,13 +57,13 @@ export default defineEventHandler<{ if (!authMek) throw createError({ statusCode: 401, - statusMessage: t("errors.auth.invalidUserOrPass"), + message: t("errors.auth.invalidUserOrPass"), }); if (!authMek.user.enabled) throw createError({ statusCode: 403, - statusMessage: t("errors.auth.disabled"), + message: t("errors.auth.disabled"), }); // LEGACY bcrypt @@ -74,13 +74,13 @@ export default defineEventHandler<{ if (!hash) throw createError({ statusCode: 500, - statusMessage: t("errors.auth.invalidPassState"), + message: t("errors.auth.invalidPassState"), }); if (!(await checkHashBcrypt(body.password, hash))) throw createError({ statusCode: 401, - statusMessage: t("errors.auth.invalidUserOrPass"), + message: t("errors.auth.invalidUserOrPass"), }); // TODO: send user to forgot password screen or something to force them to change their password to new system @@ -93,13 +93,13 @@ export default defineEventHandler<{ if (!hash || typeof hash !== "string") throw createError({ statusCode: 500, - statusMessage: t("errors.auth.invalidPassState"), + message: t("errors.auth.invalidPassState"), }); if (!(await checkHashArgon2(body.password, hash))) throw createError({ statusCode: 401, - statusMessage: t("errors.auth.invalidUserOrPass"), + message: t("errors.auth.invalidUserOrPass"), }); await sessionHandler.signin(h3, authMek.userId, body.rememberMe); diff --git a/server/api/v1/auth/signup/simple.get.ts b/server/api/v1/auth/signup/simple.get.ts index ad6c496..c72cf72 100644 --- a/server/api/v1/auth/signup/simple.get.ts +++ b/server/api/v1/auth/signup/simple.get.ts @@ -1,6 +1,6 @@ -import prisma from "~/server/internal/db/database"; -import taskHandler from "~/server/internal/tasks"; -import authManager from "~/server/internal/auth"; +import prisma from "~~/server/internal/db/database"; +import taskHandler from "~~/server/internal/tasks"; +import authManager from "~~/server/internal/auth"; export default defineEventHandler(async (h3) => { const t = await useTranslation(h3); @@ -8,7 +8,7 @@ export default defineEventHandler(async (h3) => { if (!authManager.getAuthProviders().Simple) throw createError({ statusCode: 403, - statusMessage: t("errors.auth.method.signinDisabled"), + message: t("errors.auth.method.signinDisabled"), }); const query = getQuery(h3); @@ -16,7 +16,7 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: t("errors.auth.inviteIdRequired"), + message: t("errors.auth.inviteIdRequired"), }); taskHandler.runTaskGroupByName("cleanup:invitations"); @@ -24,7 +24,7 @@ export default defineEventHandler(async (h3) => { if (!invitation) throw createError({ statusCode: 404, - statusMessage: t("errors.auth.invalidInvite"), + message: t("errors.auth.invalidInvite"), }); return invitation; diff --git a/server/api/v1/auth/signup/simple.post.ts b/server/api/v1/auth/signup/simple.post.ts index 9f11f92..4e08d5a 100644 --- a/server/api/v1/auth/signup/simple.post.ts +++ b/server/api/v1/auth/signup/simple.post.ts @@ -1,12 +1,12 @@ -import { AuthMec } from "~/prisma/client/enums"; -import prisma from "~/server/internal/db/database"; -import authManager, { createHashArgon2 } from "~/server/internal/auth"; +import { AuthMec } from "~~/prisma/client/enums"; +import prisma from "~~/server/internal/db/database"; +import authManager, { createHashArgon2 } from "~~/server/internal/auth"; import * as jdenticon from "jdenticon"; -import objectHandler from "~/server/internal/objects"; +import objectHandler from "~~/server/internal/objects"; import { type } from "arktype"; import { randomUUID } from "node:crypto"; -import { throwingArktype } from "~/server/arktype"; -import userStatsManager from "~/server/internal/userstats"; +import { throwingArktype } from "~~/server/arktype"; +import userStatsManager from "~~/server/internal/userstats"; export const SharedRegisterValidator = type({ username: "string >= 5", @@ -27,7 +27,7 @@ export default defineEventHandler<{ if (!authManager.getAuthProviders().Simple) throw createError({ statusCode: 403, - statusMessage: t("errors.auth.method.signinDisabled"), + message: t("errors.auth.method.signinDisabled"), }); const user = await readValidatedBody(h3, CreateUserValidator); @@ -38,7 +38,7 @@ export default defineEventHandler<{ if (!invitation) throw createError({ statusCode: 401, - statusMessage: t("errors.auth.invalidInvite"), + message: t("errors.auth.invalidInvite"), }); // reuse items from invite @@ -51,7 +51,7 @@ export default defineEventHandler<{ if (existing > 0) throw createError({ statusCode: 400, - statusMessage: t("errors.auth.usernameTaken"), + message: t("errors.auth.usernameTaken"), }); const userId = randomUUID(); diff --git a/server/api/v1/client/auth/callback/index.post.ts b/server/api/v1/client/auth/callback/index.post.ts index bc63be7..f9670a8 100644 --- a/server/api/v1/client/auth/callback/index.post.ts +++ b/server/api/v1/client/auth/callback/index.post.ts @@ -1,5 +1,5 @@ -import clientHandler from "~/server/internal/clients/handler"; -import sessionHandler from "~/server/internal/session"; +import clientHandler from "~~/server/internal/clients/handler"; +import sessionHandler from "~~/server/internal/session"; export default defineEventHandler(async (h3) => { const user = await sessionHandler.getSession(h3); @@ -12,13 +12,13 @@ export default defineEventHandler(async (h3) => { if (!client) throw createError({ statusCode: 400, - statusMessage: "Invalid or expired client ID.", + message: "Invalid or expired client ID.", }); if (client.userId != user.userId) throw createError({ statusCode: 403, - statusMessage: "Not allowed to authorize this client.", + message: "Not allowed to authorize this client.", }); const token = await clientHandler.generateAuthToken(clientId); diff --git a/server/api/v1/client/auth/code/index.get.ts b/server/api/v1/client/auth/code/index.get.ts index 74bc6e8..04488e9 100644 --- a/server/api/v1/client/auth/code/index.get.ts +++ b/server/api/v1/client/auth/code/index.get.ts @@ -1,5 +1,5 @@ -import clientHandler from "~/server/internal/clients/handler"; -import sessionHandler from "~/server/internal/session"; +import clientHandler from "~~/server/internal/clients/handler"; +import sessionHandler from "~~/server/internal/session"; export default defineEventHandler(async (h3) => { const user = await sessionHandler.getSession(h3); @@ -10,12 +10,12 @@ export default defineEventHandler(async (h3) => { if (!code) throw createError({ statusCode: 400, - statusMessage: "Code required in query params.", + message: "Code required in query params.", }); const clientId = await clientHandler.fetchClientIdByCode(code); if (!clientId) - throw createError({ statusCode: 400, statusMessage: "Invalid code." }); + throw createError({ statusCode: 400, message: "Invalid code." }); return clientId; }); diff --git a/server/api/v1/client/auth/code/index.post.ts b/server/api/v1/client/auth/code/index.post.ts index 593b773..a96aea5 100644 --- a/server/api/v1/client/auth/code/index.post.ts +++ b/server/api/v1/client/auth/code/index.post.ts @@ -1,5 +1,5 @@ -import clientHandler from "~/server/internal/clients/handler"; -import sessionHandler from "~/server/internal/session"; +import clientHandler from "~~/server/internal/clients/handler"; +import sessionHandler from "~~/server/internal/session"; export default defineEventHandler(async (h3) => { const user = await sessionHandler.getSession(h3); @@ -12,19 +12,19 @@ export default defineEventHandler(async (h3) => { if (!client) throw createError({ statusCode: 400, - statusMessage: "Invalid or expired client ID.", + message: "Invalid or expired client ID.", }); if (client.userId != user.userId) throw createError({ statusCode: 403, - statusMessage: "Not allowed to authorize this client.", + message: "Not allowed to authorize this client.", }); if (!client.peer) throw createError({ statusCode: 500, - statusMessage: "No client listening for authorization.", + message: "No client listening for authorization.", }); const token = await clientHandler.generateAuthToken(clientId); diff --git a/server/api/v1/client/auth/code/ws.get.ts b/server/api/v1/client/auth/code/ws.get.ts index 637d8df..c809f0f 100644 --- a/server/api/v1/client/auth/code/ws.get.ts +++ b/server/api/v1/client/auth/code/ws.get.ts @@ -1,5 +1,5 @@ import type { FetchError } from "ofetch"; -import clientHandler from "~/server/internal/clients/handler"; +import clientHandler from "~~/server/internal/clients/handler"; export default defineWebSocketHandler({ async open(peer) { @@ -9,14 +9,14 @@ export default defineWebSocketHandler({ if (!code) throw createError({ statusCode: 400, - statusMessage: "Code required in Authorization header.", + message: "Code required in Authorization header.", }); await clientHandler.connectCodeListener(code, peer); } catch (e) { peer.send( JSON.stringify({ type: "error", - value: (e as FetchError)?.statusMessage, + value: (e as FetchError)?.message, }), ); peer.close(); diff --git a/server/api/v1/client/auth/handshake.post.ts b/server/api/v1/client/auth/handshake.post.ts index c154c8c..a2942a2 100644 --- a/server/api/v1/client/auth/handshake.post.ts +++ b/server/api/v1/client/auth/handshake.post.ts @@ -1,5 +1,5 @@ -import clientHandler from "~/server/internal/clients/handler"; -import { useCertificateAuthority } from "~/server/plugins/ca"; +import clientHandler from "~~/server/internal/clients/handler"; +import { useCertificateAuthority } from "~~/server/plugins/ca"; export default defineEventHandler(async (h3) => { const body = await readBody(h3); @@ -8,24 +8,24 @@ export default defineEventHandler(async (h3) => { if (!clientId || !token) throw createError({ statusCode: 400, - statusMessage: "Missing token or client ID from body", + message: "Missing token or client ID from body", }); const metadata = await clientHandler.fetchClient(clientId); if (!metadata) throw createError({ statusCode: 403, - statusMessage: "Invalid client ID", + message: "Invalid client ID", }); if (!metadata.authToken || !metadata.userId) throw createError({ statusCode: 400, - statusMessage: "Un-authorized client ID", + message: "Un-authorized client ID", }); if (metadata.authToken !== token) throw createError({ statusCode: 403, - statusMessage: "Invalid token", + message: "Invalid token", }); const certificateAuthority = useCertificateAuthority(); diff --git a/server/api/v1/client/auth/index.get.ts b/server/api/v1/client/auth/index.get.ts index 92cf16c..b55706c 100644 --- a/server/api/v1/client/auth/index.get.ts +++ b/server/api/v1/client/auth/index.get.ts @@ -1,5 +1,5 @@ -import clientHandler from "~/server/internal/clients/handler"; -import sessionHandler from "~/server/internal/session"; +import clientHandler from "~~/server/internal/clients/handler"; +import sessionHandler from "~~/server/internal/session"; export default defineEventHandler(async (h3) => { const user = await sessionHandler.getSession(h3); @@ -10,20 +10,20 @@ export default defineEventHandler(async (h3) => { if (!providedClientId) throw createError({ statusCode: 400, - statusMessage: "Provide client ID in request params as 'id'", + message: "Provide client ID in request params as 'id'", }); const client = await clientHandler.fetchClient(providedClientId); if (!client) throw createError({ statusCode: 404, - statusMessage: "Request not found.", + message: "Request not found.", }); if (client.userId && user.userId !== client.userId) throw createError({ statusCode: 400, - statusMessage: "Client already claimed.", + message: "Client already claimed.", }); await clientHandler.attachUserId(providedClientId, user.userId); diff --git a/server/api/v1/client/auth/initiate.post.ts b/server/api/v1/client/auth/initiate.post.ts index 64186b5..f0fc7f5 100644 --- a/server/api/v1/client/auth/initiate.post.ts +++ b/server/api/v1/client/auth/initiate.post.ts @@ -1,20 +1,20 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; +import type { ClientCapabilities } from "~~/prisma/client/enums"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; import type { CapabilityConfiguration, - InternalClientCapability, -} from "~/server/internal/clients/capabilities"; +} from "~~/server/internal/clients/capabilities"; import capabilityManager, { validCapabilities, -} from "~/server/internal/clients/capabilities"; -import clientHandler, { AuthMode } from "~/server/internal/clients/handler"; -import { parsePlatform } from "~/server/internal/utils/parseplatform"; +} from "~~/server/internal/clients/capabilities"; +import clientHandler, { AuthModes } from "~~/server/internal/clients/handler"; +import { parsePlatform } from "~~/server/internal/utils/parseplatform"; const ClientAuthInitiate = type({ name: "string", platform: "string", capabilities: "object", - mode: type.valueOf(AuthMode).default(AuthMode.Callback), + mode: type.enumerated(...AuthModes).default("callback"), }).configure(throwingArktype); export default defineEventHandler(async (h3) => { @@ -28,11 +28,11 @@ export default defineEventHandler(async (h3) => { if (!platform) throw createError({ statusCode: 400, - statusMessage: "Invalid or unsupported platform", + message: "Invalid or unsupported platform", }); const capabilityIterable = Object.entries(capabilities) as Array< - [InternalClientCapability, object] + [ClientCapabilities, object] >; if ( capabilityIterable.length > 0 && @@ -42,7 +42,7 @@ export default defineEventHandler(async (h3) => { ) throw createError({ statusCode: 400, - statusMessage: "Invalid capabilities.", + message: "Invalid capabilities.", }); if ( @@ -57,7 +57,7 @@ export default defineEventHandler(async (h3) => { ) throw createError({ statusCode: 400, - statusMessage: "Invalid capability configuration.", + message: "Invalid capability configuration.", }); const result = await clientHandler.initiate({ diff --git a/server/api/v1/client/capability/index.post.ts b/server/api/v1/client/capability/index.post.ts index a33f690..d55d680 100644 --- a/server/api/v1/client/capability/index.post.ts +++ b/server/api/v1/client/capability/index.post.ts @@ -1,49 +1,32 @@ -import type { InternalClientCapability } from "~/server/internal/clients/capabilities"; -import capabilityManager, { - validCapabilities, -} from "~/server/internal/clients/capabilities"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import notificationSystem from "~/server/internal/notifications"; +import { type } from "arktype"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import capabilityManager from "~~/server/internal/clients/capabilities"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import notificationSystem from "~~/server/internal/notifications"; + +const SetCapability = type({ + capability: type.enumerated(...Object.values(ClientCapabilities)), + configuration: "object" +}).configure(throwingArktype); export default defineClientEventHandler( async (h3, { clientId, fetchClient, fetchUser }) => { - const body = await readBody(h3); - const rawCapability = body.capability; - const configuration = body.configuration; - - if (!rawCapability || typeof rawCapability !== "string") - throw createError({ - statusCode: 400, - statusMessage: "capability must be a string", - }); - - if (!configuration || typeof configuration !== "object") - throw createError({ - statusCode: 400, - statusMessage: "configuration must be an object", - }); - - const capability = rawCapability as InternalClientCapability; - - if (!validCapabilities.includes(capability)) - throw createError({ - statusCode: 400, - statusMessage: "Invalid capability.", - }); + const body = await readDropValidatedBody(h3, SetCapability); const isValid = await capabilityManager.validateCapabilityConfiguration( - capability, - configuration, + body.capability, + body.configuration, ); if (!isValid) throw createError({ statusCode: 400, - statusMessage: "Invalid capability configuration.", + message: "Invalid capability configuration.", }); await capabilityManager.upsertClientCapability( - capability, - configuration, + body.capability, + body.configuration, clientId, ); @@ -51,9 +34,9 @@ export default defineClientEventHandler( const user = await fetchUser(); await notificationSystem.push(user.id, { - nonce: `capability-${clientId}-${capability}`, - title: `"${client.name}" can now access ${capability}`, - description: `A device called "${client.name}" now has access to your ${capability}.`, + nonce: `capability-${clientId}-${body.capability}`, + title: `"${client.name}" can now access ${body.capability}`, + description: `A device called "${client.name}" now has access to your ${body.capability}.`, actions: ["Review|/account/devices"], acls: ["user:clients:read"], }); diff --git a/server/api/v1/client/chunk.get.ts b/server/api/v1/client/chunk.get.ts index 030b796..6f24a3b 100644 --- a/server/api/v1/client/chunk.get.ts +++ b/server/api/v1/client/chunk.get.ts @@ -1,7 +1,7 @@ -import cacheHandler from "~/server/internal/cache"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; +import cacheHandler from "~~/server/internal/cache"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; const chunkSize = 1024 * 1024 * 64; @@ -20,7 +20,7 @@ export default defineClientEventHandler(async (h3) => { if (!gameId || !versionName || !filename || Number.isNaN(chunkIndex)) throw createError({ statusCode: 400, - statusMessage: "Invalid chunk arguments", + message: "Invalid chunk arguments", }); let game = await gameLookupCache.getItem(gameId); @@ -35,7 +35,7 @@ export default defineClientEventHandler(async (h3) => { }, }); if (!game || !game.libraryId) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); await gameLookupCache.setItem(gameId, game); } @@ -43,7 +43,7 @@ export default defineClientEventHandler(async (h3) => { if (!game.libraryId) throw createError({ statusCode: 500, - statusMessage: "Somehow, we got here.", + message: "Somehow, we got here.", }); const peek = await libraryManager.peekFile( @@ -53,7 +53,7 @@ export default defineClientEventHandler(async (h3) => { filename, ); if (!peek) - throw createError({ status: 400, statusMessage: "Failed to peek file" }); + throw createError({ status: 400, message: "Failed to peek file" }); const start = chunkIndex * chunkSize; const end = Math.min((chunkIndex + 1) * chunkSize, peek.size); @@ -63,7 +63,7 @@ export default defineClientEventHandler(async (h3) => { if (start >= end) throw createError({ statusCode: 400, - statusMessage: "Invalid chunk index", + message: "Invalid chunk index", }); const gameReadStream = await libraryManager.readFile( @@ -76,7 +76,7 @@ export default defineClientEventHandler(async (h3) => { if (!gameReadStream) throw createError({ statusCode: 400, - statusMessage: "Failed to create stream", + message: "Failed to create stream", }); return sendStream(h3, gameReadStream); diff --git a/server/api/v1/client/collection/[id]/entry.delete.ts b/server/api/v1/client/collection/[id]/entry.delete.ts index 204e133..039ef09 100644 --- a/server/api/v1/client/collection/[id]/entry.delete.ts +++ b/server/api/v1/client/collection/[id]/entry.delete.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -8,13 +8,13 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); const successful = await userLibraryManager.collectionRemove( gameId, @@ -24,7 +24,7 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!successful) throw createError({ statusCode: 404, - statusMessage: "Collection not found", + message: "Collection not found", }); return {}; }); diff --git a/server/api/v1/client/collection/[id]/entry.post.ts b/server/api/v1/client/collection/[id]/entry.post.ts index 357e236..ea7ddb9 100644 --- a/server/api/v1/client/collection/[id]/entry.post.ts +++ b/server/api/v1/client/collection/[id]/entry.post.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -8,13 +8,13 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); return await userLibraryManager.collectionAdd(gameId, id, user.id); }); diff --git a/server/api/v1/client/collection/[id]/index.delete.ts b/server/api/v1/client/collection/[id]/index.delete.ts index ffe6b71..2640177 100644 --- a/server/api/v1/client/collection/[id]/index.delete.ts +++ b/server/api/v1/client/collection/[id]/index.delete.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -8,7 +8,7 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); // Verify collection exists and user owns it @@ -17,13 +17,13 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!collection) throw createError({ statusCode: 404, - statusMessage: "Collection not found", + message: "Collection not found", }); if (collection.userId !== user.id) throw createError({ statusCode: 403, - statusMessage: "Not authorized to delete this collection", + message: "Not authorized to delete this collection", }); await userLibraryManager.deleteCollection(id); diff --git a/server/api/v1/client/collection/[id]/index.get.ts b/server/api/v1/client/collection/[id]/index.get.ts index 9267f69..3b7afb6 100644 --- a/server/api/v1/client/collection/[id]/index.get.ts +++ b/server/api/v1/client/collection/[id]/index.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -8,7 +8,7 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); // Fetch specific collection @@ -17,14 +17,14 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { if (!collection) throw createError({ statusCode: 404, - statusMessage: "Collection not found", + message: "Collection not found", }); // Verify user owns this collection if (collection.userId !== user.id) throw createError({ statusCode: 403, - statusMessage: "Not authorized to access this collection", + message: "Not authorized to access this collection", }); return collection; diff --git a/server/api/v1/client/collection/default/entry.delete.ts b/server/api/v1/client/collection/default/entry.delete.ts index 774c1bd..8ddab1e 100644 --- a/server/api/v1/client/collection/default/entry.delete.ts +++ b/server/api/v1/client/collection/default/entry.delete.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -8,7 +8,7 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); await userLibraryManager.libraryRemove(gameId, user.id); return {}; diff --git a/server/api/v1/client/collection/default/entry.post.ts b/server/api/v1/client/collection/default/entry.post.ts index 5e7f603..71cd5f0 100644 --- a/server/api/v1/client/collection/default/entry.post.ts +++ b/server/api/v1/client/collection/default/entry.post.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -7,7 +7,7 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); // Add the game to the default collection await userLibraryManager.libraryAdd(gameId, user.id); diff --git a/server/api/v1/client/collection/default/index.get.ts b/server/api/v1/client/collection/default/index.get.ts index fdb5da6..3a9f687 100644 --- a/server/api/v1/client/collection/default/index.get.ts +++ b/server/api/v1/client/collection/default/index.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); diff --git a/server/api/v1/client/collection/index.get.ts b/server/api/v1/client/collection/index.get.ts index 9b07931..9e819cf 100644 --- a/server/api/v1/client/collection/index.get.ts +++ b/server/api/v1/client/collection/index.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); diff --git a/server/api/v1/client/collection/index.post.ts b/server/api/v1/client/collection/index.post.ts index c08d355..506bea3 100644 --- a/server/api/v1/client/collection/index.post.ts +++ b/server/api/v1/client/collection/index.post.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); @@ -8,7 +8,7 @@ export default defineClientEventHandler(async (h3, { fetchUser }) => { const name = body.name; if (!name) - throw createError({ statusCode: 400, statusMessage: "Requires name" }); + throw createError({ statusCode: 400, message: "Requires name" }); // Create the collection using the manager const newCollection = await userLibraryManager.collectionCreate( diff --git a/server/api/v1/client/game/[id]/index.get.ts b/server/api/v1/client/game/[id]/index.get.ts index 13e06fb..01f8209 100644 --- a/server/api/v1/client/game/[id]/index.get.ts +++ b/server/api/v1/client/game/[id]/index.get.ts @@ -1,10 +1,10 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler(async (h3) => { const id = getRouterParam(h3, "id"); if (!id) - throw createError({ statusCode: 400, statusMessage: "No ID in route" }); + throw createError({ statusCode: 400, message: "No ID in route" }); const game = await prisma.game.findUnique({ where: { @@ -12,7 +12,7 @@ export default defineClientEventHandler(async (h3) => { }, }); if (!game) - throw createError({ statusCode: 404, statusMessage: "Game not found" }); + throw createError({ statusCode: 404, message: "Game not found" }); return game; }); diff --git a/server/api/v1/client/game/manifest.get.ts b/server/api/v1/client/game/manifest.get.ts index 80535e5..7c24e51 100644 --- a/server/api/v1/client/game/manifest.get.ts +++ b/server/api/v1/client/game/manifest.get.ts @@ -1,21 +1,20 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import manifestGenerator from "~/server/internal/downloads/manifest"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import manifestGenerator from "~~/server/internal/downloads/manifest"; export default defineClientEventHandler(async (h3) => { const query = getQuery(h3); const id = query.id?.toString(); - const version = query.version?.toString(); - if (!id || !version) + if (!id) throw createError({ statusCode: 400, - statusMessage: "Missing id or version in query", + message: "Missing version id in query", }); - const manifest = await manifestGenerator.generateManifest(id, version); + const manifest = await manifestGenerator.generateManifest(id); if (!manifest) throw createError({ statusCode: 400, - statusMessage: "Invalid game or version, or no versions added.", + message: "Invalid game or version, or no versions added.", }); return manifest; }); diff --git a/server/api/v1/client/game/version.get.ts b/server/api/v1/client/game/version.get.ts index 2ed7422..bec9c46 100644 --- a/server/api/v1/client/game/version.get.ts +++ b/server/api/v1/client/game/version.get.ts @@ -1,6 +1,6 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; +import libraryManager from "~~/server/internal/library"; export default defineClientEventHandler(async (h3) => { const query = getQuery(h3); @@ -9,22 +9,19 @@ export default defineClientEventHandler(async (h3) => { if (!id || !version) throw createError({ statusCode: 400, - statusMessage: "Missing id or version in query", + message: "Missing id or version in query", }); const gameVersion = await prisma.gameVersion.findUnique({ where: { - gameId_versionName: { - gameId: id, - versionName: version, - }, + versionId: id, }, }); if (!gameVersion) throw createError({ statusCode: 404, - statusMessage: "Game version not found", + message: "Game version not found", }); return { diff --git a/server/api/v1/client/game/versions.get.ts b/server/api/v1/client/game/versions.get.ts index fab014a..a6bec18 100644 --- a/server/api/v1/client/game/versions.get.ts +++ b/server/api/v1/client/game/versions.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler(async (h3) => { const query = getQuery(h3); @@ -7,31 +7,21 @@ export default defineClientEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "No ID in request query", + message: "No ID in request query", }); - const versions = await prisma.gameVersion.findMany({ + const versions = await prisma.version.findMany({ where: { gameId: id, + hidden: false, }, orderBy: { versionIndex: "desc", // Latest one first }, + include: { + gameVersions: true, + }, }); - const mappedVersions = versions - .map((version) => { - if (!version.dropletManifest) return undefined; - - const newVersion = { ...version, dropletManifest: undefined }; - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore idk why we delete an undefined object - delete newVersion.dropletManifest; - return { - ...newVersion, - }; - }) - .filter((e) => e); - - return mappedVersions; + return versions; }); diff --git a/server/api/v1/client/news/[id]/index.get.ts b/server/api/v1/client/news/[id]/index.get.ts index c7019c9..82814e3 100644 --- a/server/api/v1/client/news/[id]/index.get.ts +++ b/server/api/v1/client/news/[id]/index.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import newsManager from "~/server/internal/news"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import newsManager from "~~/server/internal/news"; export default defineClientEventHandler(async (h3) => { const id = h3.context.params?.id; diff --git a/server/api/v1/client/news/index.get.ts b/server/api/v1/client/news/index.get.ts index 8ab6e13..ef15a22 100644 --- a/server/api/v1/client/news/index.get.ts +++ b/server/api/v1/client/news/index.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import newsManager from "~/server/internal/news"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import newsManager from "~~/server/internal/news"; export default defineClientEventHandler(async (h3) => { const query = getQuery(h3); @@ -7,13 +7,13 @@ export default defineClientEventHandler(async (h3) => { const orderBy = query.order as "asc" | "desc"; if (orderBy) { if (typeof orderBy !== "string" || !["asc", "desc"].includes(orderBy)) - throw createError({ statusCode: 400, statusMessage: "Invalid order" }); + throw createError({ statusCode: 400, message: "Invalid order" }); } const tags = query.tags as string[] | undefined; if (tags) { if (typeof tags !== "object" || !Array.isArray(tags)) - throw createError({ statusCode: 400, statusMessage: "Invalid tags" }); + throw createError({ statusCode: 400, message: "Invalid tags" }); } const options = { diff --git a/server/api/v1/client/object/[id]/index.get.ts b/server/api/v1/client/object/[id]/index.get.ts index 962d30d..25cdb3d 100644 --- a/server/api/v1/client/object/[id]/index.get.ts +++ b/server/api/v1/client/object/[id]/index.get.ts @@ -1,15 +1,15 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import objectHandler from "~/server/internal/objects"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import objectHandler from "~~/server/internal/objects"; export default defineClientEventHandler(async (h3, utils) => { const id = getRouterParam(h3, "id"); - if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" }); + if (!id) throw createError({ statusCode: 400, message: "Invalid ID" }); const user = await utils.fetchUser(); const object = await objectHandler.fetchWithPermissions(id, user.id); if (!object) - throw createError({ statusCode: 404, statusMessage: "Object not found" }); + throw createError({ statusCode: 404, message: "Object not found" }); setHeader(h3, "Content-Type", object.mime); return object.data; diff --git a/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts b/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts index 0f36008..a502686 100644 --- a/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts +++ b/server/api/v1/client/saves/[gameid]/[slotindex]/index.delete.ts @@ -1,6 +1,6 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler( async (h3, { fetchClient, fetchUser }) => { @@ -8,27 +8,27 @@ export default defineClientEventHandler( if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const user = await fetchUser(); const gameId = getRouterParam(h3, "gameid"); if (!gameId) throw createError({ statusCode: 400, - statusMessage: "No gameID in route params", + message: "No gameID in route params", }); const slotIndexString = getRouterParam(h3, "slotindex"); if (!slotIndexString) throw createError({ statusCode: 400, - statusMessage: "No slotIndex in route params", + message: "No slotIndex in route params", }); const slotIndex = parseInt(slotIndexString); if (Number.isNaN(slotIndex)) throw createError({ statusCode: 400, - statusMessage: "Invalid slotIndex", + message: "Invalid slotIndex", }); const game = await prisma.game.findUnique({ @@ -36,7 +36,7 @@ export default defineClientEventHandler( select: { id: true }, }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); const save = await prisma.saveSlot.delete({ where: { @@ -48,6 +48,6 @@ export default defineClientEventHandler( }, }); if (!save) - throw createError({ statusCode: 404, statusMessage: "Save not found" }); + throw createError({ statusCode: 404, message: "Save not found" }); }, ); diff --git a/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts b/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts index 1ea38ae..5c931e4 100644 --- a/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts +++ b/server/api/v1/client/saves/[gameid]/[slotindex]/index.get.ts @@ -1,6 +1,6 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler( async (h3, { fetchClient, fetchUser }) => { @@ -8,27 +8,27 @@ export default defineClientEventHandler( if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const user = await fetchUser(); const gameId = getRouterParam(h3, "gameid"); if (!gameId) throw createError({ statusCode: 400, - statusMessage: "No gameID in route params", + message: "No gameID in route params", }); const slotIndexString = getRouterParam(h3, "slotindex"); if (!slotIndexString) throw createError({ statusCode: 400, - statusMessage: "No slotIndex in route params", + message: "No slotIndex in route params", }); const slotIndex = parseInt(slotIndexString); if (Number.isNaN(slotIndex)) throw createError({ statusCode: 400, - statusMessage: "Invalid slotIndex", + message: "Invalid slotIndex", }); const game = await prisma.game.findUnique({ @@ -36,7 +36,7 @@ export default defineClientEventHandler( select: { id: true }, }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); const save = await prisma.saveSlot.findUnique({ where: { @@ -48,7 +48,7 @@ export default defineClientEventHandler( }, }); if (!save) - throw createError({ statusCode: 404, statusMessage: "Save not found" }); + throw createError({ statusCode: 404, message: "Save not found" }); return save; }, diff --git a/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts b/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts index 8034b81..6ead8cf 100644 --- a/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts +++ b/server/api/v1/client/saves/[gameid]/[slotindex]/push.post.ts @@ -1,7 +1,7 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; -import saveManager from "~/server/internal/saves"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; +import saveManager from "~~/server/internal/saves"; export default defineClientEventHandler( async (h3, { fetchClient, fetchUser }) => { @@ -9,27 +9,27 @@ export default defineClientEventHandler( if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const user = await fetchUser(); const gameId = getRouterParam(h3, "gameid"); if (!gameId) throw createError({ statusCode: 400, - statusMessage: "No gameID in route params", + message: "No gameID in route params", }); const slotIndexString = getRouterParam(h3, "slotindex"); if (!slotIndexString) throw createError({ statusCode: 400, - statusMessage: "No slotIndex in route params", + message: "No slotIndex in route params", }); const slotIndex = parseInt(slotIndexString); if (Number.isNaN(slotIndex)) throw createError({ statusCode: 400, - statusMessage: "Invalid slotIndex", + message: "Invalid slotIndex", }); const game = await prisma.game.findUnique({ @@ -37,7 +37,7 @@ export default defineClientEventHandler( select: { id: true }, }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); await saveManager.pushSave( gameId, diff --git a/server/api/v1/client/saves/[gameid]/index.get.ts b/server/api/v1/client/saves/[gameid]/index.get.ts index 53ce8a5..dc66991 100644 --- a/server/api/v1/client/saves/[gameid]/index.get.ts +++ b/server/api/v1/client/saves/[gameid]/index.get.ts @@ -1,6 +1,6 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler( async (h3, { fetchClient, fetchUser }) => { @@ -8,14 +8,14 @@ export default defineClientEventHandler( if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const user = await fetchUser(); const gameId = getRouterParam(h3, "gameid"); if (!gameId) throw createError({ statusCode: 400, - statusMessage: "No gameID in route params", + message: "No gameID in route params", }); const game = await prisma.game.findUnique({ @@ -23,7 +23,7 @@ export default defineClientEventHandler( select: { id: true }, }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); const saves = await prisma.saveSlot.findMany({ where: { diff --git a/server/api/v1/client/saves/[gameid]/index.post.ts b/server/api/v1/client/saves/[gameid]/index.post.ts index 91193ce..6070803 100644 --- a/server/api/v1/client/saves/[gameid]/index.post.ts +++ b/server/api/v1/client/saves/[gameid]/index.post.ts @@ -1,7 +1,7 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import { applicationSettings } from "~/server/internal/config/application-configuration"; -import prisma from "~/server/internal/db/database"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import { applicationSettings } from "~~/server/internal/config/application-configuration"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler( async (h3, { fetchClient, fetchUser }) => { @@ -9,14 +9,14 @@ export default defineClientEventHandler( if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const user = await fetchUser(); const gameId = getRouterParam(h3, "gameid"); if (!gameId) throw createError({ statusCode: 400, - statusMessage: "No gameID in route params", + message: "No gameID in route params", }); const game = await prisma.game.findUnique({ @@ -24,7 +24,7 @@ export default defineClientEventHandler( select: { id: true }, }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); const saves = await prisma.saveSlot.findMany({ where: { @@ -40,7 +40,7 @@ export default defineClientEventHandler( if (saves.length + 1 > limit) throw createError({ statusCode: 400, - statusMessage: "Out of save slots", + message: "Out of save slots", }); let firstIndex = 0; diff --git a/server/api/v1/client/saves/index.get.ts b/server/api/v1/client/saves/index.get.ts index 506151e..c27e53e 100644 --- a/server/api/v1/client/saves/index.get.ts +++ b/server/api/v1/client/saves/index.get.ts @@ -1,6 +1,6 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler( async (h3, { fetchClient, fetchUser }) => { @@ -8,7 +8,7 @@ export default defineClientEventHandler( if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const user = await fetchUser(); diff --git a/server/api/v1/client/saves/settings.get.ts b/server/api/v1/client/saves/settings.get.ts index 05c3026..ac3b36f 100644 --- a/server/api/v1/client/saves/settings.get.ts +++ b/server/api/v1/client/saves/settings.get.ts @@ -1,13 +1,13 @@ -import { ClientCapabilities } from "~/prisma/client/enums"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import { applicationSettings } from "~/server/internal/config/application-configuration"; +import { ClientCapabilities } from "~~/prisma/client/enums"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import { applicationSettings } from "~~/server/internal/config/application-configuration"; export default defineClientEventHandler(async (_h3, { fetchClient }) => { const client = await fetchClient(); if (!client.capabilities.includes(ClientCapabilities.CloudSaves)) throw createError({ statusCode: 403, - statusMessage: "Capability not allowed.", + message: "Capability not allowed.", }); const slotLimit = await applicationSettings.get("saveSlotCountLimit"); diff --git a/server/api/v1/client/user/index.get.ts b/server/api/v1/client/user/index.get.ts index 79ba08c..d17d6a8 100644 --- a/server/api/v1/client/user/index.get.ts +++ b/server/api/v1/client/user/index.get.ts @@ -1,4 +1,4 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; export default defineClientEventHandler(async (h3, { fetchUser }) => { const user = await fetchUser(); diff --git a/server/api/v1/client/user/library.get.ts b/server/api/v1/client/user/library.get.ts index 4870e2c..ee53840 100644 --- a/server/api/v1/client/user/library.get.ts +++ b/server/api/v1/client/user/library.get.ts @@ -1,5 +1,5 @@ -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import userLibraryManager from "~/server/internal/userlibrary"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineClientEventHandler(async (_h3, { fetchUser }) => { const user = await fetchUser(); diff --git a/server/api/v1/client/user/webtoken.post.ts b/server/api/v1/client/user/webtoken.post.ts index eda744f..27fc46d 100644 --- a/server/api/v1/client/user/webtoken.post.ts +++ b/server/api/v1/client/user/webtoken.post.ts @@ -1,8 +1,8 @@ -import { APITokenMode } from "~/prisma/client/enums"; +import { APITokenMode } from "~~/prisma/client/enums"; import { DateTime } from "luxon"; -import type { UserACL } from "~/server/internal/acls"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import prisma from "~/server/internal/db/database"; +import type { UserACL } from "~~/server/internal/acls"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import prisma from "~~/server/internal/db/database"; export default defineClientEventHandler( async (h3, { fetchUser, fetchClient, clientId }) => { diff --git a/server/api/v1/collection/[id]/entry.delete.ts b/server/api/v1/collection/[id]/entry.delete.ts index d0a4faf..feb547d 100644 --- a/server/api/v1/collection/[id]/entry.delete.ts +++ b/server/api/v1/collection/[id]/entry.delete.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:remove"]); @@ -12,13 +12,13 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); const successful = await userLibraryManager.collectionRemove( gameId, @@ -28,7 +28,7 @@ export default defineEventHandler(async (h3) => { if (!successful) throw createError({ statusCode: 404, - statusMessage: "Collection not found", + message: "Collection not found", }); return {}; }); diff --git a/server/api/v1/collection/[id]/entry.post.ts b/server/api/v1/collection/[id]/entry.post.ts index d6a2394..56bfea5 100644 --- a/server/api/v1/collection/[id]/entry.post.ts +++ b/server/api/v1/collection/[id]/entry.post.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:add"]); @@ -12,13 +12,13 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); return await userLibraryManager.collectionAdd(gameId, id, userId); }); diff --git a/server/api/v1/collection/[id]/index.delete.ts b/server/api/v1/collection/[id]/index.delete.ts index e00b3d6..9459c0b 100644 --- a/server/api/v1/collection/[id]/index.delete.ts +++ b/server/api/v1/collection/[id]/index.delete.ts @@ -1,19 +1,19 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:delete"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const id = getRouterParam(h3, "id"); if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); // Verify collection exists and user owns it @@ -22,13 +22,13 @@ export default defineEventHandler(async (h3) => { if (!collection) throw createError({ statusCode: 404, - statusMessage: "Collection not found", + message: "Collection not found", }); if (collection.userId !== userId) throw createError({ statusCode: 403, - statusMessage: "Not authorized to delete this collection", + message: "Not authorized to delete this collection", }); await userLibraryManager.deleteCollection(id); diff --git a/server/api/v1/collection/[id]/index.get.ts b/server/api/v1/collection/[id]/index.get.ts index 9bb1854..a71194d 100644 --- a/server/api/v1/collection/[id]/index.get.ts +++ b/server/api/v1/collection/[id]/index.get.ts @@ -1,19 +1,19 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:read"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const id = getRouterParam(h3, "id"); if (!id) throw createError({ statusCode: 400, - statusMessage: "ID required in route params", + message: "ID required in route params", }); // Fetch specific collection @@ -22,14 +22,14 @@ export default defineEventHandler(async (h3) => { if (!collection) throw createError({ statusCode: 404, - statusMessage: "Collection not found", + message: "Collection not found", }); // Verify user owns this collection if (collection.userId !== userId) throw createError({ statusCode: 403, - statusMessage: "Not authorized to access this collection", + message: "Not authorized to access this collection", }); return collection; diff --git a/server/api/v1/collection/default/entry.delete.ts b/server/api/v1/collection/default/entry.delete.ts index 77f3c39..b7bd492 100644 --- a/server/api/v1/collection/default/entry.delete.ts +++ b/server/api/v1/collection/default/entry.delete.ts @@ -1,19 +1,19 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["library:remove"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); await userLibraryManager.libraryRemove(gameId, userId); return {}; diff --git a/server/api/v1/collection/default/entry.post.ts b/server/api/v1/collection/default/entry.post.ts index 4c8b8fd..dafcfd8 100644 --- a/server/api/v1/collection/default/entry.post.ts +++ b/server/api/v1/collection/default/entry.post.ts @@ -1,18 +1,18 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["library:add"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const body = await readBody(h3); const gameId = body.id; if (!gameId) - throw createError({ statusCode: 400, statusMessage: "Game ID required" }); + throw createError({ statusCode: 400, message: "Game ID required" }); // Add the game to the default collection await userLibraryManager.libraryAdd(gameId, userId); diff --git a/server/api/v1/collection/default/index.get.ts b/server/api/v1/collection/default/index.get.ts index 22a357d..f4510a8 100644 --- a/server/api/v1/collection/default/index.get.ts +++ b/server/api/v1/collection/default/index.get.ts @@ -1,12 +1,12 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:read"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const collection = await userLibraryManager.fetchLibrary(userId); diff --git a/server/api/v1/collection/index.get.ts b/server/api/v1/collection/index.get.ts index 2fbe41b..656587a 100644 --- a/server/api/v1/collection/index.get.ts +++ b/server/api/v1/collection/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:read"]); diff --git a/server/api/v1/collection/index.post.ts b/server/api/v1/collection/index.post.ts index 1d3daad..f4eb698 100644 --- a/server/api/v1/collection/index.post.ts +++ b/server/api/v1/collection/index.post.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import userLibraryManager from "~/server/internal/userlibrary"; +import aclManager from "~~/server/internal/acls"; +import userLibraryManager from "~~/server/internal/userlibrary"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["collections:read"]); @@ -12,7 +12,7 @@ export default defineEventHandler(async (h3) => { const name = body.name; if (!name) - throw createError({ statusCode: 400, statusMessage: "Requires name" }); + throw createError({ statusCode: 400, message: "Requires name" }); // Create the collection using the manager const newCollection = await userLibraryManager.collectionCreate(name, userId); diff --git a/server/api/v1/companies/[id]/index.get.ts b/server/api/v1/companies/[id]/index.get.ts index a326371..481af52 100644 --- a/server/api/v1/companies/[id]/index.get.ts +++ b/server/api/v1/companies/[id]/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["store:read"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!companyId) throw createError({ statusCode: 400, - statusMessage: "Missing gameId in route params (somehow...?)", + message: "Missing gameId in route params (somehow...?)", }); const company = await prisma.company.findUnique({ @@ -17,7 +17,7 @@ export default defineEventHandler(async (h3) => { }); if (!company) - throw createError({ statusCode: 404, statusMessage: "Company not found" }); + throw createError({ statusCode: 404, message: "Company not found" }); return { company }; }); diff --git a/server/api/v1/games/[id]/index.get.ts b/server/api/v1/games/[id]/index.get.ts index ec0b3f4..edbae8d 100644 --- a/server/api/v1/games/[id]/index.get.ts +++ b/server/api/v1/games/[id]/index.get.ts @@ -1,6 +1,7 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import libraryManager from "~/server/internal/library"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import { convertIDsToPlatforms } from "~~/server/internal/platform/link"; +import libraryManager from "~~/server/internal/library"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["store:read"]); @@ -10,13 +11,21 @@ export default defineEventHandler(async (h3) => { if (!gameId) throw createError({ statusCode: 400, - statusMessage: "Missing gameId in route params (somehow...?)", + message: "Missing gameId in route params (somehow...?)", }); const game = await prisma.game.findUnique({ where: { id: gameId }, include: { - versions: true, + versions: { + include: { + gameVersions: { + include: { + platform: true, + }, + }, + }, + }, publishers: { select: { id: true, @@ -37,8 +46,7 @@ export default defineEventHandler(async (h3) => { }, }); - if (!game) - throw createError({ statusCode: 404, statusMessage: "Game not found" }); + if (!game) throw createError({ statusCode: 404, message: "Game not found" }); const rating = await prisma.gameRating.aggregate({ where: { @@ -52,7 +60,20 @@ export default defineEventHandler(async (h3) => { }, }); + const platformIDs = game.versions + .map((e) => e.gameVersions) + .flat() + .map((e) => e.platform) + .flat() + .map((e) => e.id) + .filter((e) => e !== null) + .filter((v, index, arr) => arr.findIndex((k) => k == v) == index); + + const platforms = await convertIDsToPlatforms(platformIDs); + + const noVersionsGame = { ...game, versions: undefined }; + const size = await libraryManager.getGameVersionSize(game.id); - return { game, rating, size }; + return { game: noVersionsGame, rating, platforms, size }; }); diff --git a/server/api/v1/index.get.ts b/server/api/v1/index.get.ts index 4d25388..8dde401 100644 --- a/server/api/v1/index.get.ts +++ b/server/api/v1/index.get.ts @@ -1,4 +1,4 @@ -import { systemConfig } from "~/server/internal/config/sys-conf"; +import { systemConfig } from "~~/server/internal/config/sys-conf"; export default defineEventHandler((_h3) => { return { diff --git a/server/api/v1/news/[id]/index.get.ts b/server/api/v1/news/[id]/index.get.ts index 2499779..7c4829a 100644 --- a/server/api/v1/news/[id]/index.get.ts +++ b/server/api/v1/news/[id]/index.get.ts @@ -1,13 +1,13 @@ import { defineEventHandler, createError } from "h3"; -import aclManager from "~/server/internal/acls"; -import newsManager from "~/server/internal/news"; +import aclManager from "~~/server/internal/acls"; +import newsManager from "~~/server/internal/news"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["news:read"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const id = h3.context.params?.id; diff --git a/server/api/v1/news/index.get.ts b/server/api/v1/news/index.get.ts index e5b6aac..9cc0eaa 100644 --- a/server/api/v1/news/index.get.ts +++ b/server/api/v1/news/index.get.ts @@ -1,13 +1,13 @@ import { defineEventHandler, getQuery } from "h3"; -import aclManager from "~/server/internal/acls"; -import newsManager from "~/server/internal/news"; +import aclManager from "~~/server/internal/acls"; +import newsManager from "~~/server/internal/news"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["news:read"]); if (!userId) throw createError({ statusCode: 403, - statusMessage: "Requires authentication", + message: "Requires authentication", }); const query = getQuery(h3); @@ -15,13 +15,13 @@ export default defineEventHandler(async (h3) => { const orderBy = query.order as "asc" | "desc"; if (orderBy) { if (typeof orderBy !== "string" || !["asc", "desc"].includes(orderBy)) - throw createError({ statusCode: 400, statusMessage: "Invalid order" }); + throw createError({ statusCode: 400, message: "Invalid order" }); } const tags = query.tags as string[] | undefined; if (tags) { if (typeof tags !== "object" || !Array.isArray(tags)) - throw createError({ statusCode: 400, statusMessage: "Invalid tags" }); + throw createError({ statusCode: 400, message: "Invalid tags" }); } const options = { diff --git a/server/api/v1/notifications/[id]/index.delete.ts b/server/api/v1/notifications/[id]/index.delete.ts index ac60839..ee14c4e 100644 --- a/server/api/v1/notifications/[id]/index.delete.ts +++ b/server/api/v1/notifications/[id]/index.delete.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["notifications:delete"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!notificationId) throw createError({ statusCode: 400, - statusMessage: "Missing notification ID", + message: "Missing notification ID", }); const userIds = [userId]; @@ -30,7 +30,7 @@ export default defineEventHandler(async (h3) => { if (!notification) throw createError({ statusCode: 400, - statusMessage: "Invalid notification ID", + message: "Invalid notification ID", }); return {}; diff --git a/server/api/v1/notifications/[id]/index.get.ts b/server/api/v1/notifications/[id]/index.get.ts index ba2c6fa..a069ae9 100644 --- a/server/api/v1/notifications/[id]/index.get.ts +++ b/server/api/v1/notifications/[id]/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["notifications:read"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!notificationId) throw createError({ statusCode: 400, - statusMessage: "Missing notification ID", + message: "Missing notification ID", }); const userIds = [userId]; @@ -30,7 +30,7 @@ export default defineEventHandler(async (h3) => { if (!notification) throw createError({ statusCode: 400, - statusMessage: "Invalid notification ID", + message: "Invalid notification ID", }); return notification; diff --git a/server/api/v1/notifications/[id]/read.post.ts b/server/api/v1/notifications/[id]/read.post.ts index 4ffe007..20ec33b 100644 --- a/server/api/v1/notifications/[id]/read.post.ts +++ b/server/api/v1/notifications/[id]/read.post.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["notifications:mark"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!notificationId) throw createError({ statusCode: 400, - statusMessage: "Missing notification ID", + message: "Missing notification ID", }); const userIds = [userId]; @@ -33,7 +33,7 @@ export default defineEventHandler(async (h3) => { if (!notification) throw createError({ statusCode: 400, - statusMessage: "Invalid notification ID", + message: "Invalid notification ID", }); return notification; diff --git a/server/api/v1/notifications/index.get.ts b/server/api/v1/notifications/index.get.ts index 982d520..022aa7d 100644 --- a/server/api/v1/notifications/index.get.ts +++ b/server/api/v1/notifications/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["notifications:read"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!acls) throw createError({ statusCode: 500, - statusMessage: "Got userId but no ACLs - what?", + message: "Got userId but no ACLs - what?", }); const notifications = await prisma.notification.findMany({ diff --git a/server/api/v1/notifications/readall.post.ts b/server/api/v1/notifications/readall.post.ts index 0e4c8c7..302f472 100644 --- a/server/api/v1/notifications/readall.post.ts +++ b/server/api/v1/notifications/readall.post.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["notifications:mark"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!acls) throw createError({ statusCode: 500, - statusMessage: "Got userId but no ACLs - what?", + message: "Got userId but no ACLs - what?", }); await prisma.notification.updateMany({ diff --git a/server/api/v1/notifications/ws.get.ts b/server/api/v1/notifications/ws.get.ts index 2f86d7c..3222f64 100644 --- a/server/api/v1/notifications/ws.get.ts +++ b/server/api/v1/notifications/ws.get.ts @@ -1,6 +1,6 @@ -import notificationSystem from "~/server/internal/notifications"; -import aclManager from "~/server/internal/acls"; -import { logger } from "~/server/internal/logging"; +import notificationSystem from "~~/server/internal/notifications"; +import aclManager from "~~/server/internal/acls"; +import { logger } from "~~/server/internal/logging"; // TODO add web socket sessions for horizontal scaling // Peer ID to user ID diff --git a/server/api/v1/object/[id]/index.delete.ts b/server/api/v1/object/[id]/index.delete.ts index fbdd5ee..35d88f0 100644 --- a/server/api/v1/object/[id]/index.delete.ts +++ b/server/api/v1/object/[id]/index.delete.ts @@ -1,11 +1,11 @@ -import aclManager from "~/server/internal/acls"; -import objectHandler from "~/server/internal/objects"; +import aclManager from "~~/server/internal/acls"; +import objectHandler from "~~/server/internal/objects"; import sanitize from "sanitize-filename"; export default defineEventHandler(async (h3) => { const unsafeId = getRouterParam(h3, "id"); if (!unsafeId) - throw createError({ statusCode: 400, statusMessage: "Invalid ID" }); + throw createError({ statusCode: 400, message: "Invalid ID" }); const userId = await aclManager.getUserIdACL(h3, ["object:delete"]); diff --git a/server/api/v1/object/[id]/index.get.ts b/server/api/v1/object/[id]/index.get.ts index 649bfcd..b979601 100644 --- a/server/api/v1/object/[id]/index.get.ts +++ b/server/api/v1/object/[id]/index.get.ts @@ -1,18 +1,18 @@ -import aclManager from "~/server/internal/acls"; -import objectHandler from "~/server/internal/objects"; +import aclManager from "~~/server/internal/acls"; +import objectHandler from "~~/server/internal/objects"; import sanitize from "sanitize-filename"; export default defineEventHandler(async (h3) => { const unsafeId = getRouterParam(h3, "id"); if (!unsafeId) - throw createError({ statusCode: 400, statusMessage: "Invalid ID" }); + throw createError({ statusCode: 400, message: "Invalid ID" }); const userId = await aclManager.getUserIdACL(h3, ["object:read"]); const id = sanitize(unsafeId); const object = await objectHandler.fetchWithPermissions(id, userId); if (!object) - throw createError({ statusCode: 404, statusMessage: "Object not found" }); + throw createError({ statusCode: 404, message: "Object not found" }); // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/ETag const etagRequestValue = h3.headers.get("If-None-Match"); diff --git a/server/api/v1/object/[id]/index.head.ts b/server/api/v1/object/[id]/index.head.ts index e762de5..60b778d 100644 --- a/server/api/v1/object/[id]/index.head.ts +++ b/server/api/v1/object/[id]/index.head.ts @@ -1,19 +1,19 @@ -import aclManager from "~/server/internal/acls"; -import objectHandler from "~/server/internal/objects"; +import aclManager from "~~/server/internal/acls"; +import objectHandler from "~~/server/internal/objects"; import sanitize from "sanitize-filename"; // this request method is purely used by the browser to check if etag values are still valid export default defineEventHandler(async (h3) => { const unsafeId = getRouterParam(h3, "id"); if (!unsafeId) - throw createError({ statusCode: 400, statusMessage: "Invalid ID" }); + throw createError({ statusCode: 400, message: "Invalid ID" }); const userId = await aclManager.getUserIdACL(h3, ["object:read"]); const id = sanitize(unsafeId); const object = await objectHandler.fetchWithPermissions(id, userId); if (!object) - throw createError({ statusCode: 404, statusMessage: "Object not found" }); + throw createError({ statusCode: 404, message: "Object not found" }); // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/ETag const etagRequestValue = h3.headers.get("If-None-Match"); diff --git a/server/api/v1/object/[id]/index.post.ts b/server/api/v1/object/[id]/index.post.ts index e6779ff..2148f78 100644 --- a/server/api/v1/object/[id]/index.post.ts +++ b/server/api/v1/object/[id]/index.post.ts @@ -1,17 +1,17 @@ -import aclManager from "~/server/internal/acls"; -import objectHandler from "~/server/internal/objects"; +import aclManager from "~~/server/internal/acls"; +import objectHandler from "~~/server/internal/objects"; import sanitize from "sanitize-filename"; export default defineEventHandler(async (h3) => { const unsafeId = getRouterParam(h3, "id"); if (!unsafeId) - throw createError({ statusCode: 400, statusMessage: "Invalid ID" }); + throw createError({ statusCode: 400, message: "Invalid ID" }); const body = await readRawBody(h3, "binary"); if (!body) throw createError({ statusCode: 400, - statusMessage: "Invalid upload", + message: "Invalid upload", }); const userId = await aclManager.getUserIdACL(h3, ["object:update"]); diff --git a/server/api/v1/screenshots/[id]/index.delete.ts b/server/api/v1/screenshots/[id]/index.delete.ts index 41e2bf5..0f5ddb1 100644 --- a/server/api/v1/screenshots/[id]/index.delete.ts +++ b/server/api/v1/screenshots/[id]/index.delete.ts @@ -1,6 +1,6 @@ // get a specific screenshot -import aclManager from "~/server/internal/acls"; -import screenshotManager from "~/server/internal/screenshots"; +import aclManager from "~~/server/internal/acls"; +import screenshotManager from "~~/server/internal/screenshots"; import sanitize from "sanitize-filename"; export default defineEventHandler(async (h3) => { @@ -11,7 +11,7 @@ export default defineEventHandler(async (h3) => { if (!unsafeId) throw createError({ statusCode: 400, - statusMessage: "Missing screenshot ID", + message: "Missing screenshot ID", }); const screenshotId = sanitize(unsafeId); diff --git a/server/api/v1/screenshots/[id]/index.get.ts b/server/api/v1/screenshots/[id]/index.get.ts index 79d569a..b7f1fa9 100644 --- a/server/api/v1/screenshots/[id]/index.get.ts +++ b/server/api/v1/screenshots/[id]/index.get.ts @@ -1,6 +1,6 @@ // get a specific screenshot -import aclManager from "~/server/internal/acls"; -import screenshotManager from "~/server/internal/screenshots"; +import aclManager from "~~/server/internal/acls"; +import screenshotManager from "~~/server/internal/screenshots"; import sanitize from "sanitize-filename"; export default defineEventHandler(async (h3) => { @@ -11,7 +11,7 @@ export default defineEventHandler(async (h3) => { if (!unsafeId) throw createError({ statusCode: 400, - statusMessage: "Missing screenshot ID", + message: "Missing screenshot ID", }); const result = await screenshotManager.get(sanitize(unsafeId)); diff --git a/server/api/v1/screenshots/game/[id]/index.get.ts b/server/api/v1/screenshots/game/[id]/index.get.ts index 71addae..23e4a74 100644 --- a/server/api/v1/screenshots/game/[id]/index.get.ts +++ b/server/api/v1/screenshots/game/[id]/index.get.ts @@ -1,6 +1,6 @@ // get all user screenshots by game -import aclManager from "~/server/internal/acls"; -import screenshotManager from "~/server/internal/screenshots"; +import aclManager from "~~/server/internal/acls"; +import screenshotManager from "~~/server/internal/screenshots"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["screenshots:read"]); @@ -10,7 +10,7 @@ export default defineEventHandler(async (h3) => { if (!gameId) throw createError({ statusCode: 400, - statusMessage: "Missing game ID", + message: "Missing game ID", }); const results = await screenshotManager.getUserAllByGame(userId, gameId); diff --git a/server/api/v1/screenshots/game/[id]/index.post.ts b/server/api/v1/screenshots/game/[id]/index.post.ts index c06b815..b97f958 100644 --- a/server/api/v1/screenshots/game/[id]/index.post.ts +++ b/server/api/v1/screenshots/game/[id]/index.post.ts @@ -1,7 +1,7 @@ // create new screenshot -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import screenshotManager from "~/server/internal/screenshots"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; +import screenshotManager from "~~/server/internal/screenshots"; // TODO: make defineClientEventHandler instead? // only clients will be upload screenshots yea?? @@ -13,7 +13,7 @@ export default defineEventHandler(async (h3) => { if (!gameId) throw createError({ statusCode: 400, - statusMessage: "Missing game ID", + message: "Missing game ID", }); const game = await prisma.game.findUnique({ @@ -21,7 +21,7 @@ export default defineEventHandler(async (h3) => { select: { id: true }, }); if (!game) - throw createError({ statusCode: 400, statusMessage: "Invalid game ID" }); + throw createError({ statusCode: 400, message: "Invalid game ID" }); await screenshotManager.upload(userId, gameId, h3.node.req); }); diff --git a/server/api/v1/screenshots/index.get.ts b/server/api/v1/screenshots/index.get.ts index 97b9f93..32c3c4d 100644 --- a/server/api/v1/screenshots/index.get.ts +++ b/server/api/v1/screenshots/index.get.ts @@ -1,6 +1,6 @@ // get all user screenshots -import aclManager from "~/server/internal/acls"; -import screenshotManager from "~/server/internal/screenshots"; +import aclManager from "~~/server/internal/acls"; +import screenshotManager from "~~/server/internal/screenshots"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["screenshots:read"]); diff --git a/server/api/v1/settings/index.get.ts b/server/api/v1/settings/index.get.ts index dea2604..f2ebb04 100644 --- a/server/api/v1/settings/index.get.ts +++ b/server/api/v1/settings/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import { applicationSettings } from "~/server/internal/config/application-configuration"; +import aclManager from "~~/server/internal/acls"; +import { applicationSettings } from "~~/server/internal/config/application-configuration"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.getUserACL(h3, ["settings:read"]); diff --git a/server/api/v1/setup.post.ts b/server/api/v1/setup.post.ts index acd83f6..1c63ec0 100644 --- a/server/api/v1/setup.post.ts +++ b/server/api/v1/setup.post.ts @@ -1,13 +1,13 @@ -import { APITokenMode } from "~/prisma/client/enums"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const allowed = await aclManager.allowSystemACL(h3, ["setup"]); if (!allowed) throw createError({ statusCode: 403, - statusMessage: "Must use a setup token.", + message: "Must use a setup token.", }); await prisma.aPIToken.deleteMany({ where: { diff --git a/server/api/v1/store/featured.get.ts b/server/api/v1/store/featured.get.ts index fb353e4..ce7f0af 100644 --- a/server/api/v1/store/featured.get.ts +++ b/server/api/v1/store/featured.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserACL(h3, ["store:read"]); diff --git a/server/api/v1/store/index.get.ts b/server/api/v1/store/index.get.ts index 26649f3..8ee924d 100644 --- a/server/api/v1/store/index.get.ts +++ b/server/api/v1/store/index.get.ts @@ -1,8 +1,7 @@ import { ArkErrors, type } from "arktype"; -import type { Prisma } from "~/prisma/client/client"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; -import { parsePlatform } from "~/server/internal/utils/parseplatform"; +import type { Prisma } from "~~/prisma/client/client"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const StoreRead = type({ skip: type("string") @@ -29,7 +28,7 @@ export default defineEventHandler(async (h3) => { const query = getQuery(h3); const options = StoreRead(query); if (options instanceof ArkErrors) - throw createError({ statusCode: 400, statusMessage: options.summary }); + throw createError({ statusCode: 400, message: options.summary }); /** * Generic filters @@ -46,18 +45,19 @@ export default defineEventHandler(async (h3) => { } : undefined; const platformFilter = options.platform - ? { + ? ({ versions: { some: { - platform: { - in: options.platform - .split(",") - .map(parsePlatform) - .filter((e) => e !== undefined), - }, + gameVersions: { + some: { + platform: { + id: options.platform + } + } + } }, }, - } + } satisfies Prisma.GameWhereInput) : undefined; /** diff --git a/server/api/v1/store/platforms.get.ts b/server/api/v1/store/platforms.get.ts new file mode 100644 index 0000000..96ee357 --- /dev/null +++ b/server/api/v1/store/platforms.get.ts @@ -0,0 +1,17 @@ +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; + +export default defineEventHandler(async (h3) => { + const userId = await aclManager.getUserIdACL(h3, ["store:read"]); + if (!userId) throw createError({ statusCode: 403 }); + + const platforms = await prisma.userPlatform.findMany({ + orderBy: { platformName: "asc" }, + select: { + id: true, + platformName: true, + iconSvg: true, + }, + }); + return platforms; +}); diff --git a/server/api/v1/store/tags.get.ts b/server/api/v1/store/tags.get.ts index 07f4030..2ed97ee 100644 --- a/server/api/v1/store/tags.get.ts +++ b/server/api/v1/store/tags.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["store:read"]); diff --git a/server/api/v1/tags/[id]/index.get.ts b/server/api/v1/tags/[id]/index.get.ts index 5d5d686..29bbe32 100644 --- a/server/api/v1/tags/[id]/index.get.ts +++ b/server/api/v1/tags/[id]/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["store:read"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!tagId) throw createError({ statusCode: 400, - statusMessage: "Missing gameId in route params (somehow...?)", + message: "Missing gameId in route params (somehow...?)", }); const tag = await prisma.gameTag.findUnique({ @@ -17,7 +17,7 @@ export default defineEventHandler(async (h3) => { }); if (!tag) - throw createError({ statusCode: 404, statusMessage: "Tag not found" }); + throw createError({ statusCode: 404, message: "Tag not found" }); return { tag }; }); diff --git a/server/api/v1/task/index.get.ts b/server/api/v1/task/index.get.ts index 6f25a53..feb6b56 100644 --- a/server/api/v1/task/index.get.ts +++ b/server/api/v1/task/index.get.ts @@ -1,5 +1,5 @@ -import taskHandler from "~/server/internal/tasks"; -import type { MinimumRequestObject } from "~/server/h3"; +import taskHandler from "~~/server/internal/tasks"; +import type { MinimumRequestObject } from "~~/server/h3"; // TODO add web socket sessions for horizontal scaling // ID to admin diff --git a/server/api/v1/token.get.ts b/server/api/v1/token.get.ts index 1ce5320..5557f66 100644 --- a/server/api/v1/token.get.ts +++ b/server/api/v1/token.get.ts @@ -1,4 +1,4 @@ -import aclManager from "~/server/internal/acls"; +import aclManager from "~~/server/internal/acls"; export default defineEventHandler(async (h3) => { const acls = await aclManager.fetchAllACLs(h3); diff --git a/server/api/v1/user/client/[id]/index.delete.ts b/server/api/v1/user/client/[id]/index.delete.ts index 2f17273..aea32ef 100644 --- a/server/api/v1/user/client/[id]/index.delete.ts +++ b/server/api/v1/user/client/[id]/index.delete.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import clientHandler from "~/server/internal/clients/handler"; +import aclManager from "~~/server/internal/acls"; +import clientHandler from "~~/server/internal/clients/handler"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["clients:revoke"]); @@ -9,7 +9,7 @@ export default defineEventHandler(async (h3) => { if (!clientId) throw createError({ statusCode: 400, - statusMessage: "Client ID missing in route params", + message: "Client ID missing in route params", }); await clientHandler.removeClient(clientId); diff --git a/server/api/v1/user/client/index.get.ts b/server/api/v1/user/client/index.get.ts index 17b5f1f..093c8cd 100644 --- a/server/api/v1/user/client/index.get.ts +++ b/server/api/v1/user/client/index.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, ["clients:read"]); diff --git a/server/api/v1/user/index.get.ts b/server/api/v1/user/index.get.ts index fb8a254..3dc1295 100644 --- a/server/api/v1/user/index.get.ts +++ b/server/api/v1/user/index.get.ts @@ -1,4 +1,4 @@ -import aclManager from "~/server/internal/acls"; +import aclManager from "~~/server/internal/acls"; export default defineEventHandler(async (h3) => { const user = await aclManager.getUserACL(h3, ["read"]); diff --git a/server/api/v1/user/token/[id]/index.delete.ts b/server/api/v1/user/token/[id]/index.delete.ts index 54d1be1..4a6ae8b 100644 --- a/server/api/v1/user/token/[id]/index.delete.ts +++ b/server/api/v1/user/token/[id]/index.delete.ts @@ -1,6 +1,6 @@ -import { APITokenMode } from "~/prisma/client/enums"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, []); // No ACLs only allows session authentication @@ -10,14 +10,14 @@ export default defineEventHandler(async (h3) => { if (!id) throw createError({ statusCode: 400, - statusMessage: "No id in router params", + message: "No id in router params", }); const deleted = await prisma.aPIToken.delete({ where: { id: id, userId: userId, mode: APITokenMode.User }, })!; if (!deleted) - throw createError({ statusCode: 404, statusMessage: "Token not found" }); + throw createError({ statusCode: 404, message: "Token not found" }); return; }); diff --git a/server/api/v1/user/token/acls.get.ts b/server/api/v1/user/token/acls.get.ts index d118809..3c351d0 100644 --- a/server/api/v1/user/token/acls.get.ts +++ b/server/api/v1/user/token/acls.get.ts @@ -1,5 +1,5 @@ -import aclManager from "~/server/internal/acls"; -import { userACLDescriptions } from "~/server/internal/acls/descriptions"; +import aclManager from "~~/server/internal/acls"; +import { userACLDescriptions } from "~~/server/internal/acls/descriptions"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, []); // No ACLs only allows session authentication diff --git a/server/api/v1/user/token/index.get.ts b/server/api/v1/user/token/index.get.ts index cff1b85..bbe1441 100644 --- a/server/api/v1/user/token/index.get.ts +++ b/server/api/v1/user/token/index.get.ts @@ -1,6 +1,6 @@ -import { APITokenMode } from "~/prisma/client/enums"; -import aclManager from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import aclManager from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; export default defineEventHandler(async (h3) => { const userId = await aclManager.getUserIdACL(h3, []); // No ACLs only allows session authentication diff --git a/server/api/v1/user/token/index.post.ts b/server/api/v1/user/token/index.post.ts index aafacf3..ffdb4c0 100644 --- a/server/api/v1/user/token/index.post.ts +++ b/server/api/v1/user/token/index.post.ts @@ -1,8 +1,8 @@ import { type } from "arktype"; -import { APITokenMode } from "~/prisma/client/enums"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import aclManager, { userACLs } from "~/server/internal/acls"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import aclManager, { userACLs } from "~~/server/internal/acls"; +import prisma from "~~/server/internal/db/database"; const CreateToken = type({ name: "string", @@ -22,7 +22,7 @@ export default defineEventHandler(async (h3) => { if (invalidACLs.length > 0) throw createError({ statusCode: 400, - statusMessage: `Invalid ACLs: ${invalidACLs.join(", ")}`, + message: `Invalid ACLs: ${invalidACLs.join(", ")}`, }); const token = await prisma.aPIToken.create({ diff --git a/server/api/v2/client/chunk.post.ts b/server/api/v2/client/chunk.post.ts index 648961b..292e2fb 100644 --- a/server/api/v2/client/chunk.post.ts +++ b/server/api/v2/client/chunk.post.ts @@ -1,8 +1,8 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import contextManager from "~/server/internal/downloads/coordinator"; -import libraryManager from "~/server/internal/library"; -import { logger } from "~/server/internal/logging"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import contextManager from "~~/server/internal/downloads/coordinator"; +import libraryManager from "~~/server/internal/library"; +import { logger } from "~~/server/internal/logging"; const GetChunk = type({ context: "string", @@ -22,7 +22,7 @@ export default defineEventHandler(async (h3) => { if (!context) throw createError({ statusCode: 400, - statusMessage: "Invalid download context.", + message: "Invalid download context.", }); const streamFiles = []; @@ -32,7 +32,7 @@ export default defineEventHandler(async (h3) => { if (!manifestFile) throw createError({ statusCode: 400, - statusMessage: `Unknown file: ${file.filename}`, + message: `Unknown file: ${file.filename}`, }); const start = manifestFile.lengths @@ -84,7 +84,7 @@ export default defineEventHandler(async (h3) => { ); throw createError({ statusCode: 500, - statusMessage: "Failed to read enough from stream.", + message: "Failed to read enough from stream.", }); } } diff --git a/server/api/v2/client/context.post.ts b/server/api/v2/client/context.post.ts index e54356a..c3f6d4e 100644 --- a/server/api/v2/client/context.post.ts +++ b/server/api/v2/client/context.post.ts @@ -1,7 +1,7 @@ import { type } from "arktype"; -import { readDropValidatedBody, throwingArktype } from "~/server/arktype"; -import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; -import contextManager from "~/server/internal/downloads/coordinator"; +import { readDropValidatedBody, throwingArktype } from "~~/server/arktype"; +import { defineClientEventHandler } from "~~/server/internal/clients/event-handler"; +import contextManager from "~~/server/internal/downloads/coordinator"; const CreateContext = type({ game: "string", @@ -15,7 +15,7 @@ export default defineClientEventHandler(async (h3) => { if (!context) throw createError({ statusCode: 400, - statusMessage: "Invalid game or version", + message: "Invalid game or version", }); return { context }; diff --git a/server/arktype.ts b/server/arktype.ts index 466851e..d9679eb 100644 --- a/server/arktype.ts +++ b/server/arktype.ts @@ -39,12 +39,12 @@ export async function readDropValidatedBody( if (e instanceof ArkErrors) { throw createError({ statusCode: 400, - statusMessage: t("errors.invalidBody", [e.summary]), + message: t("errors.invalidBody", [e.summary]), }); } throw createError({ statusCode: 400, - statusMessage: t("errors.invalidBody", [ + message: t("errors.invalidBody", [ e instanceof Error ? e.message : `${e}`, ]), }); diff --git a/server/internal/acls/descriptions.ts b/server/internal/acls/descriptions.ts index af1a007..5fab2f0 100644 --- a/server/internal/acls/descriptions.ts +++ b/server/internal/acls/descriptions.ts @@ -73,6 +73,10 @@ export const systemACLDescriptions: ObjectFromList = { "game:image:new": "Upload an image for a game.", "game:image:delete": "Delete an image for a game.", + "redist:read": "Fetch redistributables on this instance.", + "redist:update": "Update redistributables on this instance.", + "redist:delete": "Delete redistributables on this instance.", + "company:read": "Fetch companies.", "company:create": "Create a new company.", "company:update": "Update existing companies.", @@ -84,6 +88,8 @@ export const systemACLDescriptions: ObjectFromList = { "import:game:read": "Fetch games to be imported, and search the metadata for games.", "import:game:new": "Import a game.", + "import:redist:read": "Fetch redists to be imported.", + "import:redist:new": "Import a redist.", "tags:read": "Fetch all tags", "tags:create": "Create a tag", diff --git a/server/internal/acls/index.ts b/server/internal/acls/index.ts index d6997c5..e8c9372 100644 --- a/server/internal/acls/index.ts +++ b/server/internal/acls/index.ts @@ -1,7 +1,7 @@ -import { APITokenMode } from "~/prisma/client/enums"; +import { APITokenMode } from "~~/prisma/client/enums"; import prisma from "../db/database"; import sessionHandler from "../session"; -import type { MinimumRequestObject } from "~/server/h3"; +import type { MinimumRequestObject } from "~~/server/h3"; export const userACLs = [ "read", @@ -67,6 +67,10 @@ export const systemACLs = [ "game:image:new", "game:image:delete", + "redist:read", + "redist:update", + "redist:delete", + "company:read", "company:update", "company:create", @@ -74,9 +78,10 @@ export const systemACLs = [ "import:version:read", "import:version:new", - "import:game:read", "import:game:new", + "import:redist:read", + "import:redist:new", "user:read", "user:delete", diff --git a/server/internal/auth/index.ts b/server/internal/auth/index.ts index ee9cadc..634aad3 100644 --- a/server/internal/auth/index.ts +++ b/server/internal/auth/index.ts @@ -1,6 +1,6 @@ -import { AuthMec } from "~/prisma/client/enums"; +import { AuthMec } from "~~/prisma/client/enums"; import { OIDCManager } from "./oidc"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; class AuthManager { private authProviders: { diff --git a/server/internal/auth/oidc/index.ts b/server/internal/auth/oidc/index.ts index 4508d48..7e61818 100644 --- a/server/internal/auth/oidc/index.ts +++ b/server/internal/auth/oidc/index.ts @@ -1,12 +1,12 @@ import { randomUUID } from "crypto"; import prisma from "../../db/database"; -import type { UserModel } from "~/prisma/client/models"; -import { AuthMec } from "~/prisma/client/enums"; +import type { UserModel } from "~~/prisma/client/models"; +import { AuthMec } from "~~/prisma/client/enums"; import objectHandler from "../../objects"; import type { Readable } from "stream"; import * as jdenticon from "jdenticon"; import { systemConfig } from "../../config/sys-conf"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; interface OIDCWellKnown { authorization_endpoint: string; diff --git a/server/internal/clients/ca.ts b/server/internal/clients/ca.ts index 2195def..7f32736 100644 --- a/server/internal/clients/ca.ts +++ b/server/internal/clients/ca.ts @@ -24,7 +24,7 @@ export class CertificateAuthority { let ca; if (root === undefined) { const [cert, priv] = droplet.generateRootCa(); - const bundle: CertificateBundle = { priv, cert }; + const bundle: CertificateBundle = { priv: priv!, cert: cert! }; await store.store("ca", bundle); ca = new CertificateAuthority(store, bundle); } else { @@ -50,8 +50,8 @@ export class CertificateAuthority { caCertificate.priv, ); const certBundle: CertificateBundle = { - priv, - cert, + priv: priv!, + cert: cert!, }; return certBundle; } diff --git a/server/internal/clients/capabilities.ts b/server/internal/clients/capabilities.ts index 868a9f6..3f4d43d 100644 --- a/server/internal/clients/capabilities.ts +++ b/server/internal/clients/capabilities.ts @@ -1,29 +1,19 @@ import type { EnumDictionary } from "../utils/types"; import prisma from "../db/database"; -import { ClientCapabilities } from "~/prisma/client/enums"; +import { ClientCapabilities } from "~~/prisma/client/enums"; -// These values are technically mapped to the database, -// but Typescript/Prisma doesn't let me link them -// They are also what are required by clients in the API -// BREAKING CHANGE -export enum InternalClientCapability { - PeerAPI = "peerAPI", - UserStatus = "userStatus", - CloudSaves = "cloudSaves", - TrackPlaytime = "trackPlaytime", -} -export const validCapabilities = Object.values(InternalClientCapability); +export const validCapabilities = Object.values(ClientCapabilities); export type CapabilityConfiguration = { - [InternalClientCapability.PeerAPI]: object; - [InternalClientCapability.UserStatus]: object; - [InternalClientCapability.CloudSaves]: object; + [ClientCapabilities.PeerAPI]: object; + [ClientCapabilities.UserStatus]: object; + [ClientCapabilities.CloudSaves]: object; }; class CapabilityManager { private validationFunctions: EnumDictionary< - InternalClientCapability, + ClientCapabilities, (configuration: object) => Promise > = { /* @@ -77,14 +67,14 @@ class CapabilityManager { return valid; }, */ - [InternalClientCapability.PeerAPI]: async () => true, - [InternalClientCapability.UserStatus]: async () => true, // No requirements for user status - [InternalClientCapability.CloudSaves]: async () => true, // No requirements for cloud saves - [InternalClientCapability.TrackPlaytime]: async () => true, + [ClientCapabilities.PeerAPI]: async () => true, + [ClientCapabilities.UserStatus]: async () => true, // No requirements for user status + [ClientCapabilities.CloudSaves]: async () => true, // No requirements for cloud saves + [ClientCapabilities.TrackPlaytime]: async () => true, }; async validateCapabilityConfiguration( - capability: InternalClientCapability, + capability: ClientCapabilities, configuration: object, ) { const validationFunction = this.validationFunctions[capability]; @@ -93,15 +83,15 @@ class CapabilityManager { } async upsertClientCapability( - capability: InternalClientCapability, + capability: ClientCapabilities, rawCapabilityConfiguration: object, clientId: string, ) { const upsertFunctions: EnumDictionary< - InternalClientCapability, + ClientCapabilities, () => Promise | void > = { - [InternalClientCapability.PeerAPI]: async function () { + [ClientCapabilities.PeerAPI]: async function () { // const configuration =rawCapability as CapabilityConfiguration[InternalClientCapability.PeerAPI]; const currentClient = await prisma.client.findUnique({ @@ -139,10 +129,10 @@ class CapabilityManager { }, }); }, - [InternalClientCapability.UserStatus]: function (): Promise | void { + [ClientCapabilities.UserStatus]: function (): Promise | void { throw new Error("Function not implemented."); }, - [InternalClientCapability.CloudSaves]: async function () { + [ClientCapabilities.CloudSaves]: async function () { const currentClient = await prisma.client.findUnique({ where: { id: clientId }, select: { @@ -162,7 +152,7 @@ class CapabilityManager { }, }); }, - [InternalClientCapability.TrackPlaytime]: async function () { + [ClientCapabilities.TrackPlaytime]: async function () { const currentClient = await prisma.client.findUnique({ where: { id: clientId }, select: { diff --git a/server/internal/clients/event-handler.ts b/server/internal/clients/event-handler.ts index dfbdf0d..0d8865a 100644 --- a/server/internal/clients/event-handler.ts +++ b/server/internal/clients/event-handler.ts @@ -1,8 +1,8 @@ -import type { ClientModel, UserModel } from "~/prisma/client/models"; +import type { ClientModel, UserModel } from "~~/prisma/client/models"; import type { EventHandlerRequest, H3Event } from "h3"; import droplet from "@drop-oss/droplet"; import prisma from "../db/database"; -import { useCertificateAuthority } from "~/server/plugins/ca"; +import { useCertificateAuthority } from "~~/server/plugins/ca"; export type EventHandlerFunction = ( h3: H3Event, @@ -23,7 +23,7 @@ export function defineClientEventHandler(handler: EventHandlerFunction) { if (!header) throw createError({ statusCode: 403 }); const [method, ...parts] = header.split(" "); - let clientId: string; + let clientId: string | undefined; switch (method) { case "Debug": { if (!import.meta.dev) throw createError({ statusCode: 403 }); @@ -31,7 +31,7 @@ export function defineClientEventHandler(handler: EventHandlerFunction) { if (!client) throw createError({ statusCode: 400, - statusMessage: "No clients created.", + message: "No clients created.", }); clientId = client.id; break; @@ -55,7 +55,7 @@ export function defineClientEventHandler(handler: EventHandlerFunction) { // We reject the request throw createError({ statusCode: 403, - statusMessage: "Nonce expired", + message: "Nonce expired", }); } @@ -66,21 +66,21 @@ export function defineClientEventHandler(handler: EventHandlerFunction) { if (!certBundle) throw createError({ statusCode: 403, - statusMessage: "Invalid client ID", + message: "Invalid client ID", }); const valid = droplet.verifyNonce(certBundle.cert, nonce, signature); if (!valid) throw createError({ statusCode: 403, - statusMessage: "Invalid nonce signature.", + message: "Invalid nonce signature.", }); break; } default: { throw createError({ statusCode: 403, - statusMessage: "No authentication", + message: "No authentication", }); } } @@ -88,12 +88,12 @@ export function defineClientEventHandler(handler: EventHandlerFunction) { if (clientId === undefined) throw createError({ statusCode: 500, - statusMessage: "Failed to execute authentication pipeline.", + message: "Failed to execute authentication pipeline.", }); async function fetchClient() { const client = await prisma.client.findUnique({ - where: { id: clientId }, + where: { id: clientId! }, }); if (!client) throw new Error( @@ -104,7 +104,7 @@ export function defineClientEventHandler(handler: EventHandlerFunction) { async function fetchUser() { const client = await prisma.client.findUnique({ - where: { id: clientId }, + where: { id: clientId! }, select: { user: true, }, diff --git a/server/internal/clients/handler.ts b/server/internal/clients/handler.ts index 960dd55..99be1c1 100644 --- a/server/internal/clients/handler.ts +++ b/server/internal/clients/handler.ts @@ -1,23 +1,20 @@ import { randomUUID } from "node:crypto"; import prisma from "../db/database"; -import type { Platform } from "~/prisma/client/enums"; -import { useCertificateAuthority } from "~/server/plugins/ca"; +import type { ClientCapabilities, HardwarePlatform } from "~~/prisma/client/enums"; +import { useCertificateAuthority } from "~~/server/plugins/ca"; import type { CapabilityConfiguration, - InternalClientCapability, } from "./capabilities"; import capabilityManager from "./capabilities"; import type { PeerImpl } from "../tasks"; -import userStatsManager from "~/server/internal/userstats"; +import userStatsManager from "~~/server/internal/userstats"; -export enum AuthMode { - Callback = "callback", - Code = "code", -} +export const AuthModes = ["callback", "code"] as const; +export type AuthMode = (typeof AuthModes)[number]; export interface ClientMetadata { name: string; - platform: Platform; + platform: HardwarePlatform; capabilities: Partial; mode: AuthMode; } @@ -63,9 +60,9 @@ export class ClientHandler { }); switch (metadata.mode) { - case AuthMode.Callback: + case "callback": return `/client/authorize/${clientId}`; - case AuthMode.Code: { + case "code": { const code = randomUUID() .replaceAll(/-/g, "") .slice(0, 7) @@ -81,15 +78,15 @@ export class ClientHandler { if (!clientId) throw createError({ statusCode: 403, - statusMessage: "Invalid or unknown code.", + message: "Invalid or unknown code.", }); const metadata = this.temporaryClientTable.get(clientId); if (!metadata) - throw createError({ statusCode: 500, statusMessage: "Broken code." }); + throw createError({ statusCode: 500, message: "Broken code." }); if (metadata.peer) throw createError({ statusCode: 400, - statusMessage: "Pre-existing listener for this code.", + message: "Pre-existing listener for this code.", }); metadata.peer = peer; this.temporaryClientTable.set(clientId, metadata); @@ -130,12 +127,12 @@ export class ClientHandler { if (!client) throw createError({ statusCode: 500, - statusMessage: "Corrupted code, please restart the process.", + message: "Corrupted code, please restart the process.", }); if (!client.peer) throw createError({ statusCode: 400, - statusMessage: "Client has not connected yet. Please try again later.", + message: "Client has not connected yet. Please try again later.", }); client.peer.send( JSON.stringify({ type: "token", value: `${clientId}/${token}` }), @@ -173,7 +170,7 @@ export class ClientHandler { metadata.data.capabilities, )) { await capabilityManager.upsertClientCapability( - capability as InternalClientCapability, + capability as ClientCapabilities, configuration, client.id, ); diff --git a/server/internal/config/application-configuration.ts b/server/internal/config/application-configuration.ts index 697702e..4f44537 100644 --- a/server/internal/config/application-configuration.ts +++ b/server/internal/config/application-configuration.ts @@ -1,4 +1,4 @@ -import type { ApplicationSettingsModel } from "~/prisma/client/models"; +import type { ApplicationSettingsModel } from "~~/prisma/client/models"; import prisma from "../db/database"; class ApplicationConfiguration { diff --git a/server/internal/db/database.ts b/server/internal/db/database.ts index fe12a0c..05d898a 100644 --- a/server/internal/db/database.ts +++ b/server/internal/db/database.ts @@ -1,4 +1,4 @@ -import { PrismaClient } from "~/prisma/client/client"; +import { PrismaClient } from "~~/prisma/client/client"; // import { PrismaPg } from "@prisma/adapter-pg"; const prismaClientSingleton = () => { diff --git a/server/internal/downloads/coordinator.ts b/server/internal/downloads/coordinator.ts index bc2dfe5..0ccec81 100644 --- a/server/internal/downloads/coordinator.ts +++ b/server/internal/downloads/coordinator.ts @@ -15,12 +15,13 @@ class DownloadContextManager { } > = new Map(); - async createContext(game: string, versionName: string) { - const version = await prisma.gameVersion.findUnique({ + async createContext(game: string, versionPath: string) { + const version = await prisma.version.findFirst({ where: { - gameId_versionName: { - gameId: game, - versionName, + gameId: game, + versionPath, + game: { + isNot: null, }, }, include: { @@ -38,9 +39,9 @@ class DownloadContextManager { this.contexts.set(contextId, { timeout: new Date(), manifest: JSON.parse(version.dropletManifest as string) as DropManifest, - versionName, - libraryId: version.game.libraryId!, - libraryPath: version.game.libraryPath, + versionName: versionPath, + libraryId: version.game!.libraryId!, + libraryPath: version.game!.libraryPath, }); return contextId; diff --git a/server/internal/downloads/manifest.ts b/server/internal/downloads/manifest.ts index 2da9b57..b9e2305 100644 --- a/server/internal/downloads/manifest.ts +++ b/server/internal/downloads/manifest.ts @@ -1,4 +1,3 @@ -import type { GameVersionModel } from "~/prisma/client/models"; import prisma from "../db/database"; import { sum } from "~/utils/array"; @@ -15,11 +14,11 @@ export type DropManifest = { export type DropManifestMetadata = { manifest: DropManifest; - versionName: string; + versionId: string; }; export type DropGeneratedManifest = DropManifest & { - [key: string]: { versionName: string }; + [key: string]: { versionId: string }; }; class ManifestGenerator { @@ -32,7 +31,7 @@ class ManifestGenerator { Object.entries(rootManifest.manifest).map(([key, value]) => { return [ key, - Object.assign({}, value, { versionName: rootManifest.versionName }), + Object.assign({}, value, { versionId: rootManifest.versionId }), ]; }), ); @@ -45,7 +44,7 @@ class ManifestGenerator { for (const [filename, chunk] of Object.entries(version.manifest)) { if (manifest[filename]) continue; manifest[filename] = Object.assign({}, chunk, { - versionName: version.versionName, + versionId: version.versionId, }); } } @@ -54,14 +53,26 @@ class ManifestGenerator { } // Local function because eventual caching - async generateManifest(gameId: string, versionName: string) { - const versions: GameVersionModel[] = []; + async generateManifest(versionId: string) { + const versions = []; const baseVersion = await prisma.gameVersion.findUnique({ where: { - gameId_versionName: { - gameId: gameId, - versionName: versionName, + versionId, + version: { + gameId: { + not: null, + }, + }, + }, + include: { + platform: true, + version: { + select: { + gameId: true, + dropletManifest: true, + versionIndex: true, + }, }, }, }); @@ -73,31 +84,42 @@ class ManifestGenerator { // Start at the same index minus one, and keep grabbing them // until we run out or we hit something that isn't a delta // eslint-disable-next-line no-constant-condition - for (let i = baseVersion.versionIndex - 1; true; i--) { + for (let i = baseVersion.version.versionIndex - 1; true; i--) { const currentVersion = await prisma.gameVersion.findFirst({ where: { - gameId: gameId, - versionIndex: i, - platform: baseVersion.platform, + version: { + gameId: baseVersion.version.gameId!, + versionIndex: i, + }, + platform: { + id: baseVersion.platform.id, + }, + }, + include: { + version: { + select: { + dropletManifest: true, + }, + }, }, }); if (!currentVersion) return undefined; versions.push(currentVersion); - if (!currentVersion.delta) break; + if (!currentVersion?.delta) break; } } - const leastToMost = versions.reverse(); - const metadata: DropManifestMetadata[] = leastToMost.map((e) => { + versions.reverse(); + const metadata: DropManifestMetadata[] = versions.map((gameVersion) => { return { manifest: JSON.parse( - e.dropletManifest?.toString() ?? "{}", + gameVersion.version.dropletManifest?.toString() ?? "{}", ) as DropManifest, - versionName: e.versionName, + versionId: gameVersion.versionId, }; }); const manifest = ManifestGenerator.generateManifestFromMetadata( - metadata[0], + metadata[0]!, ...metadata.slice(1), ); diff --git a/server/internal/gamesize/index.ts b/server/internal/gamesize/index.ts index 9e20976..17000a6 100644 --- a/server/internal/gamesize/index.ts +++ b/server/internal/gamesize/index.ts @@ -1,8 +1,8 @@ +import { sum } from "~/utils/array"; import cacheHandler from "../cache"; import prisma from "../db/database"; import manifestGenerator from "../downloads/manifest"; -import { sum } from "../../../utils/array"; -import type { Game, GameVersion } from "~/prisma/client/client"; +import type { Game, Version } from "~~/prisma/client/client"; export type GameSize = { gameName: string; @@ -15,7 +15,7 @@ export type VersionSize = GameSize & { }; type VersionsSizes = { - [versionName: string]: VersionSize; + [versionId: string]: VersionSize; }; type GameVersionsSize = { @@ -42,7 +42,7 @@ class GameSizeManager { // All versions of a game combined async getCombinedGameSize(gameId: string) { - const versions = await prisma.gameVersion.findMany({ + const versions = await prisma.version.findMany({ where: { gameId }, }); const sizes = await Promise.all( @@ -57,10 +57,10 @@ class GameSizeManager { async getGameVersionSize( gameId: string, - versionName?: string, + versionId?: string, ): Promise { - if (!versionName) { - const version = await prisma.gameVersion.findFirst({ + if (!versionId) { + const version = await prisma.version.findFirst({ where: { gameId }, orderBy: { versionIndex: "desc", @@ -69,13 +69,10 @@ class GameSizeManager { if (!version) { return null; } - versionName = version.versionName; + versionId = version.versionId; } - const manifest = await manifestGenerator.generateManifest( - gameId, - versionName, - ); + const manifest = await manifestGenerator.generateManifest(versionId); if (!manifest) { return null; } @@ -84,11 +81,11 @@ class GameSizeManager { } private async isLatestVersion( - gameVersions: GameVersion[], - version: GameVersion, + gameVersions: Version[], + version: Version, ): Promise { return gameVersions.length > 0 - ? gameVersions[0].versionName === version.versionName + ? gameVersions[0].versionId === version.versionId : false; } @@ -101,7 +98,7 @@ class GameSizeManager { return null; } const latestVersionName = Object.keys(versionsSizes).find( - (versionName) => versionsSizes[versionName].latest, + (versionId) => versionsSizes[versionId].latest, ); if (!latestVersionName) { return null; @@ -161,17 +158,17 @@ class GameSizeManager { } async cacheGameVersion( - game: Game & { versions: GameVersion[] }, - versionName?: string, + game: Game & { versions: Version[] }, + versionId?: string, ) { - const cacheVersion = async (version: GameVersion) => { - const size = await this.getGameVersionSize(game.id, version.versionName); - if (!version.versionName || !size) { + const cacheVersion = async (version: Version) => { + const size = await this.getGameVersionSize(game.id, version.versionId); + if (!version.versionId || !size) { return; } const versionsSizes = { - [version.versionName]: { + [version.versionId]: { size, gameName: game.mName, gameId: game.id, @@ -186,9 +183,9 @@ class GameSizeManager { }); }; - if (versionName) { - const version = await prisma.gameVersion.findFirst({ - where: { gameId: game.id, versionName }, + if (versionId) { + const version = await prisma.version.findFirst({ + where: { gameId: game.id, versionId }, }); if (!version) { return; @@ -212,7 +209,7 @@ class GameSizeManager { .slice(0, top); } - async deleteGameVersion(gameId: string, version: string) { + async deleteGameVersion(gameId: string, versionId: string) { const game = await prisma.game.findFirst({ where: { id: gameId } }); if (game) { await this.cacheCombinedGame(game); @@ -222,7 +219,7 @@ class GameSizeManager { return; } // Remove the version from the VersionsSizes object - const { [version]: _, ...updatedVersionsSizes } = versionsSizes; + const { [versionId]: _, ...updatedVersionsSizes } = versionsSizes; await this.gameVersionsSizesCache.set(gameId, updatedVersionsSizes); } @@ -232,5 +229,5 @@ class GameSizeManager { } } -export const manager = new GameSizeManager(); -export default manager; +export const gameSizeManager = new GameSizeManager(); +export default gameSizeManager; diff --git a/server/internal/library/REDIST-README.md b/server/internal/library/REDIST-README.md new file mode 100644 index 0000000..739a66d --- /dev/null +++ b/server/internal/library/REDIST-README.md @@ -0,0 +1,3 @@ +# Redistributables + +They are called 'redist' in the codebase/database models for brevity. Additionally, because they intentionally are drop-ins for games, they are added to all the functions that deal with games, without changing the names. \ No newline at end of file diff --git a/server/internal/library/index.ts b/server/internal/library/index.ts index a0514e8..960b629 100644 --- a/server/internal/library/index.ts +++ b/server/internal/library/index.ts @@ -9,14 +9,29 @@ import path from "path"; import prisma from "../db/database"; import { fuzzy } from "fast-fuzzy"; import taskHandler from "../tasks"; -import { parsePlatform } from "../utils/parseplatform"; import notificationSystem from "../notifications"; import { GameNotFoundError, type LibraryProvider } from "./provider"; import { logger } from "../logging"; -import type { GameModel } from "~/prisma/client/models"; import { createHash } from "node:crypto"; -import type { WorkingLibrarySource } from "~/server/api/v1/admin/library/sources/index.get"; -import gameSizeManager from "~/server/internal/gamesize"; +import type { ImportVersion } from "~~/server/api/v1/admin/import/version/index.post"; +import type { + GameVersionCreateInput, + LaunchOptionCreateManyInput, + VersionCreateInput, + VersionWhereInput, +} from "~~/prisma/client/models"; +import type { PlatformLink } from "~~/prisma/client/client"; +import { convertIDToLink } from "../platform/link"; +import type { WorkingLibrarySource } from "~~/server/api/v1/admin/library/sources/index.get"; +import gameSizeManager from "../gamesize"; + +export const VersionImportModes = ["game", "redist"] as const; +export type VersionImportMode = (typeof VersionImportModes)[number]; + +const modeToLink: { [key in VersionImportMode]: string } = { + game: "g", + redist: "r", +}; export function createGameImportTaskId(libraryId: string, libraryPath: string) { return createHash("md5") @@ -57,14 +72,15 @@ class LibraryManager { } async fetchGamesByLibrary() { - const results: { [key: string]: { [key: string]: GameModel } } = {}; + const results: { [key: string]: { [key: string]: boolean } } = {}; const games = await prisma.game.findMany({}); - for (const game of games) { - const libraryId = game.libraryId!; - const libraryPath = game.libraryPath!; + const redist = await prisma.redist.findMany({}); + for (const item of [...games, ...redist]) { + const libraryId = item.libraryId!; + const libraryPath = item.libraryPath!; results[libraryId] ??= {}; - results[libraryId][libraryPath] = game; + results[libraryId][libraryPath] = true; } return results; @@ -90,18 +106,31 @@ class LibraryManager { async fetchUnimportedGameVersions(libraryId: string, libraryPath: string) { const provider = this.libraries.get(libraryId); if (!provider) return undefined; - const game = await prisma.game.findUnique({ - where: { - libraryKey: { - libraryId, - libraryPath, + const game = + (await prisma.game.findUnique({ + where: { + libraryKey: { + libraryId, + libraryPath, + }, }, - }, - select: { - id: true, - versions: true, - }, - }); + select: { + id: true, + versions: true, + }, + })) ?? + (await prisma.redist.findUnique({ + where: { + libraryKey: { + libraryId, + libraryPath, + }, + }, + select: { + id: true, + versions: true, + }, + })); if (!game) return undefined; try { @@ -121,29 +150,23 @@ class LibraryManager { } } - async fetchGamesWithStatus() { - const games = await prisma.game.findMany({ - include: { - versions: { - select: { - versionName: true, - }, - }, - library: true, - }, - orderBy: { - mName: "asc", - }, - }); - + async fetchLibraryObjectWithStatus( + objects: Array< + { + libraryId: string; + libraryPath: string; + versions: Array; + } & T + >, + ) { return await Promise.all( - games.map(async (e) => { + objects.map(async (e) => { const versions = await this.fetchUnimportedGameVersions( e.libraryId ?? "", e.libraryPath, ); return { - game: e, + value: e, status: versions ? { noVersions: e.versions.length == 0, @@ -155,22 +178,220 @@ class LibraryManager { ); } + async fetchGamesWithStatus() { + const games = await prisma.game.findMany({ + include: { + versions: { + select: { + versionId: true, + versionName: true, + }, + }, + library: { + select: { + id: true, + name: true, + }, + }, + }, + orderBy: { + mName: "asc", + }, + }); + + return await this.fetchLibraryObjectWithStatus(games); + } + + async fetchRedistsWithStatus() { + const redists = await prisma.redist.findMany({ + include: { + versions: { + select: { + versionId: true, + versionName: true, + }, + }, + library: { + select: { + id: true, + name: true, + }, + }, + platform: true, + }, + orderBy: { + mName: "asc", + }, + }); + + return await this.fetchLibraryObjectWithStatus(redists); + } + + private async fetchLibraryPath( + id: string, + mode: VersionImportMode, + platform?: PlatformLink, + ): Promise< + | [ + { mName: string; libraryId: string; libraryPath: string } | null, + VersionWhereInput, + ] + | undefined + > { + switch (mode) { + case "game": + return [ + await prisma.game.findUnique({ + where: { id }, + select: { mName: true, libraryId: true, libraryPath: true }, + }), + { gameId: id, gameVersions: { some: { platform } } }, + ]; + case "redist": + return [ + await prisma.redist.findUnique({ + where: { id }, + select: { mName: true, libraryId: true, libraryPath: true }, + }), + { redistId: id }, + ]; + } + return undefined; + } + + private createVersionOptions( + id: string, + currentIndex: number, + metadata: typeof ImportVersion.infer, + ): Omit< + VersionCreateInput, + "versionPath" | "versionName" | "dropletManifest" + > { + const installCreator = { + install: { + create: { + name: "", + description: "", + command: metadata.install!, + args: metadata.installArgs || "", + }, + }, + } satisfies Partial; + + const uninstallCreator = { + uninstall: { + create: { + name: "", + description: "", + command: metadata.uninstall!, + args: metadata.uninstallArgs || "", + }, + }, + } satisfies Partial; + + switch (metadata.mode) { + case "game": { + return { + versionIndex: currentIndex, + game: { + connect: { + id, + }, + }, + gameVersions: { + create: { + delta: metadata.delta, + umuIdOverride: metadata.umuId, + + onlySetup: metadata.onlySetup, + + launches: { + createMany: { + data: metadata.launches.map( + (v) => + ({ + name: v.name, + description: v.description, + command: v.launchCommand, + args: v.launchArgs, + }) satisfies LaunchOptionCreateManyInput, + ), + }, + }, + + ...(metadata.install ? installCreator : undefined), + ...(metadata.uninstall ? uninstallCreator : undefined), + + platform: { + connect: { + id: metadata.platform, + }, + }, + }, + }, + }; + } + case "redist": + return { + versionIndex: currentIndex, + redist: { + connect: { + id, + }, + }, + redistVersions: { + create: { + versionIndex: currentIndex, + delta: metadata.delta, + + launches: { + createMany: { + data: metadata.launches.map( + (v) => + ({ + name: v.name, + description: v.description, + command: v.launchCommand, + args: v.launchArgs, + }) satisfies LaunchOptionCreateManyInput, + ), + }, + }, + + ...(metadata.install ? installCreator : undefined), + ...(metadata.uninstall ? uninstallCreator : undefined), + + platform: { + connect: { + id: metadata.platform, + }, + }, + }, + }, + }; + } + } + /** * Fetches recommendations and extra data about the version. Doesn't actually check if it's been imported. - * @param gameId - * @param versionName + * @param id + * @param version * @returns */ - async fetchUnimportedVersionInformation(gameId: string, versionName: string) { - const game = await prisma.game.findUnique({ - where: { id: gameId }, - select: { libraryPath: true, libraryId: true, mName: true }, - }); - if (!game || !game.libraryId) return undefined; + async fetchUnimportedVersionInformation( + id: string, + mode: VersionImportMode, + version: string, + ) { + const value = await this.fetchLibraryPath(id, mode); + if (!value?.[0] || !value[0].libraryId) return undefined; + const [libraryDetails] = value; - const library = this.libraries.get(game.libraryId); + const library = this.libraries.get(libraryDetails.libraryId); if (!library) return undefined; + const userPlatforms = await prisma.userPlatform.findMany({}); + const fileExts: { [key: string]: string[] } = { Linux: [ // Ext for Unity games @@ -189,13 +410,20 @@ class LibraryManager { ], }; + for (const platform of userPlatforms) { + fileExts[platform.id] = platform.fileExtensions; + } + const options: Array<{ filename: string; platform: string; match: number; }> = []; - const files = await library.versionReaddir(game.libraryPath, versionName); + const files = await library.versionReaddir( + libraryDetails.libraryPath, + version, + ); for (const filename of files) { const basename = path.basename(filename); const dotLocation = filename.lastIndexOf("."); @@ -204,7 +432,7 @@ class LibraryManager { for (const [platform, checkExts] of Object.entries(fileExts)) { for (const checkExt of checkExts) { if (checkExt != ext) continue; - const fuzzyValue = fuzzy(basename, game.mName); + const fuzzyValue = fuzzy(basename, libraryDetails.mName); options.push({ filename, platform, @@ -227,6 +455,10 @@ class LibraryManager { })) > 0; if (hasGame) return false; + const hasRedist = + (await prisma.redist.count({ where: { libraryId, libraryPath } })) > 0; + if (hasRedist) return false; + return true; } @@ -239,46 +471,70 @@ class LibraryManager { */ async importVersion( - gameId: string, - versionName: string, - metadata: { - platform: string; - onlySetup: boolean; - - setup: string; - setupArgs: string; - launch: string; - launchArgs: string; - delta: boolean; - - umuId: string; - }, + id: string, + version: string, + metadata: typeof ImportVersion.infer, ) { - const taskId = createVersionImportTaskId(gameId, versionName); + const taskId = createVersionImportTaskId(id, version); - const platform = parsePlatform(metadata.platform); - if (!platform) return undefined; + if (metadata.mode === "game") { + if (metadata.onlySetup) { + if (!metadata.install) + throw createError({ + statusCode: 400, + message: "An install command is required in only-setup mode.", + }); + } else { + if (!metadata.delta && metadata.launches.length == 0) + throw createError({ + statusCode: 400, + message: + "At least one launch command is required in non-delta, non-setup mode.", + }); + } + } - const game = await prisma.game.findUnique({ - where: { id: gameId }, - select: { mName: true, libraryId: true, libraryPath: true }, + const platform = await convertIDToLink(metadata.platform); + if (!platform) + throw createError({ statusCode: 400, message: "Invalid platform." }); + + const value = await this.fetchLibraryPath(id, metadata.mode, platform); + if (!value || !value[0]) + throw createError({ + statusCode: 400, + message: `${metadata.mode} not found.`, + }); + const [libraryDetails, idFilter] = value; + + const library = this.libraries.get(libraryDetails.libraryId); + if (!library) + throw createError({ + statusCode: 500, + message: "Library not found but exists in database?", + }); + + const currentIndex = await prisma.version.count({ + where: { ...idFilter }, }); - if (!game || !game.libraryId) return undefined; - const library = this.libraries.get(game.libraryId); - if (!library) return undefined; + if (metadata.delta && currentIndex == 0) + throw createError({ + statusCode: 400, + message: + "At least one pre-existing version of the same platform is required for delta mode.", + }); taskHandler.create({ id: taskId, taskGroup: "import:game", - name: `Importing version ${versionName} for ${game.mName}`, + name: `Importing version "${metadata.name}" (${version}) for ${libraryDetails.mName}`, acls: ["system:import:version:read"], async run({ progress, logger }) { // First, create the manifest via droplet. // This takes up 90% of our progress, so we wrap it in a *0.9 const manifest = await library.generateDropletManifest( - game.libraryPath, - versionName, + libraryDetails.libraryPath, + version, (err, value) => { if (err) throw err; progress(value * 0.9); @@ -291,59 +547,35 @@ class LibraryManager { logger.info("Created manifest successfully!"); - const currentIndex = await prisma.gameVersion.count({ - where: { gameId: gameId }, - }); - // Then, create the database object - if (metadata.onlySetup) { - await prisma.gameVersion.create({ - data: { - gameId: gameId, - versionName: versionName, - dropletManifest: manifest, - versionIndex: currentIndex, - delta: metadata.delta, - umuIdOverride: metadata.umuId, - platform: platform, + const createdVersion = await prisma.version.create({ + data: { + versionPath: version, + versionName: metadata.name ?? version, + dropletManifest: manifest, - onlySetup: true, - setupCommand: metadata.setup, - setupArgs: metadata.setupArgs.split(" "), - }, - }); - } else { - await prisma.gameVersion.create({ - data: { - gameId: gameId, - versionName: versionName, - dropletManifest: manifest, - versionIndex: currentIndex, - delta: metadata.delta, - umuIdOverride: metadata.umuId, - platform: platform, - - onlySetup: false, - setupCommand: metadata.setup, - setupArgs: metadata.setupArgs.split(" "), - launchCommand: metadata.launch, - launchArgs: metadata.launchArgs.split(" "), - }, - }); - } + ...libraryManager.createVersionOptions(id, currentIndex, metadata), + }, + }); logger.info("Successfully created version!"); notificationSystem.systemPush({ - nonce: `version-create-${gameId}-${versionName}`, - title: `'${game.mName}' ('${versionName}') finished importing.`, - description: `Drop finished importing version ${versionName} for ${game.mName}.`, - actions: [`View|/admin/library/${gameId}`], + nonce: `version-create-${id}-${version}`, + title: `'${libraryDetails.mName}' ('${version}') finished importing.`, + description: `Drop finished importing version ${version} for ${libraryDetails.mName}.`, + actions: [`View|/admin/library/${modeToLink[metadata.mode]}/${id}`], acls: ["system:import:version:read"], }); - await libraryManager.cacheCombinedGameSize(gameId); - await libraryManager.cacheGameVersionSize(gameId, versionName); + if (metadata.mode === "game") { + await libraryManager.cacheCombinedGameSize(id); + await libraryManager.cacheGameVersionSize( + id, + createdVersion.versionId, + ); + } + progress(100); }, }); @@ -374,17 +606,22 @@ class LibraryManager { return await library.readFile(game, version, filename, options); } - async deleteGameVersion(gameId: string, version: string) { - await prisma.gameVersion.delete({ + async deleteGameVersion(versionId: string) { + const version = await prisma.version.delete({ where: { - gameId_versionName: { - gameId: gameId, - versionName: version, - }, + versionId, + }, + include: { + game: true, }, }); - await gameSizeManager.deleteGameVersion(gameId, version); + if (version.game) { + await gameSizeManager.deleteGameVersion( + version.game.id, + version.versionId, + ); + } } async deleteGame(gameId: string) { @@ -398,9 +635,9 @@ class LibraryManager { async getGameVersionSize( gameId: string, - versionName?: string, + versionId?: string, ): Promise { - return gameSizeManager.getGameVersionSize(gameId, versionName); + return gameSizeManager.getGameVersionSize(gameId, versionId); } async getBiggestGamesCombinedVersions(top: number) { @@ -425,7 +662,7 @@ class LibraryManager { await gameSizeManager.cacheCombinedGame(game); } - async cacheGameVersionSize(gameId: string, versionName: string) { + async cacheGameVersionSize(gameId: string, versionId: string) { const game = await prisma.game.findFirst({ where: { id: gameId }, include: { versions: true }, @@ -433,7 +670,7 @@ class LibraryManager { if (!game) { return; } - await gameSizeManager.cacheGameVersion(game, versionName); + await gameSizeManager.cacheGameVersion(game, versionId); } } diff --git a/server/internal/library/provider.ts b/server/internal/library/provider.ts index 576cac9..0e89665 100644 --- a/server/internal/library/provider.ts +++ b/server/internal/library/provider.ts @@ -1,4 +1,4 @@ -import type { LibraryBackend } from "~/prisma/client/enums"; +import type { LibraryBackend } from "~~/prisma/client/enums"; export abstract class LibraryProvider { constructor(_config: CFG, _id: string) { diff --git a/server/internal/library/providers/filesystem.ts b/server/internal/library/providers/filesystem.ts index d2f2ac3..66822bb 100644 --- a/server/internal/library/providers/filesystem.ts +++ b/server/internal/library/providers/filesystem.ts @@ -4,11 +4,11 @@ import { VersionNotFoundError, type LibraryProvider, } from "../provider"; -import { LibraryBackend } from "~/prisma/client/enums"; +import { LibraryBackend } from "~~/prisma/client/enums"; import fs from "fs"; import path from "path"; import droplet, { DropletHandler } from "@drop-oss/droplet"; -import { fsStats } from "~/server/internal/utils/files"; +import { fsStats } from "~~/server/internal/utils/files"; export const FilesystemProviderConfig = type({ baseDir: "string", diff --git a/server/internal/library/providers/flat.ts b/server/internal/library/providers/flat.ts index 7c2e9a5..67a3ac7 100644 --- a/server/internal/library/providers/flat.ts +++ b/server/internal/library/providers/flat.ts @@ -1,12 +1,12 @@ import { ArkErrors, type } from "arktype"; import type { LibraryProvider } from "../provider"; import { VersionNotFoundError } from "../provider"; -import { LibraryBackend } from "~/prisma/client/enums"; +import { LibraryBackend } from "~~/prisma/client/enums"; import fs from "fs"; import path from "path"; import droplet from "@drop-oss/droplet"; import { DROPLET_HANDLER } from "./filesystem"; -import { fsStats } from "~/server/internal/utils/files"; +import { fsStats } from "~~/server/internal/utils/files"; export const FlatFilesystemProviderConfig = type({ baseDir: "string", diff --git a/server/internal/metadata/giantbomb.ts b/server/internal/metadata/giantbomb.ts index 5a78985..445fc45 100644 --- a/server/internal/metadata/giantbomb.ts +++ b/server/internal/metadata/giantbomb.ts @@ -1,5 +1,5 @@ -import type { CompanyModel } from "~/prisma/client/models"; -import { MetadataSource } from "~/prisma/client/enums"; +import type { CompanyModel } from "~~/prisma/client/models"; +import { MetadataSource } from "~~/prisma/client/enums"; import type { MetadataProvider } from "."; import { MissingMetadataProviderConfig } from "."; import type { @@ -13,7 +13,7 @@ import type { import axios, { type AxiosRequestConfig } from "axios"; import TurndownService from "turndown"; import { DateTime } from "luxon"; -import type { TaskRunContext } from "../tasks"; +import type { TaskRunContext } from "../tasks/utils"; interface GiantBombResponseType { error: "OK" | string; diff --git a/server/internal/metadata/igdb.ts b/server/internal/metadata/igdb.ts index c135117..dc9317f 100644 --- a/server/internal/metadata/igdb.ts +++ b/server/internal/metadata/igdb.ts @@ -1,5 +1,5 @@ -import type { CompanyModel } from "~/prisma/client/models"; -import { MetadataSource } from "~/prisma/client/enums"; +import type { CompanyModel } from "~~/prisma/client/models"; +import { MetadataSource } from "~~/prisma/client/enums"; import type { MetadataProvider } from "."; import { MissingMetadataProviderConfig } from "."; import type { @@ -13,8 +13,8 @@ import type { AxiosRequestConfig } from "axios"; import axios from "axios"; import { DateTime } from "luxon"; import * as jdenticon from "jdenticon"; -import type { TaskRunContext } from "../tasks"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; +import type { TaskRunContext } from "../tasks/utils"; type IGDBID = number; diff --git a/server/internal/metadata/index.ts b/server/internal/metadata/index.ts index 93e0e5f..0dee977 100644 --- a/server/internal/metadata/index.ts +++ b/server/internal/metadata/index.ts @@ -1,5 +1,5 @@ -import type { Prisma } from "~/prisma/client/client"; -import { MetadataSource } from "~/prisma/client/enums"; +import type { Prisma } from "~~/prisma/client/client"; +import { MetadataSource } from "~~/prisma/client/enums"; import prisma from "../db/database"; import type { _FetchGameMetadataParams, @@ -13,13 +13,14 @@ import type { import { ObjectTransactionalHandler } from "../objects/transactional"; import { PriorityListIndexed } from "../utils/prioritylist"; import { systemConfig } from "../config/sys-conf"; -import type { TaskRunContext } from "../tasks"; -import taskHandler, { wrapTaskContext } from "../tasks"; import { randomUUID } from "crypto"; import { fuzzy } from "fast-fuzzy"; -import { logger } from "~/server/internal/logging"; -import { createGameImportTaskId } from "../library"; -import type { GameTagModel } from "~/prisma/client/models"; +import { logger } from "~~/server/internal/logging"; +import libraryManager, { createGameImportTaskId } from "../library"; +import type { GameTagModel } from "~~/prisma/client/models"; +import type { TaskRunContext} from "../tasks/utils"; +import { wrapTaskContext } from "../tasks/utils"; +import taskHandler from "../tasks"; export class MissingMetadataProviderConfig extends Error { private providerName: string; @@ -175,15 +176,8 @@ export class MetadataHandler { if (!provider) throw new Error(`Invalid metadata provider for ID "${result.sourceId}"`); - const existing = await prisma.game.findUnique({ - where: { - metadataKey: { - metadataSource: provider.source(), - metadataId: result.id, - }, - }, - }); - if (existing) return undefined; + const okay = await libraryManager.checkUnimportedGamePath(libraryId, libraryPath); + if (!okay) return undefined; const gameId = randomUUID(); diff --git a/server/internal/metadata/manual.ts b/server/internal/metadata/manual.ts index 4dde413..1e1516e 100644 --- a/server/internal/metadata/manual.ts +++ b/server/internal/metadata/manual.ts @@ -1,4 +1,4 @@ -import { MetadataSource } from "~/prisma/client/enums"; +import { MetadataSource } from "~~/prisma/client/enums"; import type { MetadataProvider } from "."; import type { _FetchGameMetadataParams, diff --git a/server/internal/metadata/pcgamingwiki.ts b/server/internal/metadata/pcgamingwiki.ts index ab965bc..13d7a9b 100644 --- a/server/internal/metadata/pcgamingwiki.ts +++ b/server/internal/metadata/pcgamingwiki.ts @@ -1,5 +1,5 @@ -import type { CompanyModel } from "~/prisma/client/models"; -import { MetadataSource } from "~/prisma/client/enums"; +import type { CompanyModel } from "~~/prisma/client/models"; +import { MetadataSource } from "~~/prisma/client/enums"; import type { MetadataProvider } from "."; import type { GameMetadataSearchResult, @@ -15,8 +15,8 @@ import * as jdenticon from "jdenticon"; import { DateTime } from "luxon"; import * as cheerio from "cheerio"; import { type } from "arktype"; -import type { TaskRunContext } from "../tasks"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; +import type { TaskRunContext } from "../tasks/utils"; interface PCGamingWikiParseRawPage { parse: { @@ -200,7 +200,7 @@ export class PCGamingWikiProvider implements MetadataProvider { return url.pathname.replace("/games/", "").replace(/\/$/, ""); } default: { - logger.warn("Pcgamingwiki, unknown host", url.hostname); + logger.warn("Pcgamingwiki, unknown host: %s", url.hostname); return undefined; } } @@ -234,7 +234,7 @@ export class PCGamingWikiProvider implements MetadataProvider { }); if (ratingObj instanceof type.errors) { logger.info( - "pcgamingwiki: failed to properly get review rating", + "pcgamingwiki: failed to properly get review rating: %s", ratingObj.summary, ); return undefined; diff --git a/server/internal/metadata/steam.ts b/server/internal/metadata/steam.ts index 5cee2a9..8eec807 100644 --- a/server/internal/metadata/steam.ts +++ b/server/internal/metadata/steam.ts @@ -1,4 +1,4 @@ -import { MetadataSource } from "~/prisma/client/enums"; +import { MetadataSource } from "~~/prisma/client/enums"; import type { MetadataProvider } from "."; import type { GameMetadataSearchResult, @@ -8,9 +8,9 @@ import type { CompanyMetadata, GameMetadataRating, } from "./types"; -import type { TaskRunContext } from "../tasks"; import axios from "axios"; import * as jdenticon from "jdenticon"; +import type { TaskRunContext } from "../tasks/utils"; /** * Note: The Steam API is largely undocumented. diff --git a/server/internal/metadata/types.d.ts b/server/internal/metadata/types.d.ts index b5286a7..837e1b3 100644 --- a/server/internal/metadata/types.d.ts +++ b/server/internal/metadata/types.d.ts @@ -1,4 +1,4 @@ -import type { Company, GameRating } from "~/prisma/client"; +import type { Company, GameRating } from "~~/prisma/client"; import type { TransactionDataType } from "../objects/transactional"; import type { ObjectReference } from "../objects/objectHandler"; diff --git a/server/internal/notifications/index.ts b/server/internal/notifications/index.ts index 5585087..7372977 100644 --- a/server/internal/notifications/index.ts +++ b/server/internal/notifications/index.ts @@ -6,7 +6,7 @@ Design goals: 2. Real-time; use websocket listeners to keep clients up-to-date */ -import type { NotificationModel } from "~/prisma/client/models"; +import type { NotificationModel } from "~~/prisma/client/models"; import prisma from "../db/database"; import type { GlobalACL } from "../acls"; diff --git a/server/internal/objects/fsBackend.ts b/server/internal/objects/fsBackend.ts index aedab6a..b0297e8 100644 --- a/server/internal/objects/fsBackend.ts +++ b/server/internal/objects/fsBackend.ts @@ -9,7 +9,7 @@ import prisma from "../db/database"; import cacheHandler from "../cache"; import { systemConfig } from "../config/sys-conf"; import { type } from "arktype"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; import type pino from "pino"; export class FsObjectBackend extends ObjectBackend { @@ -123,7 +123,7 @@ export class FsObjectBackend extends ObjectBackend { const metadataRaw = JSON.parse(fs.readFileSync(metadataPath, "utf-8")); const metadata = objectMetadata(metadataRaw); if (metadata instanceof type.errors) { - logger.error("FsObjectBackend#fetchMetadata", metadata.summary); + logger.error("FsObjectBackend#fetchMetadata: %s", metadata.summary); return undefined; } await this.metadataCache.set(id, metadata); @@ -194,11 +194,13 @@ export class FsObjectBackend extends ObjectBackend { try { fs.rmSync(filePath); cleanupLogger.info( - `[FsObjectBackend#cleanupMetadata]: Removed ${file}`, + `[FsObjectBackend#cleanupMetadata]: Removed %s`, + file ); } catch (error) { cleanupLogger.error( - `[FsObjectBackend#cleanupMetadata]: Failed to remove ${file}`, + `[FsObjectBackend#cleanupMetadata]: Failed to remove %s: %s`, + file, error, ); } diff --git a/server/internal/objects/objectHandler.ts b/server/internal/objects/objectHandler.ts index 21ec619..7662ffb 100644 --- a/server/internal/objects/objectHandler.ts +++ b/server/internal/objects/objectHandler.ts @@ -32,15 +32,12 @@ export const objectMetadata = type({ }); export type ObjectMetadata = typeof objectMetadata.infer; -export enum ObjectPermission { - Read = "read", - Write = "write", - Delete = "delete", -} +export const ObjectPermissions = ["read", "write", "delete"] as const; +export type ObjectPermission = (typeof ObjectPermissions)[number]; export const ObjectPermissionPriority: Array = [ - ObjectPermission.Read, - ObjectPermission.Write, - ObjectPermission.Delete, + "read", + "write", + "delete", ]; export type Object = { mime: string; data: Source }; diff --git a/server/internal/objects/transactional.ts b/server/internal/objects/transactional.ts index bac9475..cec3756 100644 --- a/server/internal/objects/transactional.ts +++ b/server/internal/objects/transactional.ts @@ -5,7 +5,7 @@ This is used as a utility in metadata handling, so we only fetch the objects if import type { Readable } from "stream"; import { randomUUID } from "node:crypto"; import objectHandler from "."; -import type { TaskRunContext } from "../tasks"; +import type { TaskRunContext } from "../tasks/utils"; export type TransactionDataType = string | Readable | Buffer; type TransactionTable = Map; // ID to data diff --git a/server/internal/platform/link.ts b/server/internal/platform/link.ts new file mode 100644 index 0000000..d71a06c --- /dev/null +++ b/server/internal/platform/link.ts @@ -0,0 +1,47 @@ +import { HardwarePlatform } from "~~/prisma/client/enums"; +import prisma from "../db/database"; +import type { PlatformLink } from "~~/prisma/client/client"; + +export async function convertIDsToPlatforms(platformIDs: string[]) { + const userPlatforms = await prisma.userPlatform.findMany({ + where: { + id: { + in: platformIDs, + }, + }, + }); + + const platforms = platformIDs.map( + (e) => userPlatforms.find((v) => v.id === e) ?? (e as HardwarePlatform), + ); + + return platforms; +} + +export async function convertIDToLink( + id: string, +): Promise { + const link = await prisma.platformLink.findUnique({ + where: { id }, + }); + if (link) return link; + + if (HardwarePlatform[id as HardwarePlatform]) { + return await prisma.platformLink.create({ + data: { + id, + }, + }); + } + + const userPlatform = await prisma.userPlatform.findUnique({ + where: { id }, + }); + + if (!userPlatform) return undefined; + return await prisma.platformLink.create({ + data: { + id, + }, + }); +} diff --git a/server/internal/saves/index.ts b/server/internal/saves/index.ts index 7b76f90..a53a7c3 100644 --- a/server/internal/saves/index.ts +++ b/server/internal/saves/index.ts @@ -32,7 +32,7 @@ class SaveManager { }, }); if (!save) - throw createError({ statusCode: 404, statusMessage: "Save not found" }); + throw createError({ statusCode: 404, message: "Save not found" }); const newSaveObjectId = randomUUID(); const newSaveStream = await objectHandler.createWithStream( @@ -43,7 +43,7 @@ class SaveManager { if (!newSaveStream) throw createError({ statusCode: 500, - statusMessage: "Failed to create writing stream to storage backend.", + message: "Failed to create writing stream to storage backend.", }); let hash: string | undefined; @@ -64,7 +64,7 @@ class SaveManager { await objectHandler.deleteAsSystem(newSaveObjectId); throw createError({ statusCode: 500, - statusMessage: "Hash failed to generate", + message: "Hash failed to generate", }); } diff --git a/server/internal/screenshots/index.ts b/server/internal/screenshots/index.ts index b41ac03..891d475 100644 --- a/server/internal/screenshots/index.ts +++ b/server/internal/screenshots/index.ts @@ -80,7 +80,7 @@ class ScreenshotManager { if (!saveStream) throw createError({ statusCode: 500, - statusMessage: "Failed to create writing stream to storage backend.", + message: "Failed to create writing stream to storage backend.", }); // pipe into object store diff --git a/server/internal/session/index.ts b/server/internal/session/index.ts index fa56108..eb9cb0b 100644 --- a/server/internal/session/index.ts +++ b/server/internal/session/index.ts @@ -2,7 +2,7 @@ import type { H3Event } from "h3"; import type { Session, SessionProvider } from "./types"; import { randomUUID } from "node:crypto"; import { parse as parseCookies } from "cookie-es"; -import type { MinimumRequestObject } from "~/server/h3"; +import type { MinimumRequestObject } from "~~/server/h3"; import type { DurationLike } from "luxon"; import { DateTime } from "luxon"; import createDBSessionHandler from "./db"; diff --git a/server/internal/tasks/group.ts b/server/internal/tasks/group.ts index f914272..184e3da 100644 --- a/server/internal/tasks/group.ts +++ b/server/internal/tasks/group.ts @@ -1,22 +1,32 @@ -export const taskGroups = { - "cleanup:invitations": { - concurrency: false, - }, - "cleanup:objects": { - concurrency: false, - }, - "cleanup:sessions": { - concurrency: false, - }, - "check:update": { - concurrency: false, - }, - "import:game": { - concurrency: true, - }, - debug: { - concurrency: true, - }, -} as const; +export const TASK_GROUPS = [ + "cleanup:invitations", + "cleanup:objects", + "cleanup:sessions", + "check:update", + "import:game", + "import:version", +] as const; -export type TaskGroup = keyof typeof taskGroups; +export type TaskGroup = (typeof TASK_GROUPS)[number]; + +export const TASK_GROUP_CONFIG: { [key in TaskGroup]: { concurrency: boolean } } = + { + "cleanup:invitations": { + concurrency: false + }, + "cleanup:objects": { + concurrency: false + }, + "cleanup:sessions": { + concurrency: false + }, + "check:update": { + concurrency: false + }, + "import:game": { + concurrency: true + }, + "import:version": { + concurrency: true + } + }; diff --git a/server/internal/tasks/index.ts b/server/internal/tasks/index.ts index 54433a9..6b8b209 100644 --- a/server/internal/tasks/index.ts +++ b/server/internal/tasks/index.ts @@ -1,5 +1,5 @@ import droplet from "@drop-oss/droplet"; -import type { MinimumRequestObject } from "~/server/h3"; +import type { MinimumRequestObject } from "~~/server/h3"; import type { GlobalACL } from "../acls"; import aclManager from "../acls"; @@ -7,12 +7,13 @@ import cleanupInvites from "./registry/invitations"; import cleanupSessions from "./registry/sessions"; import checkUpdate from "./registry/update"; import cleanupObjects from "./registry/objects"; -import { taskGroups, type TaskGroup } from "./group"; +import { TASK_GROUP_CONFIG, type TaskGroup } from "./group"; import prisma from "../db/database"; import { type } from "arktype"; import pino from "pino"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; import { Writable } from "node:stream"; +import type { TaskRunContext } from "./utils"; // a task that has been run type FinishedTask = { @@ -53,7 +54,6 @@ class TaskHandler { "cleanup:invitations", "cleanup:sessions", "check:update", - "debug", ]; private weeklyScheduledTasks: TaskGroup[] = ["cleanup:objects"]; @@ -82,7 +82,7 @@ class TaskHandler { let logOffset: number = 0; // if taskgroup disallows concurrency - if (!taskGroups[task.taskGroup].concurrency) { + if (!TASK_GROUP_CONFIG[task.taskGroup].concurrency) { for (const existingTask of this.taskPool.values()) { // if a task is already running, we don't want to start another if (existingTask.taskGroup === task.taskGroup) { @@ -149,7 +149,7 @@ class TaskHandler { } } catch (e) { // fallback: ignore or log error - logger.error("Failed to parse log chunk", { + logger.error("Failed to parse log chunk %s", { error: e, chunk: chunk, }); @@ -177,7 +177,7 @@ class TaskHandler { const progress = (progress: number) => { if (progress < 0 || progress > 100) { - logger.error("Progress must be between 0 and 100", { progress }); + logger.error("Progress must be between 0 and 100, actually %d", progress); return; } const taskEntry = this.taskPool.get(task.id); @@ -412,36 +412,6 @@ class TaskHandler { } } -export type TaskRunContext = { - progress: (progress: number) => void; - logger: typeof logger; -}; - -export function wrapTaskContext( - context: TaskRunContext, - options: { min: number; max: number; prefix: string }, -): TaskRunContext { - const child = context.logger.child({ - prefix: options.prefix, - }); - - return { - progress(progress) { - if (progress > 100 || progress < 0) { - logger.warn("[wrapTaskContext] progress must be between 0 and 100"); - } - - // I was too tired to figure this out - // https://stackoverflow.com/a/929107 - const oldRange = 100; - const newRange = options.max - options.min; - const adjustedProgress = (progress * newRange) / oldRange + options.min; - return context.progress(adjustedProgress); - }, - logger: child, - }; -} - export interface Task { id: string; taskGroup: TaskGroup; @@ -484,31 +454,6 @@ export const TaskLog = type({ level: "string", }); -// /** -// * Create a log message with a timestamp in the format YYYY-MM-DD HH:mm:ss.SSS UTC -// * @param message -// * @returns -// */ -// function msgWithTimestamp(message: string): string { -// const now = new Date(); - -// const pad = (n: number, width = 2) => n.toString().padStart(width, "0"); - -// const year = now.getUTCFullYear(); -// const month = pad(now.getUTCMonth() + 1); -// const day = pad(now.getUTCDate()); - -// const hours = pad(now.getUTCHours()); -// const minutes = pad(now.getUTCMinutes()); -// const seconds = pad(now.getUTCSeconds()); -// const milliseconds = pad(now.getUTCMilliseconds(), 3); - -// const log: typeof TaskLog.infer = { -// timestamp: `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds} UTC`, -// message, -// }; -// return JSON.stringify(log); -// } export function defineDropTask(buildTask: BuildTask): DropTask { return { diff --git a/server/internal/tasks/registry/debug.ts b/server/internal/tasks/registry/debug.ts index 9cd8a4a..faf6f8f 100644 --- a/server/internal/tasks/registry/debug.ts +++ b/server/internal/tasks/registry/debug.ts @@ -1,5 +1,6 @@ -import { defineDropTask } from ".."; +// import { defineDropTask } from ".."; +/* export default defineDropTask({ buildId: () => `debug:${new Date().toISOString()}`, name: "Debug Task", @@ -16,3 +17,4 @@ export default defineDropTask({ } }, }); +*/ diff --git a/server/internal/tasks/registry/invitations.ts b/server/internal/tasks/registry/invitations.ts index a247f7b..d8df213 100644 --- a/server/internal/tasks/registry/invitations.ts +++ b/server/internal/tasks/registry/invitations.ts @@ -1,4 +1,4 @@ -import prisma from "~/server/internal/db/database"; +import prisma from "~~/server/internal/db/database"; import { defineDropTask } from ".."; export default defineDropTask({ diff --git a/server/internal/tasks/registry/objects.ts b/server/internal/tasks/registry/objects.ts index 63a5e71..50724fb 100644 --- a/server/internal/tasks/registry/objects.ts +++ b/server/internal/tasks/registry/objects.ts @@ -1,5 +1,5 @@ -import prisma from "~/server/internal/db/database"; -import objectHandler from "~/server/internal/objects"; +import prisma from "~~/server/internal/db/database"; +import objectHandler from "~~/server/internal/objects"; import { defineDropTask } from ".."; type FieldReferenceMap = { diff --git a/server/internal/tasks/registry/sessions.ts b/server/internal/tasks/registry/sessions.ts index 6839829..deb6d4a 100644 --- a/server/internal/tasks/registry/sessions.ts +++ b/server/internal/tasks/registry/sessions.ts @@ -1,4 +1,4 @@ -import sessionHandler from "~/server/internal/session"; +import sessionHandler from "~~/server/internal/session"; import { defineDropTask } from ".."; export default defineDropTask({ diff --git a/server/internal/tasks/registry/update.ts b/server/internal/tasks/registry/update.ts index 452fd19..16e3cfb 100644 --- a/server/internal/tasks/registry/update.ts +++ b/server/internal/tasks/registry/update.ts @@ -49,7 +49,7 @@ export default defineDropTask({ // if response failed somehow if (!response.ok) { - logger.info("Failed to check for update ", { + logger.info("Failed to check for update: %s", { status: response.status, body: response.body, }); diff --git a/server/internal/tasks/utils.ts b/server/internal/tasks/utils.ts new file mode 100644 index 0000000..87eb442 --- /dev/null +++ b/server/internal/tasks/utils.ts @@ -0,0 +1,58 @@ +import { logger } from "../logging"; + +export type TaskRunContext = { + progress: (progress: number) => void; + logger: typeof logger; +}; + +export function wrapTaskContext( + context: TaskRunContext, + options: { min: number; max: number; prefix: string }, +): TaskRunContext { + const child = context.logger.child({ + prefix: options.prefix, + }); + + return { + progress(progress) { + if (progress > 100 || progress < 0) { + logger.warn("[wrapTaskContext] progress must be between 0 and 100"); + } + + // I was too tired to figure this out + // https://stackoverflow.com/a/929107 + const oldRange = 100; + const newRange = options.max - options.min; + const adjustedProgress = (progress * newRange) / oldRange + options.min; + return context.progress(adjustedProgress); + }, + logger: child, + }; +} + + +// /** +// * Create a log message with a timestamp in the format YYYY-MM-DD HH:mm:ss.SSS UTC +// * @param message +// * @returns +// */ +// function msgWithTimestamp(message: string): string { +// const now = new Date(); + +// const pad = (n: number, width = 2) => n.toString().padStart(width, "0"); + +// const year = now.getUTCFullYear(); +// const month = pad(now.getUTCMonth() + 1); +// const day = pad(now.getUTCDate()); + +// const hours = pad(now.getUTCHours()); +// const minutes = pad(now.getUTCMinutes()); +// const seconds = pad(now.getUTCSeconds()); +// const milliseconds = pad(now.getUTCMilliseconds(), 3); + +// const log: typeof TaskLog.infer = { +// timestamp: `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds} UTC`, +// message, +// }; +// return JSON.stringify(log); +// } diff --git a/server/internal/utils/handlefileupload.ts b/server/internal/utils/handlefileupload.ts index 4e36c44..efef965 100644 --- a/server/internal/utils/handlefileupload.ts +++ b/server/internal/utils/handlefileupload.ts @@ -1,18 +1,27 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import type { EventHandlerRequest, H3Event } from "h3"; -import type { Dump, Pull } from "../objects/transactional"; +import type { Dump, Pull, Register } from "../objects/transactional"; import { ObjectTransactionalHandler } from "../objects/transactional"; +type RecursiveType = + | { [key: string]: RecursiveType } + | string + | number + | Array; + export async function handleFileUpload( h3: H3Event, metadata: { [key: string]: string }, permissions: Array, max = -1, -): Promise<[string[], { [key: string]: string }, Pull, Dump] | undefined> { +): Promise< + [string[], { [key: string]: RecursiveType }, Pull, Dump, Register] | undefined +> { const formData = await readMultipartFormData(h3); if (!formData) return undefined; const transactionalHandler = new ObjectTransactionalHandler(); const [add, pull, dump] = transactionalHandler.new(metadata, permissions); - const options: { [key: string]: string } = {}; + const options: any = {}; const ids = []; for (const entry of formData) { @@ -25,8 +34,15 @@ export async function handleFileUpload( } if (!entry.name) continue; - options[entry.name] = entry.data.toString("utf-8"); + const path = entry.name.split("."); + let v = options; + for (const pathPart of path.slice(0, -1)) { + (v as any)[pathPart] ??= {}; + v = (v as any)[pathPart]; + } + + (v as any)[path.at(-1)!] = entry.data.toString("utf-8"); } - return [ids, options, pull, dump]; + return [ids, options, pull, dump, add]; } diff --git a/server/internal/utils/parseplatform.ts b/server/internal/utils/parseplatform.ts index 5a00e95..fdea9e1 100644 --- a/server/internal/utils/parseplatform.ts +++ b/server/internal/utils/parseplatform.ts @@ -1,14 +1,14 @@ -import { Platform } from "~/prisma/client/enums"; +import { HardwarePlatform } from "~~/prisma/client/enums"; export function parsePlatform(platform: string) { switch (platform.toLowerCase()) { case "linux": - return Platform.Linux; + return HardwarePlatform.Linux; case "windows": - return Platform.Windows; + return HardwarePlatform.Windows; case "mac": case "macos": - return Platform.macOS; + return HardwarePlatform.macOS; } return undefined; diff --git a/server/internal/utils/prioritylist.ts b/server/internal/utils/prioritylist.ts index 26be822..347d689 100644 --- a/server/internal/utils/prioritylist.ts +++ b/server/internal/utils/prioritylist.ts @@ -80,11 +80,12 @@ export class PriorityListIndexed extends PriorityList { override pop(position?: number): PriorityTagged { const value = super.pop(position); + if(!value) return undefined!; const index = this.getIndex(value.object); this.indexMap.delete(index); - return value; + return value!; } get(index: string) { diff --git a/server/plugins/01.system-init.ts b/server/plugins/01.system-init.ts index edffdcc..708812a 100644 --- a/server/plugins/01.system-init.ts +++ b/server/plugins/01.system-init.ts @@ -1,4 +1,4 @@ -import prisma from "~/server/internal/db/database"; +import prisma from "~~/server/internal/db/database"; export default defineNitroPlugin(async (_nitro) => { // Ensure system user exists diff --git a/server/plugins/02.setup-admin.ts b/server/plugins/02.setup-admin.ts index 25a8704..8babe35 100644 --- a/server/plugins/02.setup-admin.ts +++ b/server/plugins/02.setup-admin.ts @@ -1,5 +1,5 @@ -import { APITokenMode } from "~/prisma/client/enums"; -import prisma from "~/server/internal/db/database"; +import { APITokenMode } from "~~/prisma/client/enums"; +import prisma from "~~/server/internal/db/database"; import { systemConfig } from "../internal/config/sys-conf"; import { logger } from "../internal/logging"; diff --git a/server/plugins/03.metadata-init.ts b/server/plugins/03.metadata-init.ts index 7a289ca..a8709a2 100644 --- a/server/plugins/03.metadata-init.ts +++ b/server/plugins/03.metadata-init.ts @@ -5,8 +5,8 @@ import { GiantBombProvider } from "../internal/metadata/giantbomb"; import { IGDBProvider } from "../internal/metadata/igdb"; import { ManualMetadataProvider } from "../internal/metadata/manual"; import { PCGamingWikiProvider } from "../internal/metadata/pcgamingwiki"; +import { logger } from "../internal/logging"; import { SteamProvider } from "../internal/metadata/steam"; -import { logger } from "~/server/internal/logging"; export default defineNitroPlugin(async (_nitro) => { const metadataProviders = [ diff --git a/server/plugins/04.auth-init.ts b/server/plugins/04.auth-init.ts index a2f3e5b..4bea184 100644 --- a/server/plugins/04.auth-init.ts +++ b/server/plugins/04.auth-init.ts @@ -1,4 +1,4 @@ -import authManager from "~/server/internal/auth"; +import authManager from "~~/server/internal/auth"; export default defineNitroPlugin(async () => { await authManager.init(); diff --git a/server/plugins/05.library-init.ts b/server/plugins/05.library-init.ts index 9891b51..8c8e761 100644 --- a/server/plugins/05.library-init.ts +++ b/server/plugins/05.library-init.ts @@ -1,13 +1,11 @@ -import { LibraryBackend } from "~/prisma/client/enums"; +import type { LibraryBackend } from "~~/prisma/client/enums"; import prisma from "../internal/db/database"; import type { JsonValue } from "@prisma/client/runtime/library"; import type { LibraryProvider } from "../internal/library/provider"; -import type { FilesystemProviderConfig } from "../internal/library/providers/filesystem"; import { FilesystemProvider } from "../internal/library/providers/filesystem"; import libraryManager from "../internal/library"; -import path from "path"; import { FlatFilesystemProvider } from "../internal/library/providers/flat"; -import { logger } from "~/server/internal/logging"; +import { logger } from "~~/server/internal/logging"; export const libraryConstructors: { [key in LibraryBackend]: ( @@ -33,42 +31,6 @@ export default defineNitroPlugin(async () => { let successes = 0; const libraries = await prisma.library.findMany({}); - // Add migration handler - const legacyPath = process.env.LIBRARY; - if (legacyPath && libraries.length == 0) { - const options: typeof FilesystemProviderConfig.infer = { - baseDir: path.resolve(legacyPath), - }; - - const library = await prisma.library.create({ - data: { - name: "Auto-created", - backend: LibraryBackend.Filesystem, - options, - }, - }); - - libraries.push(library); - - // Update all existing games - await prisma.game.updateMany({ - where: { - libraryId: null, - }, - data: { - libraryId: library.id, - }, - }); - } - - // Delete all games that don't have a library provider after the legacy handler - // (leftover from a bug) - await prisma.game.deleteMany({ - where: { - libraryId: null, - }, - }); - for (const library of libraries) { const constructor = libraryConstructors[library.backend]; try { diff --git a/server/routes/auth/callback/oidc.get.ts b/server/routes/auth/callback/oidc.get.ts index 5aba8fd..5a9fb63 100644 --- a/server/routes/auth/callback/oidc.get.ts +++ b/server/routes/auth/callback/oidc.get.ts @@ -1,5 +1,5 @@ -import sessionHandler from "~/server/internal/session"; -import authManager from "~/server/internal/auth"; +import sessionHandler from "~~/server/internal/session"; +import authManager from "~~/server/internal/auth"; defineRouteMeta({ openAPI: { @@ -20,14 +20,14 @@ export default defineEventHandler(async (h3) => { if (!code) throw createError({ statusCode: 400, - statusMessage: "No code in query params.", + message: "No code in query params.", }); const state = query.state?.toString(); if (!state) throw createError({ statusCode: 400, - statusMessage: "No state in query params.", + message: "No state in query params.", }); const result = await manager.authorize(code, state); @@ -35,7 +35,7 @@ export default defineEventHandler(async (h3) => { if (typeof result === "string") throw createError({ statusCode: 403, - statusMessage: `Failed to sign in: "${result}". Please try again.`, + message: `Failed to sign in: "${result}". Please try again.`, }); await sessionHandler.signin(h3, result.user.id, true); diff --git a/server/routes/auth/oidc.get.ts b/server/routes/auth/oidc.get.ts index 8ba7c74..d55efbe 100644 --- a/server/routes/auth/oidc.get.ts +++ b/server/routes/auth/oidc.get.ts @@ -1,4 +1,4 @@ -import authManager from "~/server/internal/auth"; +import authManager from "~~/server/internal/auth"; defineRouteMeta({ openAPI: { diff --git a/server/tasks/dailyTasks.ts b/server/tasks/dailyTasks.ts index e36735c..3715239 100644 --- a/server/tasks/dailyTasks.ts +++ b/server/tasks/dailyTasks.ts @@ -1,4 +1,4 @@ -import taskHandler from "~/server/internal/tasks"; +import taskHandler from "~~/server/internal/tasks"; export default defineTask({ meta: { diff --git a/server/tsconfig.json b/server/tsconfig.json deleted file mode 100644 index ca5c731..0000000 --- a/server/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../.nuxt/tsconfig.server.json", - "compilerOptions": { - "exactOptionalPropertyTypes": true - } -} diff --git a/tsconfig.json b/tsconfig.json index 71aa8b8..cae87c0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,9 @@ { - // https://nuxt.com/docs/guide/concepts/typescript - "extends": "./.nuxt/tsconfig.json", - "compilerOptions": { - "exactOptionalPropertyTypes": false - } + "files": [], + "references": [ + { "path": "./.nuxt/tsconfig.app.json" }, + { "path": "./.nuxt/tsconfig.server.json" }, + { "path": "./.nuxt/tsconfig.shared.json" }, + { "path": "./.nuxt/tsconfig.node.json" } + ] }