From d1bc65c266183f12e400a3ab013ba369ba9aa3da Mon Sep 17 00:00:00 2001
From: Geometrically <18202329+Geometrically@users.noreply.github.com>
Date: Tue, 9 Jul 2024 15:17:38 -0700
Subject: [PATCH] Monorepo missing features (#1273)
* fix tauri config
* fix package patch
* regen pnpm lock
* use new workflow
* New GH actions
* Update lockfile
* update scripts
* Fix build script
* Fix missing deps
* Fix assets eslint
* Update libraries lint
* Fix all lint configs
* update lockfile
* add fmt + clippy fails
* Separate App Tauri portion
* fix app features
* Fix lints
* install tauri cli
* update lockfile
* corepack, fix lints
* add store path
* fix unused import
* Fix tests
* Issue templates + port over tauri release
* fix actions
* fix before build command
* Add X86 target
* Update build matrix
* finalize actions
* make debug build smaller
* Use debug build to make cache smaller
* dummy commit
* change proj name
* update file name
* Use release builds for less space use
* Remove rust cache
* Readd for app build
* add merge queue trigger
---
.cargo/config.toml | 3 -
.github/ISSUE_TEMPLATE/1-app-bug.yml | 59 +
.github/ISSUE_TEMPLATE/2-web-bug.yml | 52 +
.github/ISSUE_TEMPLATE/3-api-bug.yml | 41 +
.github/ISSUE_TEMPLATE/4-feature-request.yml | 46 +
.github/ISSUE_TEMPLATE/config.yml | 14 +
.github/workflows/app-release.yml | 127 ++
.github/workflows/ci.yml | 85 +-
.github/workflows/frontend-pages.yml | 20 +
.vscode/extensions.json | 2 +-
.vscode/settings.json | 4 +
Cargo.lock | 18 -
Cargo.toml | 13 +-
apps/app-frontend/.env | 3 +
apps/app-frontend/.eslintrc.cjs | 4 +
apps/app-frontend/.prettierignore | 1 +
apps/{app => app-frontend}/COPYING.md | 2 +-
apps/app-frontend/LICENSE | 674 +++++++
apps/{app => app-frontend}/index.html | 0
apps/app-frontend/package.json | 42 +
apps/{app => app-frontend}/src/App.vue | 0
.../src/assets/external/atlauncher.svg | 0
.../src/assets/external/bmac.svg | 0
.../src/assets/external/discord.svg | 0
.../src/assets/external/gdlauncher.png | Bin
.../src/assets/external/github.svg | 0
.../src/assets/external/gitlab.svg | 0
.../src/assets/external/google.svg | 0
.../src/assets/external/index.js | 0
.../src/assets/external/kofi.svg | 0
.../src/assets/external/mastodon.svg | 0
.../src/assets/external/microsoft.svg | 0
.../src/assets/external/multimc.webp | Bin
.../src/assets/external/opencollective.svg | 0
.../src/assets/external/patreon.svg | 0
.../src/assets/external/paypal.svg | 0
.../src/assets/external/prism.svg | 0
.../src/assets/external/reddit.svg | 0
.../src/assets/external/steam.svg | 0
.../src/assets/external/twitter.svg | 0
.../src/assets/icons/add-project.svg | 0
.../src/assets/icons/arrow-left-right.svg | 0
.../src/assets/icons/bug.svg | 0
.../src/assets/icons/index.js | 0
.../src/assets/icons/maximize.svg | 0
.../src/assets/icons/menu.svg | 0
.../src/assets/icons/messages-square.svg | 0
.../src/assets/icons/milestone.svg | 0
.../src/assets/icons/minimize.svg | 0
.../src/assets/icons/more.svg | 0
.../src/assets/icons/new-instance.svg | 0
.../src/assets/icons/package.svg | 0
.../src/assets/icons/server.svg | 0
.../src/assets/icons/text-cursor-input.svg | 0
.../src/assets/icons/toggle.svg | 0
.../src/assets/profile_icon.png | Bin
.../src/assets/stylesheets/global.scss | 0
.../src/assets/stylesheets/macFix.css | 0
.../src/components/GridDisplay.vue | 0
.../src/components/RowDisplay.vue | 0
.../components/modrinth-loading-indicator.js | 0
.../src/components/ui/AccountsCard.vue | 0
.../src/components/ui/Breadcrumbs.vue | 0
.../src/components/ui/ContextMenu.vue | 0
.../src/components/ui/ErrorModal.vue | 0
.../src/components/ui/ExportModal.vue | 0
.../ui/IncompatibilityWarningModal.vue | 0
.../src/components/ui/InstallConfirmModal.vue | 0
.../src/components/ui/Instance.vue | 0
.../components/ui/InstanceCreationModal.vue | 0
.../src/components/ui/JavaDetectionModal.vue | 0
.../src/components/ui/JavaSelector.vue | 0
.../src/components/ui/ModInstallModal.vue | 0
.../src/components/ui/ModpackVersionModal.vue | 0
.../src/components/ui/ProgressBar.vue | 0
.../src/components/ui/ProjectCard.vue | 0
.../src/components/ui/RunningAppBar.vue | 0
.../src/components/ui/SearchCard.vue | 0
.../src/components/ui/SplashScreen.vue | 0
.../src/components/ui/URLConfirmModal.vue | 0
.../components/ui/tutorial/GalleryImage.vue | 0
.../src/components/ui/tutorial/LoginCard.vue | 0
.../ui/tutorial/ModrinthLoginScreen.vue | 0
.../ui/tutorial/OnboardingScreen.vue | 0
.../components/ui/tutorial/StickyTitleBar.vue | 0
.../{app => app-frontend}/src/helpers/auth.js | 0
.../src/helpers/events.js | 0
.../src/helpers/fetch.js | 0
.../src/helpers/import.js | 0
apps/{app => app-frontend}/src/helpers/jre.js | 0
.../{app => app-frontend}/src/helpers/logs.js | 0
.../src/helpers/metadata.js | 0
.../src/helpers/mixpanel.js | 0
.../src/helpers/mr_auth.js | 0
.../{app => app-frontend}/src/helpers/pack.js | 0
.../src/helpers/process.js | 0
.../src/helpers/profile.js | 0
.../src/helpers/settings.js | 0
.../src/helpers/state.js | 0
.../{app => app-frontend}/src/helpers/tags.js | 0
.../src/helpers/utils.js | 0
apps/{app => app-frontend}/src/main.js | 0
.../src/mixins/macCssFix.js | 0
.../src/pages/Browse.vue | 0
.../{app => app-frontend}/src/pages/Index.vue | 0
.../src/pages/Library.vue | 0
.../src/pages/Settings.vue | 0
apps/{app => app-frontend}/src/pages/index.js | 0
.../src/pages/instance/Index.vue | 0
.../src/pages/instance/Logs.vue | 0
.../src/pages/instance/Mods.vue | 0
.../src/pages/instance/Options.vue | 0
.../src/pages/instance/index.js | 0
.../src/pages/project/Changelog.vue | 0
.../src/pages/project/Description.vue | 0
.../src/pages/project/Gallery.vue | 0
.../src/pages/project/Index.vue | 0
.../src/pages/project/Version.vue | 0
.../src/pages/project/Versions.vue | 0
.../src/pages/project/index.js | 0
apps/{app => app-frontend}/src/routes.js | 6 +-
.../src/store/breadcrumbs.js | 0
apps/{app => app-frontend}/src/store/error.js | 0
.../src/store/loading.js | 0
.../src/store/notifications.js | 0
apps/{app => app-frontend}/src/store/state.js | 0
apps/{app => app-frontend}/src/store/theme.js | 0
apps/{app => app-frontend}/tsconfig.json | 0
apps/{app => app-frontend}/vite.config.ts | 7 +-
apps/app-playground/package.json | 10 +
apps/app/.eslintrc.json | 21 -
apps/app/{src-tauri => }/.gitignore | 0
apps/app/{src-tauri => }/App.entitlements | 0
apps/app/{src-tauri => }/Cargo.toml | 4 +-
apps/app/{src-tauri => }/Info.plist | 0
apps/app/README.md | 2 +-
apps/app/{src-tauri => }/build.rs | 0
apps/app/{src-tauri => }/icons/128x128.png | Bin
apps/app/{src-tauri => }/icons/128x128@2x.png | Bin
.../icons/Square107x107Logo.png | Bin
.../icons/Square142x142Logo.png | Bin
.../icons/Square150x150Logo.png | Bin
.../icons/Square284x284Logo.png | Bin
.../{src-tauri => }/icons/Square30x30Logo.png | Bin
.../icons/Square310x310Logo.png | Bin
.../{src-tauri => }/icons/Square44x44Logo.png | Bin
.../{src-tauri => }/icons/Square71x71Logo.png | Bin
.../{src-tauri => }/icons/Square89x89Logo.png | Bin
apps/app/{src-tauri => }/icons/StoreLogo.png | Bin
apps/app/{src-tauri => }/icons/favicon.ico | Bin
apps/app/{src-tauri => }/icons/icon.icns | Bin
apps/app/{src-tauri => }/icons/icon.ico | Bin
apps/app/{src-tauri => }/icons/icon.png | Bin
apps/app/{src-tauri => }/msi/main.wxs | 0
apps/app/package.json | 52 +-
apps/app/{src-tauri => }/src/api/auth.rs | 0
apps/app/{src-tauri => }/src/api/import.rs | 0
apps/app/{src-tauri => }/src/api/jre.rs | 0
apps/app/{src-tauri => }/src/api/logs.rs | 12 +-
apps/app/{src-tauri => }/src/api/metadata.rs | 0
apps/app/{src-tauri => }/src/api/mod.rs | 0
apps/app/{src-tauri => }/src/api/mr_auth.rs | 0
apps/app/{src-tauri => }/src/api/pack.rs | 0
apps/app/{src-tauri => }/src/api/process.rs | 0
apps/app/{src-tauri => }/src/api/profile.rs | 4 +-
.../{src-tauri => }/src/api/profile_create.rs | 0
apps/app/{src-tauri => }/src/api/settings.rs | 0
apps/app/{src-tauri => }/src/api/tags.rs | 0
apps/app/{src-tauri => }/src/api/utils.rs | 4 +-
apps/app/{src-tauri => }/src/error.rs | 0
.../app/{src-tauri => }/src/macos/delegate.rs | 0
apps/app/{src-tauri => }/src/macos/mod.rs | 0
.../{src-tauri => }/src/macos/window_ext.rs | 0
apps/app/{src-tauri => }/src/main.rs | 0
apps/app/{src-tauri => }/tauri.conf.json | 11 +-
.../app/{src-tauri => }/tauri.macos.conf.json | 0
apps/frontend/.env | 3 -
apps/frontend/.eslintrc.cjs | 4 +
apps/frontend/.eslintrc.json | 18 -
apps/frontend/.prettierignore | 3 +-
apps/frontend/nuxt.config.ts | 4 -
apps/frontend/package.json | 23 +-
apps/frontend/src/components/ui/Badge.vue | 2 +-
apps/frontend/src/composables/auth.js | 1 -
apps/frontend/src/composables/auth/scopes.ts | 1 -
apps/frontend/src/composables/cosmetics.js | 1 -
apps/frontend/src/composables/date.js | 3 +-
apps/frontend/src/composables/fetch.js | 1 -
apps/frontend/src/composables/loading.js | 1 -
apps/frontend/src/composables/notifs.js | 1 -
apps/frontend/src/composables/route-params.js | 1 -
apps/frontend/src/composables/tag.js | 1 -
apps/frontend/src/composables/theme.js | 1 -
apps/frontend/src/composables/user.js | 1 -
apps/frontend/src/helpers/infer.js | 2 +-
apps/frontend/src/helpers/notifications.js | 1 -
apps/frontend/src/helpers/package.js | 3 +-
apps/frontend/src/helpers/projects.js | 1 -
apps/frontend/src/helpers/teams.js | 1 -
apps/frontend/src/middleware/auth.js | 1 -
.../src/pages/dashboard/revenue/transfers.vue | 3 +-
apps/frontend/src/plugins/1.theme.js | 1 -
apps/frontend/src/plugins/dayjs.js | 1 -
apps/frontend/src/plugins/scroll.client.js | 1 -
apps/frontend/src/plugins/shorthands.js | 1 -
apps/frontend/src/plugins/tooltip.js | 1 -
apps/frontend/src/server/plugins/theme.js | 5 -
apps/frontend/src/utils/analytics.js | 6 +-
package.json | 23 +-
packages/app-lib/package.json | 12 +
packages/app-lib/src/api/logs.rs | 9 +-
.../app-lib/src/api/pack/import/atlauncher.rs | 6 +-
.../app-lib/src/api/pack/import/curseforge.rs | 13 +-
.../app-lib/src/api/pack/import/gdlauncher.rs | 6 +-
packages/app-lib/src/api/pack/install_from.rs | 6 +-
packages/app-lib/src/api/process.rs | 4 +-
packages/app-lib/src/launcher/download.rs | 3 +-
packages/app-lib/src/state/dirs.rs | 2 +-
packages/app-lib/src/state/minecraft_auth.rs | 1 +
packages/app-lib/src/state/profiles.rs | 2 +-
packages/app-macros/package.json | 9 +
packages/assets/.eslintrc.js | 5 +-
packages/assets/index.ts | 3 +-
packages/assets/package.json | 4 +-
packages/assets/styles/classes.scss | 19 +-
packages/assets/styles/defaults.scss | 13 +-
packages/assets/styles/inter.scss | 15 +-
packages/assets/tsconfig.json | 2 +-
packages/eslint-config-custom/library.js | 20 +-
packages/eslint-config-custom/nuxt.js | 33 +-
packages/eslint-config-custom/package.json | 10 +-
packages/eslint-config-custom/vue.js | 28 +-
packages/ui/.eslintrc.js | 5 +-
packages/ui/package.json | 4 +-
packages/ui/src/components/base/Avatar.vue | 18 +-
packages/ui/src/components/base/Button.vue | 2 +-
packages/ui/src/components/base/Card.vue | 2 +-
packages/ui/src/components/base/Checkbox.vue | 6 +-
packages/ui/src/components/base/Chips.vue | 4 +-
packages/ui/src/components/base/CopyCode.vue | 5 +-
packages/ui/src/components/base/DropArea.vue | 6 +-
.../ui/src/components/base/DropdownSelect.vue | 10 +-
.../ui/src/components/base/Notifications.vue | 2 +-
.../ui/src/components/base/OverflowMenu.vue | 4 +-
.../ui/src/components/base/Pagination.vue | 7 +-
.../ui/src/components/base/PopoutMenu.vue | 9 +-
.../ui/src/components/base/ProjectCard.vue | 7 +-
packages/ui/src/components/base/Promotion.vue | 2 +-
packages/ui/src/components/chart/Chart.vue | 33 +-
.../ui/src/components/chart/CompactChart.vue | 3 +-
.../ui/src/components/modal/ShareModal.vue | 13 +-
packages/ui/src/components/nav/NavRow.vue | 2 +-
.../src/components/search/SearchDropdown.vue | 10 +-
packages/ui/src/vue-shims.d.ts | 6 +-
packages/ui/tsconfig.json | 2 +-
packages/utils/.eslintrc.js | 3 +
packages/utils/codemirror.ts | 11 +-
packages/utils/highlight.ts | 4 +-
packages/utils/package.json | 4 +-
packages/utils/parse.ts | 13 +-
packages/utils/projects.ts | 17 +-
packages/utils/tsconfig.json | 2 +-
packages/utils/utils.ts | 1 +
pnpm-lock.yaml | 1760 +++--------------
turbo.json | 19 +-
265 files changed, 1812 insertions(+), 1873 deletions(-)
create mode 100644 .github/ISSUE_TEMPLATE/1-app-bug.yml
create mode 100644 .github/ISSUE_TEMPLATE/2-web-bug.yml
create mode 100644 .github/ISSUE_TEMPLATE/3-api-bug.yml
create mode 100644 .github/ISSUE_TEMPLATE/4-feature-request.yml
create mode 100644 .github/ISSUE_TEMPLATE/config.yml
create mode 100644 .github/workflows/app-release.yml
create mode 100644 .github/workflows/frontend-pages.yml
create mode 100644 .vscode/settings.json
create mode 100644 apps/app-frontend/.env
create mode 100644 apps/app-frontend/.eslintrc.cjs
create mode 100644 apps/app-frontend/.prettierignore
rename apps/{app => app-frontend}/COPYING.md (95%)
create mode 100644 apps/app-frontend/LICENSE
rename apps/{app => app-frontend}/index.html (100%)
create mode 100644 apps/app-frontend/package.json
rename apps/{app => app-frontend}/src/App.vue (100%)
rename apps/{app => app-frontend}/src/assets/external/atlauncher.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/bmac.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/discord.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/gdlauncher.png (100%)
rename apps/{app => app-frontend}/src/assets/external/github.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/gitlab.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/google.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/index.js (100%)
rename apps/{app => app-frontend}/src/assets/external/kofi.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/mastodon.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/microsoft.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/multimc.webp (100%)
rename apps/{app => app-frontend}/src/assets/external/opencollective.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/patreon.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/paypal.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/prism.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/reddit.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/steam.svg (100%)
rename apps/{app => app-frontend}/src/assets/external/twitter.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/add-project.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/arrow-left-right.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/bug.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/index.js (100%)
rename apps/{app => app-frontend}/src/assets/icons/maximize.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/menu.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/messages-square.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/milestone.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/minimize.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/more.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/new-instance.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/package.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/server.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/text-cursor-input.svg (100%)
rename apps/{app => app-frontend}/src/assets/icons/toggle.svg (100%)
rename apps/{app => app-frontend}/src/assets/profile_icon.png (100%)
rename apps/{app => app-frontend}/src/assets/stylesheets/global.scss (100%)
rename apps/{app => app-frontend}/src/assets/stylesheets/macFix.css (100%)
rename apps/{app => app-frontend}/src/components/GridDisplay.vue (100%)
rename apps/{app => app-frontend}/src/components/RowDisplay.vue (100%)
rename apps/{app => app-frontend}/src/components/modrinth-loading-indicator.js (100%)
rename apps/{app => app-frontend}/src/components/ui/AccountsCard.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/Breadcrumbs.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ContextMenu.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ErrorModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ExportModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/IncompatibilityWarningModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/InstallConfirmModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/Instance.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/InstanceCreationModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/JavaDetectionModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/JavaSelector.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ModInstallModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ModpackVersionModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ProgressBar.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/ProjectCard.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/RunningAppBar.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/SearchCard.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/SplashScreen.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/URLConfirmModal.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/tutorial/GalleryImage.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/tutorial/LoginCard.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/tutorial/ModrinthLoginScreen.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/tutorial/OnboardingScreen.vue (100%)
rename apps/{app => app-frontend}/src/components/ui/tutorial/StickyTitleBar.vue (100%)
rename apps/{app => app-frontend}/src/helpers/auth.js (100%)
rename apps/{app => app-frontend}/src/helpers/events.js (100%)
rename apps/{app => app-frontend}/src/helpers/fetch.js (100%)
rename apps/{app => app-frontend}/src/helpers/import.js (100%)
rename apps/{app => app-frontend}/src/helpers/jre.js (100%)
rename apps/{app => app-frontend}/src/helpers/logs.js (100%)
rename apps/{app => app-frontend}/src/helpers/metadata.js (100%)
rename apps/{app => app-frontend}/src/helpers/mixpanel.js (100%)
rename apps/{app => app-frontend}/src/helpers/mr_auth.js (100%)
rename apps/{app => app-frontend}/src/helpers/pack.js (100%)
rename apps/{app => app-frontend}/src/helpers/process.js (100%)
rename apps/{app => app-frontend}/src/helpers/profile.js (100%)
rename apps/{app => app-frontend}/src/helpers/settings.js (100%)
rename apps/{app => app-frontend}/src/helpers/state.js (100%)
rename apps/{app => app-frontend}/src/helpers/tags.js (100%)
rename apps/{app => app-frontend}/src/helpers/utils.js (100%)
rename apps/{app => app-frontend}/src/main.js (100%)
rename apps/{app => app-frontend}/src/mixins/macCssFix.js (100%)
rename apps/{app => app-frontend}/src/pages/Browse.vue (100%)
rename apps/{app => app-frontend}/src/pages/Index.vue (100%)
rename apps/{app => app-frontend}/src/pages/Library.vue (100%)
rename apps/{app => app-frontend}/src/pages/Settings.vue (100%)
rename apps/{app => app-frontend}/src/pages/index.js (100%)
rename apps/{app => app-frontend}/src/pages/instance/Index.vue (100%)
rename apps/{app => app-frontend}/src/pages/instance/Logs.vue (100%)
rename apps/{app => app-frontend}/src/pages/instance/Mods.vue (100%)
rename apps/{app => app-frontend}/src/pages/instance/Options.vue (100%)
rename apps/{app => app-frontend}/src/pages/instance/index.js (100%)
rename apps/{app => app-frontend}/src/pages/project/Changelog.vue (100%)
rename apps/{app => app-frontend}/src/pages/project/Description.vue (100%)
rename apps/{app => app-frontend}/src/pages/project/Gallery.vue (100%)
rename apps/{app => app-frontend}/src/pages/project/Index.vue (100%)
rename apps/{app => app-frontend}/src/pages/project/Version.vue (100%)
rename apps/{app => app-frontend}/src/pages/project/Versions.vue (100%)
rename apps/{app => app-frontend}/src/pages/project/index.js (100%)
rename apps/{app => app-frontend}/src/routes.js (97%)
rename apps/{app => app-frontend}/src/store/breadcrumbs.js (100%)
rename apps/{app => app-frontend}/src/store/error.js (100%)
rename apps/{app => app-frontend}/src/store/loading.js (100%)
rename apps/{app => app-frontend}/src/store/notifications.js (100%)
rename apps/{app => app-frontend}/src/store/state.js (100%)
rename apps/{app => app-frontend}/src/store/theme.js (100%)
rename apps/{app => app-frontend}/tsconfig.json (100%)
rename apps/{app => app-frontend}/vite.config.ts (83%)
create mode 100644 apps/app-playground/package.json
delete mode 100644 apps/app/.eslintrc.json
rename apps/app/{src-tauri => }/.gitignore (100%)
rename apps/app/{src-tauri => }/App.entitlements (100%)
rename apps/app/{src-tauri => }/Cargo.toml (84%)
rename apps/app/{src-tauri => }/Info.plist (100%)
rename apps/app/{src-tauri => }/build.rs (100%)
rename apps/app/{src-tauri => }/icons/128x128.png (100%)
rename apps/app/{src-tauri => }/icons/128x128@2x.png (100%)
rename apps/app/{src-tauri => }/icons/Square107x107Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square142x142Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square150x150Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square284x284Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square30x30Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square310x310Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square44x44Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square71x71Logo.png (100%)
rename apps/app/{src-tauri => }/icons/Square89x89Logo.png (100%)
rename apps/app/{src-tauri => }/icons/StoreLogo.png (100%)
rename apps/app/{src-tauri => }/icons/favicon.ico (100%)
rename apps/app/{src-tauri => }/icons/icon.icns (100%)
rename apps/app/{src-tauri => }/icons/icon.ico (100%)
rename apps/app/{src-tauri => }/icons/icon.png (100%)
rename apps/app/{src-tauri => }/msi/main.wxs (100%)
rename apps/app/{src-tauri => }/src/api/auth.rs (100%)
rename apps/app/{src-tauri => }/src/api/import.rs (100%)
rename apps/app/{src-tauri => }/src/api/jre.rs (100%)
rename apps/app/{src-tauri => }/src/api/logs.rs (92%)
rename apps/app/{src-tauri => }/src/api/metadata.rs (100%)
rename apps/app/{src-tauri => }/src/api/mod.rs (100%)
rename apps/app/{src-tauri => }/src/api/mr_auth.rs (100%)
rename apps/app/{src-tauri => }/src/api/pack.rs (100%)
rename apps/app/{src-tauri => }/src/api/process.rs (100%)
rename apps/app/{src-tauri => }/src/api/profile.rs (99%)
rename apps/app/{src-tauri => }/src/api/profile_create.rs (100%)
rename apps/app/{src-tauri => }/src/api/settings.rs (100%)
rename apps/app/{src-tauri => }/src/api/tags.rs (100%)
rename apps/app/{src-tauri => }/src/api/utils.rs (98%)
rename apps/app/{src-tauri => }/src/error.rs (100%)
rename apps/app/{src-tauri => }/src/macos/delegate.rs (100%)
rename apps/app/{src-tauri => }/src/macos/mod.rs (100%)
rename apps/app/{src-tauri => }/src/macos/window_ext.rs (100%)
rename apps/app/{src-tauri => }/src/main.rs (100%)
rename apps/app/{src-tauri => }/tauri.conf.json (85%)
rename apps/app/{src-tauri => }/tauri.macos.conf.json (100%)
delete mode 100644 apps/frontend/.env
create mode 100644 apps/frontend/.eslintrc.cjs
delete mode 100644 apps/frontend/.eslintrc.json
create mode 100644 packages/app-lib/package.json
create mode 100644 packages/app-macros/package.json
diff --git a/.cargo/config.toml b/.cargo/config.toml
index 2374773ff..ca333857a 100644
--- a/.cargo/config.toml
+++ b/.cargo/config.toml
@@ -1,6 +1,3 @@
-[build]
-target-dir = 'dist/target'
-
# Windows has stack overflows when calling from Tauri, so we increase compiler size
[target.'cfg(windows)']
rustflags = ["-C", "link-args=/STACK:16777220"]
diff --git a/.github/ISSUE_TEMPLATE/1-app-bug.yml b/.github/ISSUE_TEMPLATE/1-app-bug.yml
new file mode 100644
index 000000000..cfa053340
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-app-bug.yml
@@ -0,0 +1,59 @@
+name: 🎮 Modrinth App bug
+description: Report an issue on the Modrinth website.
+labels: [bug, app]
+body:
+ - type: checkboxes
+ attributes:
+ label: Please confirm the following.
+ options:
+ - label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate problems
+ required: true
+ - label: I have tried resolving the issue using the [support portal](https://support.modrinth.com)
+ required: true
+ - label: I have ensured my Modrinth App installation is up to date
+ required: true
+ - type: input
+ id: version
+ attributes:
+ label: What version of the Modrinth App are you using?
+ description: Find this in ⚙️ Settings (bottom right) -> About -> App version.
+ validations:
+ required: true
+ - type: dropdown
+ id: oses
+ attributes:
+ label: What operating systems are you seeing the problem on?
+ multiple: true
+ options:
+ - Windows
+ - MacOS
+ - Linux
+ - type: textarea
+ attributes:
+ label: Describe the bug
+ description: A clear and concise description of what the bug is. Include screenshots if applicable.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Steps to reproduce
+ description: Steps to reproduce the behavior.
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '...'
+ 3. Scroll down to '...'
+ 4. See error
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Expected behavior
+ description: A clear and concise description of what you expected to happen.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Additional context
+ description: Add any other context about the problem here.
+ validations:
+ required: false
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/2-web-bug.yml b/.github/ISSUE_TEMPLATE/2-web-bug.yml
new file mode 100644
index 000000000..669225fc7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-web-bug.yml
@@ -0,0 +1,52 @@
+name: 🌐 Website bug (modrinth.com)
+description: Report an issue on the Modrinth website.
+labels: [bug, frontend]
+body:
+ - type: checkboxes
+ attributes:
+ label: Please confirm the following.
+ options:
+ - label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate problems
+ required: true
+ - label: I have tried resolving the issue using the [support portal](https://support.modrinth.com)
+ required: true
+ - type: dropdown
+ id: browsers
+ attributes:
+ label: What browsers are you seeing the problem on?
+ multiple: true
+ options:
+ - Chrome (including Arc, Brave, Opera, Vivaldi)
+ - Microsoft Edge
+ - Firefox
+ - Safari
+ - Other (please specify)
+ - type: textarea
+ attributes:
+ label: Describe the bug
+ description: A clear and concise description of what the bug is. Include screenshots if applicable.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Steps to reproduce
+ description: Steps to reproduce the behavior.
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '...'
+ 3. Scroll down to '...'
+ 4. See error
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Expected behavior
+ description: A clear and concise description of what you expected to happen.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Additional context
+ description: Add any other context about the problem here.
+ validations:
+ required: false
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/3-api-bug.yml b/.github/ISSUE_TEMPLATE/3-api-bug.yml
new file mode 100644
index 000000000..f4a28b547
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/3-api-bug.yml
@@ -0,0 +1,41 @@
+name: 🛠️ API issue (api.modrinth.com)
+description: Report an issue on the Modrinth website.
+labels: [bug, api]
+body:
+ - type: checkboxes
+ attributes:
+ label: Please confirm the following.
+ options:
+ - label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate problems
+ required: true
+ - label: I have tried resolving the issue using the [support portal](https://support.modrinth.com)
+ required: true
+ - type: textarea
+ attributes:
+ label: Describe the bug
+ description: A clear and concise description of what the bug is. Include screenshots if applicable.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Steps to reproduce
+ description: Steps to reproduce the behavior.
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '...'
+ 3. Scroll down to '...'
+ 4. See error
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Expected behavior
+ description: A clear and concise description of what you expected to happen.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Additional context
+ description: Add any other context about the problem here.
+ validations:
+ required: false
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/4-feature-request.yml b/.github/ISSUE_TEMPLATE/4-feature-request.yml
new file mode 100644
index 000000000..42406120a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/4-feature-request.yml
@@ -0,0 +1,46 @@
+name: 💡 Feature Request
+description: Suggest an idea
+labels: [enhancement]
+
+body:
+ - type: checkboxes
+ attributes:
+ label: Please confirm the following.
+ options:
+ - label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate feature requests
+ required: true
+ - label: I have checked that this feature request is not on our [roadmap](https://roadmap.modrinth.com)
+ required: true
+ - type: dropdown
+ id: projects
+ attributes:
+ label: What parts of Modrinth is your feature request related too?
+ multiple: true
+ options:
+ - App
+ - Website
+ - API
+ - type: textarea
+ attributes:
+ label: Is your suggested feature related to a problem? Please describe.
+ description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Describe the solution you'd like
+ description: A clear and concise description of what you want to happen.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Describe alternatives you've considered
+ description: A clear and concise description of any alternative solutions or features you've considered.
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Additional context
+ description: Add any other context or screenshots about the suggested enhancement here.
+ validations:
+ required: false
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000..8d47deb5a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,14 @@
+blank_issues_enabled: true
+contact_links:
+ - name: 🫶 Support Portal
+ about: Get support using through our portal.
+ url: https://support.modrinth.com
+ - name: 💬 Chat
+ about: Join our Discord server to chat about Modrinth.
+ url: https://discord.modrinth.com
+ - name: 🛣️ Roadmap
+ about: View our Roadmap. Please do not open issues for items on our roadmap.
+ url: https://roadmap.modrinth.com
+ - name: 📚 Documentation
+ about: Useful documentation about Modrinth's API
+ url: https://docs.modrinth.com
\ No newline at end of file
diff --git a/.github/workflows/app-release.yml b/.github/workflows/app-release.yml
new file mode 100644
index 000000000..a2890a0fb
--- /dev/null
+++ b/.github/workflows/app-release.yml
@@ -0,0 +1,127 @@
+name: 'Modrinth App build'
+on:
+ push:
+ branches:
+ - main
+ tags:
+ - 'v*'
+ paths:
+ - 'apps/app/**'
+ - 'apps/app-frontend/**'
+ - 'packages/app-lib/**'
+ - 'packages/app-macros/**'
+ - 'packages/assets/**'
+ - 'packages/ui/**'
+ - 'packages/utils/**'
+ workflow_dispatch:
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform: [macos-latest, windows-latest, ubuntu-20.04]
+
+ runs-on: ${{ matrix.platform }}
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Rust setup (mac)
+ if: startsWith(matrix.platform, 'macos')
+ uses: dtolnay/rust-toolchain@stable
+ with:
+ components: rustfmt, clippy
+ targets: aarch64-apple-darwin, x86_64-apple-darwin
+
+ - name: Rust setup
+ if: "!startsWith(matrix.platform, 'macos')"
+ uses: dtolnay/rust-toolchain@stable
+ with:
+ components: rustfmt, clippy
+
+ - name: Setup rust cache
+ uses: actions/cache@v4
+ with:
+ path: target/**
+ key: ${{ runner.os }}-rust-target-${{ hashFiles('**/Cargo.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-rust-target-
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 20
+
+ - name: Install pnpm via corepack
+ shell: bash
+ run: |
+ corepack enable
+ corepack prepare --activate
+
+ - name: Get pnpm store directory
+ id: pnpm-cache
+ shell: bash
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Setup pnpm cache
+ uses: actions/cache@v3
+ with:
+ path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: install dependencies (ubuntu only)
+ if: startsWith(matrix.platform, 'ubuntu')
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf libselinux1
+
+ - name: Install frontend dependencies
+ run: pnpm install
+
+ - name: build app (macos)
+ uses: tauri-apps/tauri-action@v0
+ id: build_os_mac
+ if: startsWith(matrix.platform, 'macos')
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
+ APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
+ APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
+ APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
+ APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
+ TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
+ TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
+ with:
+ args: --target universal-apple-darwin
+ working-directory: ./apps/app
+
+ - name: build app
+ uses: tauri-apps/tauri-action@v0
+ id: build_os
+ if: "!startsWith(matrix.platform, 'macos')"
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
+ TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
+ with:
+ working-directory: ./apps/app
+
+ - name: upload ${{ matrix.platform }}
+ uses: actions/upload-artifact@v3
+ if: startsWith(matrix.platform, 'macos')
+ with:
+ name: ${{ matrix.platform }}
+ path: "${{ join(fromJSON(steps.build_os_mac.outputs.artifactPaths), '\n') }}"
+
+ - name: upload ${{ matrix.platform }}
+ uses: actions/upload-artifact@v3
+ if: "!startsWith(matrix.platform, 'macos')"
+ with:
+ name: ${{ matrix.platform }}
+ path: "${{ join(fromJSON(steps.build_os.outputs.artifactPaths), '\n') }}"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5d152a321..a2975b87f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,42 +2,69 @@ name: CI
on:
push:
- branches:
- - main
+ branches: ["main"]
pull_request:
-
-permissions:
- actions: read
- contents: read
+ types: [opened, synchronize]
+ merge_group:
+ types: [ checks_requested ]
jobs:
- main:
- runs-on: ubuntu-latest
+ build:
+ name: Build, Test, and Lint
+ runs-on: ubuntu-20.04
+
steps:
- - uses: actions/checkout@v4
+ - name: Check out code
+ uses: actions/checkout@v4
with:
- fetch-depth: 0
-
- - uses: pnpm/action-setup@v2
+ fetch-depth: 2
+
+ - name: Cache turbo build setup
+ uses: actions/cache@v4
with:
- version: 8
-
-
+ path: .turbo
+ key: ${{ runner.os }}-turbo-${{ github.sha }}
+ restore-keys: |
+ ${{ runner.os }}-turbo-
- # Connect your workspace on nx.app and uncomment this to enable task distribution.
- # The "--stop-agents-after" is optional, but allows idle agents to shut down once the "build" targets have been requested
- # - run: pnpm dlx nx-cloud start-ci-run --distribute-on="5 linux-medium-js" --stop-agents-after="build"
+ - name: Install build dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf libselinux1
-
- # Cache node_modules
- - uses: actions/setup-node@v3
+ - name: Setup Node.JS environment
+ uses: actions/setup-node@v4
with:
node-version: 20
- cache: 'pnpm'
-
- - run: pnpm install --frozen-lockfile
- - uses: nrwl/nx-set-shas@v4
-
- # Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud
- # - run: pnpm exec nx-cloud record -- echo Hello World
- - run: pnpm exec nx affected -t lint test build
+
+ - name: Install pnpm via corepack
+ shell: bash
+ run: |
+ corepack enable
+ corepack prepare --activate
+
+ - name: Get pnpm store directory
+ id: pnpm-cache
+ shell: bash
+ run: |
+ echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - uses: actions/cache@v4
+ name: Setup pnpm cache
+ with:
+ path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install dependencies
+ run: pnpm install
+
+ - name: Build
+ run: pnpm build
+
+ - name: Lint
+ run: pnpm lint
+
+ - name: Test
+ run: pnpm test
diff --git a/.github/workflows/frontend-pages.yml b/.github/workflows/frontend-pages.yml
new file mode 100644
index 000000000..58b8a0d26
--- /dev/null
+++ b/.github/workflows/frontend-pages.yml
@@ -0,0 +1,20 @@
+name: Deploy frontend
+
+on: push
+
+jobs:
+ wait:
+ if: github.repository_owner == 'modrinth'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ deployments: write
+ steps:
+ - name: Cloudflare Pages deployment
+ uses: WalshyDev/cf-pages-await@v1
+ with:
+ apiToken: ${{ secrets.CF_API_TOKEN }}
+ accountId: '9ddae624c98677d68d93df6e524a6061'
+ project: 'frontend'
+ githubToken: ${{ secrets.GITHUB_TOKEN }}
+ commitHash: ${{ steps.push-changes.outputs.commit-hash }}
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 71f5e856b..c6eb61eef 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,3 +1,3 @@
{
- "recommendations": ["nrwl.angular-console", "esbenp.prettier-vscode"]
+ "recommendations": ["esbenp.prettier-vscode", "Vue.volar", "rust-lang.rust-analyzer"]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000..c89a52fa7
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+ "prettier.endOfLine": "lf",
+ "editor.formatOnSave": true
+ }
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index 396f471db..35b41749f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -518,9 +518,6 @@ name = "bytes"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
-dependencies = [
- "serde",
-]
[[package]]
name = "bzip2"
@@ -2788,12 +2785,6 @@ dependencies = [
"uuid 1.9.1",
]
-[[package]]
-name = "minisign-verify"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881"
-
[[package]]
name = "miniz_oxide"
version = "0.7.4"
@@ -3874,12 +3865,10 @@ dependencies = [
"system-configuration",
"tokio",
"tokio-native-tls",
- "tokio-util",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
- "wasm-streams",
"web-sys",
"winreg 0.50.0",
]
@@ -4888,8 +4877,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "336bc661a3f3250853fa83c6e5245449ed1c26dce5dcb28bdee7efedf6278806"
dependencies = [
"anyhow",
- "base64 0.21.7",
- "bytes",
"cocoa 0.24.1",
"dirs-next",
"dunce",
@@ -4904,8 +4891,6 @@ dependencies = [
"heck 0.5.0",
"http 0.2.12",
"ignore",
- "indexmap 1.9.3",
- "minisign-verify",
"objc",
"once_cell",
"open",
@@ -4914,7 +4899,6 @@ dependencies = [
"rand 0.8.5",
"raw-window-handle",
"regex",
- "reqwest 0.11.27",
"rfd",
"semver",
"serde",
@@ -4930,14 +4914,12 @@ dependencies = [
"tauri-utils",
"tempfile",
"thiserror",
- "time",
"tokio",
"url",
"uuid 1.9.1",
"webkit2gtk",
"webview2-com",
"windows 0.39.0",
- "zip",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 125ce2fd4..5713c74be 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,20 +4,9 @@ members = [
'./packages/app-lib',
'./packages/app-macros',
'./apps/app-playground',
- './apps/app/src-tauri'
+ './apps/app'
]
-[profile.dev]
-opt-level = 0
-debug = true
-debug-assertions = true
-overflow-checks = true
-lto = false
-panic = 'unwind'
-incremental = true
-codegen-units = 256
-rpath = false
-
# Optimize for speed and reduce size on release builds
[profile.release]
panic = "abort" # Strip expensive panic clean-up logic
diff --git a/apps/app-frontend/.env b/apps/app-frontend/.env
new file mode 100644
index 000000000..6684c4059
--- /dev/null
+++ b/apps/app-frontend/.env
@@ -0,0 +1,3 @@
+BASE_URL=https://staging-api.modrinth.com/v2/
+BROWSER_BASE_URL=https://staging-api.modrinth.com/v2/
+BASE_URL=
diff --git a/apps/app-frontend/.eslintrc.cjs b/apps/app-frontend/.eslintrc.cjs
new file mode 100644
index 000000000..1f85730cc
--- /dev/null
+++ b/apps/app-frontend/.eslintrc.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ root: true,
+ extends: ['custom/vue'],
+}
diff --git a/apps/app-frontend/.prettierignore b/apps/app-frontend/.prettierignore
new file mode 100644
index 000000000..581edad3d
--- /dev/null
+++ b/apps/app-frontend/.prettierignore
@@ -0,0 +1 @@
+**/dist
diff --git a/apps/app/COPYING.md b/apps/app-frontend/COPYING.md
similarity index 95%
rename from apps/app/COPYING.md
rename to apps/app-frontend/COPYING.md
index f1bba6587..5f38b76c4 100644
--- a/apps/app/COPYING.md
+++ b/apps/app-frontend/COPYING.md
@@ -10,4 +10,4 @@ The use of Modrinth branding elements, including but not limited to the wrench-i
This includes, but may not be limited to, the following files:
-- theseus_gui/src-tauri/icons/*
+- theseus_gui/src-tauri/icons/\*
diff --git a/apps/app-frontend/LICENSE b/apps/app-frontend/LICENSE
new file mode 100644
index 000000000..f288702d2
--- /dev/null
+++ b/apps/app-frontend/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/apps/app/index.html b/apps/app-frontend/index.html
similarity index 100%
rename from apps/app/index.html
rename to apps/app-frontend/index.html
diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json
new file mode 100644
index 000000000..81a6b909b
--- /dev/null
+++ b/apps/app-frontend/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "@modrinth/app-frontend",
+ "private": true,
+ "version": "0.7.2",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint . && prettier --check .",
+ "fix": "eslint . --fix && prettier --write ."
+ },
+ "dependencies": {
+ "@modrinth/assets": "workspace:*",
+ "@modrinth/ui": "workspace:*",
+ "@modrinth/utils": "workspace:*",
+ "@tauri-apps/api": "^1.5.3",
+ "@vintl/vintl": "^4.4.1",
+ "dayjs": "^1.11.10",
+ "floating-vue": "^5.2.2",
+ "mixpanel-browser": "^2.49.0",
+ "ofetch": "^1.3.4",
+ "omorphia": "^0.4.41",
+ "pinia": "^2.1.7",
+ "tauri-plugin-window-state-api": "github:tauri-apps/tauri-plugin-window-state#v1",
+ "vite-svg-loader": "^5.1.0",
+ "vue": "^3.4.21",
+ "vue-multiselect": "3.0.0-beta.3",
+ "vue-router": "4.3.0",
+ "vue-virtual-scroller": "2.0.0-beta.8"
+ },
+ "devDependencies": {
+ "@tauri-apps/cli": "^1.5.11",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "eslint": "^8.57.0",
+ "eslint-config-custom": "workspace:*",
+ "prettier": "^3.2.5",
+ "sass": "^1.74.1",
+ "tsconfig": "workspace:*",
+ "vite": "^5.2.8"
+ },
+ "packageManager": "pnpm@9.4.0"
+}
diff --git a/apps/app/src/App.vue b/apps/app-frontend/src/App.vue
similarity index 100%
rename from apps/app/src/App.vue
rename to apps/app-frontend/src/App.vue
diff --git a/apps/app/src/assets/external/atlauncher.svg b/apps/app-frontend/src/assets/external/atlauncher.svg
similarity index 100%
rename from apps/app/src/assets/external/atlauncher.svg
rename to apps/app-frontend/src/assets/external/atlauncher.svg
diff --git a/apps/app/src/assets/external/bmac.svg b/apps/app-frontend/src/assets/external/bmac.svg
similarity index 100%
rename from apps/app/src/assets/external/bmac.svg
rename to apps/app-frontend/src/assets/external/bmac.svg
diff --git a/apps/app/src/assets/external/discord.svg b/apps/app-frontend/src/assets/external/discord.svg
similarity index 100%
rename from apps/app/src/assets/external/discord.svg
rename to apps/app-frontend/src/assets/external/discord.svg
diff --git a/apps/app/src/assets/external/gdlauncher.png b/apps/app-frontend/src/assets/external/gdlauncher.png
similarity index 100%
rename from apps/app/src/assets/external/gdlauncher.png
rename to apps/app-frontend/src/assets/external/gdlauncher.png
diff --git a/apps/app/src/assets/external/github.svg b/apps/app-frontend/src/assets/external/github.svg
similarity index 100%
rename from apps/app/src/assets/external/github.svg
rename to apps/app-frontend/src/assets/external/github.svg
diff --git a/apps/app/src/assets/external/gitlab.svg b/apps/app-frontend/src/assets/external/gitlab.svg
similarity index 100%
rename from apps/app/src/assets/external/gitlab.svg
rename to apps/app-frontend/src/assets/external/gitlab.svg
diff --git a/apps/app/src/assets/external/google.svg b/apps/app-frontend/src/assets/external/google.svg
similarity index 100%
rename from apps/app/src/assets/external/google.svg
rename to apps/app-frontend/src/assets/external/google.svg
diff --git a/apps/app/src/assets/external/index.js b/apps/app-frontend/src/assets/external/index.js
similarity index 100%
rename from apps/app/src/assets/external/index.js
rename to apps/app-frontend/src/assets/external/index.js
diff --git a/apps/app/src/assets/external/kofi.svg b/apps/app-frontend/src/assets/external/kofi.svg
similarity index 100%
rename from apps/app/src/assets/external/kofi.svg
rename to apps/app-frontend/src/assets/external/kofi.svg
diff --git a/apps/app/src/assets/external/mastodon.svg b/apps/app-frontend/src/assets/external/mastodon.svg
similarity index 100%
rename from apps/app/src/assets/external/mastodon.svg
rename to apps/app-frontend/src/assets/external/mastodon.svg
diff --git a/apps/app/src/assets/external/microsoft.svg b/apps/app-frontend/src/assets/external/microsoft.svg
similarity index 100%
rename from apps/app/src/assets/external/microsoft.svg
rename to apps/app-frontend/src/assets/external/microsoft.svg
diff --git a/apps/app/src/assets/external/multimc.webp b/apps/app-frontend/src/assets/external/multimc.webp
similarity index 100%
rename from apps/app/src/assets/external/multimc.webp
rename to apps/app-frontend/src/assets/external/multimc.webp
diff --git a/apps/app/src/assets/external/opencollective.svg b/apps/app-frontend/src/assets/external/opencollective.svg
similarity index 100%
rename from apps/app/src/assets/external/opencollective.svg
rename to apps/app-frontend/src/assets/external/opencollective.svg
diff --git a/apps/app/src/assets/external/patreon.svg b/apps/app-frontend/src/assets/external/patreon.svg
similarity index 100%
rename from apps/app/src/assets/external/patreon.svg
rename to apps/app-frontend/src/assets/external/patreon.svg
diff --git a/apps/app/src/assets/external/paypal.svg b/apps/app-frontend/src/assets/external/paypal.svg
similarity index 100%
rename from apps/app/src/assets/external/paypal.svg
rename to apps/app-frontend/src/assets/external/paypal.svg
diff --git a/apps/app/src/assets/external/prism.svg b/apps/app-frontend/src/assets/external/prism.svg
similarity index 100%
rename from apps/app/src/assets/external/prism.svg
rename to apps/app-frontend/src/assets/external/prism.svg
diff --git a/apps/app/src/assets/external/reddit.svg b/apps/app-frontend/src/assets/external/reddit.svg
similarity index 100%
rename from apps/app/src/assets/external/reddit.svg
rename to apps/app-frontend/src/assets/external/reddit.svg
diff --git a/apps/app/src/assets/external/steam.svg b/apps/app-frontend/src/assets/external/steam.svg
similarity index 100%
rename from apps/app/src/assets/external/steam.svg
rename to apps/app-frontend/src/assets/external/steam.svg
diff --git a/apps/app/src/assets/external/twitter.svg b/apps/app-frontend/src/assets/external/twitter.svg
similarity index 100%
rename from apps/app/src/assets/external/twitter.svg
rename to apps/app-frontend/src/assets/external/twitter.svg
diff --git a/apps/app/src/assets/icons/add-project.svg b/apps/app-frontend/src/assets/icons/add-project.svg
similarity index 100%
rename from apps/app/src/assets/icons/add-project.svg
rename to apps/app-frontend/src/assets/icons/add-project.svg
diff --git a/apps/app/src/assets/icons/arrow-left-right.svg b/apps/app-frontend/src/assets/icons/arrow-left-right.svg
similarity index 100%
rename from apps/app/src/assets/icons/arrow-left-right.svg
rename to apps/app-frontend/src/assets/icons/arrow-left-right.svg
diff --git a/apps/app/src/assets/icons/bug.svg b/apps/app-frontend/src/assets/icons/bug.svg
similarity index 100%
rename from apps/app/src/assets/icons/bug.svg
rename to apps/app-frontend/src/assets/icons/bug.svg
diff --git a/apps/app/src/assets/icons/index.js b/apps/app-frontend/src/assets/icons/index.js
similarity index 100%
rename from apps/app/src/assets/icons/index.js
rename to apps/app-frontend/src/assets/icons/index.js
diff --git a/apps/app/src/assets/icons/maximize.svg b/apps/app-frontend/src/assets/icons/maximize.svg
similarity index 100%
rename from apps/app/src/assets/icons/maximize.svg
rename to apps/app-frontend/src/assets/icons/maximize.svg
diff --git a/apps/app/src/assets/icons/menu.svg b/apps/app-frontend/src/assets/icons/menu.svg
similarity index 100%
rename from apps/app/src/assets/icons/menu.svg
rename to apps/app-frontend/src/assets/icons/menu.svg
diff --git a/apps/app/src/assets/icons/messages-square.svg b/apps/app-frontend/src/assets/icons/messages-square.svg
similarity index 100%
rename from apps/app/src/assets/icons/messages-square.svg
rename to apps/app-frontend/src/assets/icons/messages-square.svg
diff --git a/apps/app/src/assets/icons/milestone.svg b/apps/app-frontend/src/assets/icons/milestone.svg
similarity index 100%
rename from apps/app/src/assets/icons/milestone.svg
rename to apps/app-frontend/src/assets/icons/milestone.svg
diff --git a/apps/app/src/assets/icons/minimize.svg b/apps/app-frontend/src/assets/icons/minimize.svg
similarity index 100%
rename from apps/app/src/assets/icons/minimize.svg
rename to apps/app-frontend/src/assets/icons/minimize.svg
diff --git a/apps/app/src/assets/icons/more.svg b/apps/app-frontend/src/assets/icons/more.svg
similarity index 100%
rename from apps/app/src/assets/icons/more.svg
rename to apps/app-frontend/src/assets/icons/more.svg
diff --git a/apps/app/src/assets/icons/new-instance.svg b/apps/app-frontend/src/assets/icons/new-instance.svg
similarity index 100%
rename from apps/app/src/assets/icons/new-instance.svg
rename to apps/app-frontend/src/assets/icons/new-instance.svg
diff --git a/apps/app/src/assets/icons/package.svg b/apps/app-frontend/src/assets/icons/package.svg
similarity index 100%
rename from apps/app/src/assets/icons/package.svg
rename to apps/app-frontend/src/assets/icons/package.svg
diff --git a/apps/app/src/assets/icons/server.svg b/apps/app-frontend/src/assets/icons/server.svg
similarity index 100%
rename from apps/app/src/assets/icons/server.svg
rename to apps/app-frontend/src/assets/icons/server.svg
diff --git a/apps/app/src/assets/icons/text-cursor-input.svg b/apps/app-frontend/src/assets/icons/text-cursor-input.svg
similarity index 100%
rename from apps/app/src/assets/icons/text-cursor-input.svg
rename to apps/app-frontend/src/assets/icons/text-cursor-input.svg
diff --git a/apps/app/src/assets/icons/toggle.svg b/apps/app-frontend/src/assets/icons/toggle.svg
similarity index 100%
rename from apps/app/src/assets/icons/toggle.svg
rename to apps/app-frontend/src/assets/icons/toggle.svg
diff --git a/apps/app/src/assets/profile_icon.png b/apps/app-frontend/src/assets/profile_icon.png
similarity index 100%
rename from apps/app/src/assets/profile_icon.png
rename to apps/app-frontend/src/assets/profile_icon.png
diff --git a/apps/app/src/assets/stylesheets/global.scss b/apps/app-frontend/src/assets/stylesheets/global.scss
similarity index 100%
rename from apps/app/src/assets/stylesheets/global.scss
rename to apps/app-frontend/src/assets/stylesheets/global.scss
diff --git a/apps/app/src/assets/stylesheets/macFix.css b/apps/app-frontend/src/assets/stylesheets/macFix.css
similarity index 100%
rename from apps/app/src/assets/stylesheets/macFix.css
rename to apps/app-frontend/src/assets/stylesheets/macFix.css
diff --git a/apps/app/src/components/GridDisplay.vue b/apps/app-frontend/src/components/GridDisplay.vue
similarity index 100%
rename from apps/app/src/components/GridDisplay.vue
rename to apps/app-frontend/src/components/GridDisplay.vue
diff --git a/apps/app/src/components/RowDisplay.vue b/apps/app-frontend/src/components/RowDisplay.vue
similarity index 100%
rename from apps/app/src/components/RowDisplay.vue
rename to apps/app-frontend/src/components/RowDisplay.vue
diff --git a/apps/app/src/components/modrinth-loading-indicator.js b/apps/app-frontend/src/components/modrinth-loading-indicator.js
similarity index 100%
rename from apps/app/src/components/modrinth-loading-indicator.js
rename to apps/app-frontend/src/components/modrinth-loading-indicator.js
diff --git a/apps/app/src/components/ui/AccountsCard.vue b/apps/app-frontend/src/components/ui/AccountsCard.vue
similarity index 100%
rename from apps/app/src/components/ui/AccountsCard.vue
rename to apps/app-frontend/src/components/ui/AccountsCard.vue
diff --git a/apps/app/src/components/ui/Breadcrumbs.vue b/apps/app-frontend/src/components/ui/Breadcrumbs.vue
similarity index 100%
rename from apps/app/src/components/ui/Breadcrumbs.vue
rename to apps/app-frontend/src/components/ui/Breadcrumbs.vue
diff --git a/apps/app/src/components/ui/ContextMenu.vue b/apps/app-frontend/src/components/ui/ContextMenu.vue
similarity index 100%
rename from apps/app/src/components/ui/ContextMenu.vue
rename to apps/app-frontend/src/components/ui/ContextMenu.vue
diff --git a/apps/app/src/components/ui/ErrorModal.vue b/apps/app-frontend/src/components/ui/ErrorModal.vue
similarity index 100%
rename from apps/app/src/components/ui/ErrorModal.vue
rename to apps/app-frontend/src/components/ui/ErrorModal.vue
diff --git a/apps/app/src/components/ui/ExportModal.vue b/apps/app-frontend/src/components/ui/ExportModal.vue
similarity index 100%
rename from apps/app/src/components/ui/ExportModal.vue
rename to apps/app-frontend/src/components/ui/ExportModal.vue
diff --git a/apps/app/src/components/ui/IncompatibilityWarningModal.vue b/apps/app-frontend/src/components/ui/IncompatibilityWarningModal.vue
similarity index 100%
rename from apps/app/src/components/ui/IncompatibilityWarningModal.vue
rename to apps/app-frontend/src/components/ui/IncompatibilityWarningModal.vue
diff --git a/apps/app/src/components/ui/InstallConfirmModal.vue b/apps/app-frontend/src/components/ui/InstallConfirmModal.vue
similarity index 100%
rename from apps/app/src/components/ui/InstallConfirmModal.vue
rename to apps/app-frontend/src/components/ui/InstallConfirmModal.vue
diff --git a/apps/app/src/components/ui/Instance.vue b/apps/app-frontend/src/components/ui/Instance.vue
similarity index 100%
rename from apps/app/src/components/ui/Instance.vue
rename to apps/app-frontend/src/components/ui/Instance.vue
diff --git a/apps/app/src/components/ui/InstanceCreationModal.vue b/apps/app-frontend/src/components/ui/InstanceCreationModal.vue
similarity index 100%
rename from apps/app/src/components/ui/InstanceCreationModal.vue
rename to apps/app-frontend/src/components/ui/InstanceCreationModal.vue
diff --git a/apps/app/src/components/ui/JavaDetectionModal.vue b/apps/app-frontend/src/components/ui/JavaDetectionModal.vue
similarity index 100%
rename from apps/app/src/components/ui/JavaDetectionModal.vue
rename to apps/app-frontend/src/components/ui/JavaDetectionModal.vue
diff --git a/apps/app/src/components/ui/JavaSelector.vue b/apps/app-frontend/src/components/ui/JavaSelector.vue
similarity index 100%
rename from apps/app/src/components/ui/JavaSelector.vue
rename to apps/app-frontend/src/components/ui/JavaSelector.vue
diff --git a/apps/app/src/components/ui/ModInstallModal.vue b/apps/app-frontend/src/components/ui/ModInstallModal.vue
similarity index 100%
rename from apps/app/src/components/ui/ModInstallModal.vue
rename to apps/app-frontend/src/components/ui/ModInstallModal.vue
diff --git a/apps/app/src/components/ui/ModpackVersionModal.vue b/apps/app-frontend/src/components/ui/ModpackVersionModal.vue
similarity index 100%
rename from apps/app/src/components/ui/ModpackVersionModal.vue
rename to apps/app-frontend/src/components/ui/ModpackVersionModal.vue
diff --git a/apps/app/src/components/ui/ProgressBar.vue b/apps/app-frontend/src/components/ui/ProgressBar.vue
similarity index 100%
rename from apps/app/src/components/ui/ProgressBar.vue
rename to apps/app-frontend/src/components/ui/ProgressBar.vue
diff --git a/apps/app/src/components/ui/ProjectCard.vue b/apps/app-frontend/src/components/ui/ProjectCard.vue
similarity index 100%
rename from apps/app/src/components/ui/ProjectCard.vue
rename to apps/app-frontend/src/components/ui/ProjectCard.vue
diff --git a/apps/app/src/components/ui/RunningAppBar.vue b/apps/app-frontend/src/components/ui/RunningAppBar.vue
similarity index 100%
rename from apps/app/src/components/ui/RunningAppBar.vue
rename to apps/app-frontend/src/components/ui/RunningAppBar.vue
diff --git a/apps/app/src/components/ui/SearchCard.vue b/apps/app-frontend/src/components/ui/SearchCard.vue
similarity index 100%
rename from apps/app/src/components/ui/SearchCard.vue
rename to apps/app-frontend/src/components/ui/SearchCard.vue
diff --git a/apps/app/src/components/ui/SplashScreen.vue b/apps/app-frontend/src/components/ui/SplashScreen.vue
similarity index 100%
rename from apps/app/src/components/ui/SplashScreen.vue
rename to apps/app-frontend/src/components/ui/SplashScreen.vue
diff --git a/apps/app/src/components/ui/URLConfirmModal.vue b/apps/app-frontend/src/components/ui/URLConfirmModal.vue
similarity index 100%
rename from apps/app/src/components/ui/URLConfirmModal.vue
rename to apps/app-frontend/src/components/ui/URLConfirmModal.vue
diff --git a/apps/app/src/components/ui/tutorial/GalleryImage.vue b/apps/app-frontend/src/components/ui/tutorial/GalleryImage.vue
similarity index 100%
rename from apps/app/src/components/ui/tutorial/GalleryImage.vue
rename to apps/app-frontend/src/components/ui/tutorial/GalleryImage.vue
diff --git a/apps/app/src/components/ui/tutorial/LoginCard.vue b/apps/app-frontend/src/components/ui/tutorial/LoginCard.vue
similarity index 100%
rename from apps/app/src/components/ui/tutorial/LoginCard.vue
rename to apps/app-frontend/src/components/ui/tutorial/LoginCard.vue
diff --git a/apps/app/src/components/ui/tutorial/ModrinthLoginScreen.vue b/apps/app-frontend/src/components/ui/tutorial/ModrinthLoginScreen.vue
similarity index 100%
rename from apps/app/src/components/ui/tutorial/ModrinthLoginScreen.vue
rename to apps/app-frontend/src/components/ui/tutorial/ModrinthLoginScreen.vue
diff --git a/apps/app/src/components/ui/tutorial/OnboardingScreen.vue b/apps/app-frontend/src/components/ui/tutorial/OnboardingScreen.vue
similarity index 100%
rename from apps/app/src/components/ui/tutorial/OnboardingScreen.vue
rename to apps/app-frontend/src/components/ui/tutorial/OnboardingScreen.vue
diff --git a/apps/app/src/components/ui/tutorial/StickyTitleBar.vue b/apps/app-frontend/src/components/ui/tutorial/StickyTitleBar.vue
similarity index 100%
rename from apps/app/src/components/ui/tutorial/StickyTitleBar.vue
rename to apps/app-frontend/src/components/ui/tutorial/StickyTitleBar.vue
diff --git a/apps/app/src/helpers/auth.js b/apps/app-frontend/src/helpers/auth.js
similarity index 100%
rename from apps/app/src/helpers/auth.js
rename to apps/app-frontend/src/helpers/auth.js
diff --git a/apps/app/src/helpers/events.js b/apps/app-frontend/src/helpers/events.js
similarity index 100%
rename from apps/app/src/helpers/events.js
rename to apps/app-frontend/src/helpers/events.js
diff --git a/apps/app/src/helpers/fetch.js b/apps/app-frontend/src/helpers/fetch.js
similarity index 100%
rename from apps/app/src/helpers/fetch.js
rename to apps/app-frontend/src/helpers/fetch.js
diff --git a/apps/app/src/helpers/import.js b/apps/app-frontend/src/helpers/import.js
similarity index 100%
rename from apps/app/src/helpers/import.js
rename to apps/app-frontend/src/helpers/import.js
diff --git a/apps/app/src/helpers/jre.js b/apps/app-frontend/src/helpers/jre.js
similarity index 100%
rename from apps/app/src/helpers/jre.js
rename to apps/app-frontend/src/helpers/jre.js
diff --git a/apps/app/src/helpers/logs.js b/apps/app-frontend/src/helpers/logs.js
similarity index 100%
rename from apps/app/src/helpers/logs.js
rename to apps/app-frontend/src/helpers/logs.js
diff --git a/apps/app/src/helpers/metadata.js b/apps/app-frontend/src/helpers/metadata.js
similarity index 100%
rename from apps/app/src/helpers/metadata.js
rename to apps/app-frontend/src/helpers/metadata.js
diff --git a/apps/app/src/helpers/mixpanel.js b/apps/app-frontend/src/helpers/mixpanel.js
similarity index 100%
rename from apps/app/src/helpers/mixpanel.js
rename to apps/app-frontend/src/helpers/mixpanel.js
diff --git a/apps/app/src/helpers/mr_auth.js b/apps/app-frontend/src/helpers/mr_auth.js
similarity index 100%
rename from apps/app/src/helpers/mr_auth.js
rename to apps/app-frontend/src/helpers/mr_auth.js
diff --git a/apps/app/src/helpers/pack.js b/apps/app-frontend/src/helpers/pack.js
similarity index 100%
rename from apps/app/src/helpers/pack.js
rename to apps/app-frontend/src/helpers/pack.js
diff --git a/apps/app/src/helpers/process.js b/apps/app-frontend/src/helpers/process.js
similarity index 100%
rename from apps/app/src/helpers/process.js
rename to apps/app-frontend/src/helpers/process.js
diff --git a/apps/app/src/helpers/profile.js b/apps/app-frontend/src/helpers/profile.js
similarity index 100%
rename from apps/app/src/helpers/profile.js
rename to apps/app-frontend/src/helpers/profile.js
diff --git a/apps/app/src/helpers/settings.js b/apps/app-frontend/src/helpers/settings.js
similarity index 100%
rename from apps/app/src/helpers/settings.js
rename to apps/app-frontend/src/helpers/settings.js
diff --git a/apps/app/src/helpers/state.js b/apps/app-frontend/src/helpers/state.js
similarity index 100%
rename from apps/app/src/helpers/state.js
rename to apps/app-frontend/src/helpers/state.js
diff --git a/apps/app/src/helpers/tags.js b/apps/app-frontend/src/helpers/tags.js
similarity index 100%
rename from apps/app/src/helpers/tags.js
rename to apps/app-frontend/src/helpers/tags.js
diff --git a/apps/app/src/helpers/utils.js b/apps/app-frontend/src/helpers/utils.js
similarity index 100%
rename from apps/app/src/helpers/utils.js
rename to apps/app-frontend/src/helpers/utils.js
diff --git a/apps/app/src/main.js b/apps/app-frontend/src/main.js
similarity index 100%
rename from apps/app/src/main.js
rename to apps/app-frontend/src/main.js
diff --git a/apps/app/src/mixins/macCssFix.js b/apps/app-frontend/src/mixins/macCssFix.js
similarity index 100%
rename from apps/app/src/mixins/macCssFix.js
rename to apps/app-frontend/src/mixins/macCssFix.js
diff --git a/apps/app/src/pages/Browse.vue b/apps/app-frontend/src/pages/Browse.vue
similarity index 100%
rename from apps/app/src/pages/Browse.vue
rename to apps/app-frontend/src/pages/Browse.vue
diff --git a/apps/app/src/pages/Index.vue b/apps/app-frontend/src/pages/Index.vue
similarity index 100%
rename from apps/app/src/pages/Index.vue
rename to apps/app-frontend/src/pages/Index.vue
diff --git a/apps/app/src/pages/Library.vue b/apps/app-frontend/src/pages/Library.vue
similarity index 100%
rename from apps/app/src/pages/Library.vue
rename to apps/app-frontend/src/pages/Library.vue
diff --git a/apps/app/src/pages/Settings.vue b/apps/app-frontend/src/pages/Settings.vue
similarity index 100%
rename from apps/app/src/pages/Settings.vue
rename to apps/app-frontend/src/pages/Settings.vue
diff --git a/apps/app/src/pages/index.js b/apps/app-frontend/src/pages/index.js
similarity index 100%
rename from apps/app/src/pages/index.js
rename to apps/app-frontend/src/pages/index.js
diff --git a/apps/app/src/pages/instance/Index.vue b/apps/app-frontend/src/pages/instance/Index.vue
similarity index 100%
rename from apps/app/src/pages/instance/Index.vue
rename to apps/app-frontend/src/pages/instance/Index.vue
diff --git a/apps/app/src/pages/instance/Logs.vue b/apps/app-frontend/src/pages/instance/Logs.vue
similarity index 100%
rename from apps/app/src/pages/instance/Logs.vue
rename to apps/app-frontend/src/pages/instance/Logs.vue
diff --git a/apps/app/src/pages/instance/Mods.vue b/apps/app-frontend/src/pages/instance/Mods.vue
similarity index 100%
rename from apps/app/src/pages/instance/Mods.vue
rename to apps/app-frontend/src/pages/instance/Mods.vue
diff --git a/apps/app/src/pages/instance/Options.vue b/apps/app-frontend/src/pages/instance/Options.vue
similarity index 100%
rename from apps/app/src/pages/instance/Options.vue
rename to apps/app-frontend/src/pages/instance/Options.vue
diff --git a/apps/app/src/pages/instance/index.js b/apps/app-frontend/src/pages/instance/index.js
similarity index 100%
rename from apps/app/src/pages/instance/index.js
rename to apps/app-frontend/src/pages/instance/index.js
diff --git a/apps/app/src/pages/project/Changelog.vue b/apps/app-frontend/src/pages/project/Changelog.vue
similarity index 100%
rename from apps/app/src/pages/project/Changelog.vue
rename to apps/app-frontend/src/pages/project/Changelog.vue
diff --git a/apps/app/src/pages/project/Description.vue b/apps/app-frontend/src/pages/project/Description.vue
similarity index 100%
rename from apps/app/src/pages/project/Description.vue
rename to apps/app-frontend/src/pages/project/Description.vue
diff --git a/apps/app/src/pages/project/Gallery.vue b/apps/app-frontend/src/pages/project/Gallery.vue
similarity index 100%
rename from apps/app/src/pages/project/Gallery.vue
rename to apps/app-frontend/src/pages/project/Gallery.vue
diff --git a/apps/app/src/pages/project/Index.vue b/apps/app-frontend/src/pages/project/Index.vue
similarity index 100%
rename from apps/app/src/pages/project/Index.vue
rename to apps/app-frontend/src/pages/project/Index.vue
diff --git a/apps/app/src/pages/project/Version.vue b/apps/app-frontend/src/pages/project/Version.vue
similarity index 100%
rename from apps/app/src/pages/project/Version.vue
rename to apps/app-frontend/src/pages/project/Version.vue
diff --git a/apps/app/src/pages/project/Versions.vue b/apps/app-frontend/src/pages/project/Versions.vue
similarity index 100%
rename from apps/app/src/pages/project/Versions.vue
rename to apps/app-frontend/src/pages/project/Versions.vue
diff --git a/apps/app/src/pages/project/index.js b/apps/app-frontend/src/pages/project/index.js
similarity index 100%
rename from apps/app/src/pages/project/index.js
rename to apps/app-frontend/src/pages/project/index.js
diff --git a/apps/app/src/routes.js b/apps/app-frontend/src/routes.js
similarity index 97%
rename from apps/app/src/routes.js
rename to apps/app-frontend/src/routes.js
index af5c5166a..26141adbe 100644
--- a/apps/app/src/routes.js
+++ b/apps/app-frontend/src/routes.js
@@ -139,10 +139,10 @@ export default new createRouter({
linkExactActiveClass: 'router-link-exact-active',
scrollBehavior() {
// Sometimes Vue's scroll behavior is not working as expected, so we need to manually scroll to top (especially on Linux)
- document.querySelector(".router-view").scrollTop = 0;
+ document.querySelector('.router-view').scrollTop = 0
return {
- el: ".router-view",
- top: 0
+ el: '.router-view',
+ top: 0,
}
},
})
diff --git a/apps/app/src/store/breadcrumbs.js b/apps/app-frontend/src/store/breadcrumbs.js
similarity index 100%
rename from apps/app/src/store/breadcrumbs.js
rename to apps/app-frontend/src/store/breadcrumbs.js
diff --git a/apps/app/src/store/error.js b/apps/app-frontend/src/store/error.js
similarity index 100%
rename from apps/app/src/store/error.js
rename to apps/app-frontend/src/store/error.js
diff --git a/apps/app/src/store/loading.js b/apps/app-frontend/src/store/loading.js
similarity index 100%
rename from apps/app/src/store/loading.js
rename to apps/app-frontend/src/store/loading.js
diff --git a/apps/app/src/store/notifications.js b/apps/app-frontend/src/store/notifications.js
similarity index 100%
rename from apps/app/src/store/notifications.js
rename to apps/app-frontend/src/store/notifications.js
diff --git a/apps/app/src/store/state.js b/apps/app-frontend/src/store/state.js
similarity index 100%
rename from apps/app/src/store/state.js
rename to apps/app-frontend/src/store/state.js
diff --git a/apps/app/src/store/theme.js b/apps/app-frontend/src/store/theme.js
similarity index 100%
rename from apps/app/src/store/theme.js
rename to apps/app-frontend/src/store/theme.js
diff --git a/apps/app/tsconfig.json b/apps/app-frontend/tsconfig.json
similarity index 100%
rename from apps/app/tsconfig.json
rename to apps/app-frontend/tsconfig.json
diff --git a/apps/app/vite.config.ts b/apps/app-frontend/vite.config.ts
similarity index 83%
rename from apps/app/vite.config.ts
rename to apps/app-frontend/vite.config.ts
index 4ced30952..fe9120d3c 100644
--- a/apps/app/vite.config.ts
+++ b/apps/app-frontend/vite.config.ts
@@ -32,7 +32,6 @@ export default defineConfig({
],
},
}),
- // eslint(),
],
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
@@ -48,11 +47,11 @@ export default defineConfig({
envPrefix: ['VITE_', 'TAURI_'],
build: {
// Tauri supports es2021
- target: process.env.TAURI_PLATFORM == 'windows' ? 'chrome105' : 'safari13',
+ target: process.env.TAURI_PLATFORM == 'windows' ? 'chrome105' : 'safari13', // eslint-disable-line turbo/no-undeclared-env-vars
// don't minify for debug builds
- minify: !process.env.TAURI_DEBUG ? 'esbuild' : false,
+ minify: !process.env.TAURI_DEBUG ? 'esbuild' : false, // eslint-disable-line turbo/no-undeclared-env-vars
// produce sourcemaps for debug builds
- sourcemap: !!process.env.TAURI_DEBUG,
+ sourcemap: !!process.env.TAURI_DEBUG, // eslint-disable-line turbo/no-undeclared-env-vars
commonjsOptions: {
esmExternals: true,
},
diff --git a/apps/app-playground/package.json b/apps/app-playground/package.json
new file mode 100644
index 000000000..4e4825b84
--- /dev/null
+++ b/apps/app-playground/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "@modrinth/app-playground",
+ "scripts": {
+ "build": "cargo build --release",
+ "lint": "cargo fmt --check && cargo clippy -- -D warnings",
+ "fix": "cargo fmt && cargo clippy --fix",
+ "dev": "cargo run",
+ "test": "cargo test"
+ }
+}
diff --git a/apps/app/.eslintrc.json b/apps/app/.eslintrc.json
deleted file mode 100644
index 5a3cab20b..000000000
--- a/apps/app/.eslintrc.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "env": {
- "browser": true,
- "es2021": true,
- "node": true
- },
- "extends": ["eslint:recommended", "plugin:vue/vue3-recommended", "prettier"],
- "parserOptions": {
- "ecmaVersion": "latest",
- "sourceType": "module"
- },
- "plugins": ["vue"],
- "rules": {
- "no-console": "off",
- "vue/no-v-html": "off",
- "comma-dangle": ["error", "only-multiline"],
- "vue/comment-directive": "off",
- "vue/multi-word-component-names": "off",
- "import/no-named-as-default": "off"
- }
-}
diff --git a/apps/app/src-tauri/.gitignore b/apps/app/.gitignore
similarity index 100%
rename from apps/app/src-tauri/.gitignore
rename to apps/app/.gitignore
diff --git a/apps/app/src-tauri/App.entitlements b/apps/app/App.entitlements
similarity index 100%
rename from apps/app/src-tauri/App.entitlements
rename to apps/app/App.entitlements
diff --git a/apps/app/src-tauri/Cargo.toml b/apps/app/Cargo.toml
similarity index 84%
rename from apps/app/src-tauri/Cargo.toml
rename to apps/app/Cargo.toml
index c6dabc91b..572b13ba7 100644
--- a/apps/app/src-tauri/Cargo.toml
+++ b/apps/app/Cargo.toml
@@ -14,12 +14,12 @@ build = "build.rs"
tauri-build = { version = "1.3", features = [] }
[dependencies]
-theseus = { path = "../../../packages/app-lib", features = ["tauri"] }
+theseus = { path = "../../packages/app-lib", features = ["tauri"] }
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
-tauri = { version = "1.6", features = ["app-all", "devtools", "dialog", "dialog-confirm", "dialog-open", "macos-private-api", "os-all", "protocol-asset", "shell-open", "updater", "window-close", "window-create", "window-hide", "window-maximize", "window-minimize", "window-set-decorations", "window-show", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
+tauri = { version = "1.6", features = ["app-all", "devtools", "dialog", "dialog-confirm", "dialog-open", "macos-private-api", "os-all", "protocol-asset", "shell-open", "window-close", "window-create", "window-hide", "window-maximize", "window-minimize", "window-set-decorations", "window-show", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-deep-link = "0.1.2"
diff --git a/apps/app/src-tauri/Info.plist b/apps/app/Info.plist
similarity index 100%
rename from apps/app/src-tauri/Info.plist
rename to apps/app/Info.plist
diff --git a/apps/app/README.md b/apps/app/README.md
index 8c05e6887..ad45b2635 100644
--- a/apps/app/README.md
+++ b/apps/app/README.md
@@ -23,7 +23,7 @@ Follow these steps to set up your development environment:
```bash
pnpm install
-cargo tauri dev # `pnpm app:dev` is currently broken, contributions welcome!
+pnpm app:dev
```
You should now have a development build of the app running with hot-reloading enabled. Any changes you make to the code will automatically refresh the app.
diff --git a/apps/app/src-tauri/build.rs b/apps/app/build.rs
similarity index 100%
rename from apps/app/src-tauri/build.rs
rename to apps/app/build.rs
diff --git a/apps/app/src-tauri/icons/128x128.png b/apps/app/icons/128x128.png
similarity index 100%
rename from apps/app/src-tauri/icons/128x128.png
rename to apps/app/icons/128x128.png
diff --git a/apps/app/src-tauri/icons/128x128@2x.png b/apps/app/icons/128x128@2x.png
similarity index 100%
rename from apps/app/src-tauri/icons/128x128@2x.png
rename to apps/app/icons/128x128@2x.png
diff --git a/apps/app/src-tauri/icons/Square107x107Logo.png b/apps/app/icons/Square107x107Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square107x107Logo.png
rename to apps/app/icons/Square107x107Logo.png
diff --git a/apps/app/src-tauri/icons/Square142x142Logo.png b/apps/app/icons/Square142x142Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square142x142Logo.png
rename to apps/app/icons/Square142x142Logo.png
diff --git a/apps/app/src-tauri/icons/Square150x150Logo.png b/apps/app/icons/Square150x150Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square150x150Logo.png
rename to apps/app/icons/Square150x150Logo.png
diff --git a/apps/app/src-tauri/icons/Square284x284Logo.png b/apps/app/icons/Square284x284Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square284x284Logo.png
rename to apps/app/icons/Square284x284Logo.png
diff --git a/apps/app/src-tauri/icons/Square30x30Logo.png b/apps/app/icons/Square30x30Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square30x30Logo.png
rename to apps/app/icons/Square30x30Logo.png
diff --git a/apps/app/src-tauri/icons/Square310x310Logo.png b/apps/app/icons/Square310x310Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square310x310Logo.png
rename to apps/app/icons/Square310x310Logo.png
diff --git a/apps/app/src-tauri/icons/Square44x44Logo.png b/apps/app/icons/Square44x44Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square44x44Logo.png
rename to apps/app/icons/Square44x44Logo.png
diff --git a/apps/app/src-tauri/icons/Square71x71Logo.png b/apps/app/icons/Square71x71Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square71x71Logo.png
rename to apps/app/icons/Square71x71Logo.png
diff --git a/apps/app/src-tauri/icons/Square89x89Logo.png b/apps/app/icons/Square89x89Logo.png
similarity index 100%
rename from apps/app/src-tauri/icons/Square89x89Logo.png
rename to apps/app/icons/Square89x89Logo.png
diff --git a/apps/app/src-tauri/icons/StoreLogo.png b/apps/app/icons/StoreLogo.png
similarity index 100%
rename from apps/app/src-tauri/icons/StoreLogo.png
rename to apps/app/icons/StoreLogo.png
diff --git a/apps/app/src-tauri/icons/favicon.ico b/apps/app/icons/favicon.ico
similarity index 100%
rename from apps/app/src-tauri/icons/favicon.ico
rename to apps/app/icons/favicon.ico
diff --git a/apps/app/src-tauri/icons/icon.icns b/apps/app/icons/icon.icns
similarity index 100%
rename from apps/app/src-tauri/icons/icon.icns
rename to apps/app/icons/icon.icns
diff --git a/apps/app/src-tauri/icons/icon.ico b/apps/app/icons/icon.ico
similarity index 100%
rename from apps/app/src-tauri/icons/icon.ico
rename to apps/app/icons/icon.ico
diff --git a/apps/app/src-tauri/icons/icon.png b/apps/app/icons/icon.png
similarity index 100%
rename from apps/app/src-tauri/icons/icon.png
rename to apps/app/icons/icon.png
diff --git a/apps/app/src-tauri/msi/main.wxs b/apps/app/msi/main.wxs
similarity index 100%
rename from apps/app/src-tauri/msi/main.wxs
rename to apps/app/msi/main.wxs
diff --git a/apps/app/package.json b/apps/app/package.json
index dda811ce1..a224af2a2 100644
--- a/apps/app/package.json
+++ b/apps/app/package.json
@@ -1,51 +1,17 @@
{
"name": "@modrinth/app",
- "private": true,
- "version": "0.7.2",
- "type": "module",
"scripts": {
- "vite:dev": "vite",
- "vite:build": "vite build",
- "vite:preview": "vite preview",
- "tauri": "tauri",
- "tauri:build": "tauri build",
- "tauri:dev": "tauri dev",
+ "build": "tauri build",
"dev": "tauri dev",
- "lint:js": "eslint --ext .js,.vue,.ts,.jsx,.tsx,.html,.vue .",
- "lint": "pnpm run lint:js && prettier --check .",
- "fix": "eslint --fix --ext .js,.vue,.ts,.jsx,.tsx,.html,.vue . && prettier --write ."
- },
- "dependencies": {
- "@modrinth/assets": "workspace:*",
- "@modrinth/ui": "workspace:*",
- "@modrinth/utils": "workspace:*",
- "@tauri-apps/api": "^1.5.3",
- "@vintl/vintl": "^4.4.1",
- "dayjs": "^1.11.10",
- "floating-vue": "^5.2.2",
- "mixpanel-browser": "^2.49.0",
- "ofetch": "^1.3.4",
- "omorphia": "^0.4.41",
- "pinia": "^2.1.7",
- "tauri-plugin-window-state-api": "github:tauri-apps/tauri-plugin-window-state#v1",
- "vite-svg-loader": "^5.1.0",
- "vue": "^3.4.21",
- "vue-multiselect": "3.0.0-beta.3",
- "vue-router": "4.3.0",
- "vue-virtual-scroller": "2.0.0-beta.8"
+ "test": "cargo test",
+ "lint": "cargo fmt --check && cargo clippy -- -D warnings",
+ "fix": "cargo fmt && cargo clippy --fix"
},
"devDependencies": {
- "@tauri-apps/cli": "^1.5.11",
- "@vitejs/plugin-vue": "^5.0.4",
- "eslint": "^8.57.0",
- "eslint-config-custom": "workspace:*",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-vue": "^9.24.0",
- "prettier": "^3.2.5",
- "sass": "^1.74.1",
- "tsconfig": "workspace:*",
- "vite": "^5.2.8",
- "vite-plugin-eslint": "^1.8.1"
+ "@tauri-apps/cli": "^1.6.0"
},
- "packageManager": "pnpm@9.4.0"
+ "dependencies": {
+ "@modrinth/app-lib": "workspace:*",
+ "@modrinth/app-frontend": "workspace:*"
+ }
}
diff --git a/apps/app/src-tauri/src/api/auth.rs b/apps/app/src/api/auth.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/auth.rs
rename to apps/app/src/api/auth.rs
diff --git a/apps/app/src-tauri/src/api/import.rs b/apps/app/src/api/import.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/import.rs
rename to apps/app/src/api/import.rs
diff --git a/apps/app/src-tauri/src/api/jre.rs b/apps/app/src/api/jre.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/jre.rs
rename to apps/app/src/api/jre.rs
diff --git a/apps/app/src-tauri/src/api/logs.rs b/apps/app/src/api/logs.rs
similarity index 92%
rename from apps/app/src-tauri/src/api/logs.rs
rename to apps/app/src/api/logs.rs
index e22a17aa4..213130866 100644
--- a/apps/app/src-tauri/src/api/logs.rs
+++ b/apps/app/src/api/logs.rs
@@ -1,9 +1,9 @@
use crate::api::Result;
+use theseus::logs::LogType;
use theseus::{
logs::{self, CensoredString, LatestLogCursor, Logs},
prelude::ProfilePathId,
};
-use theseus::logs::LogType;
/*
A log is a struct containing the filename string, stdout, and stderr, as follows:
@@ -67,7 +67,10 @@ pub async fn logs_get_output_by_filename(
.into());
};
- Ok(logs::get_output_by_filename(&profile_path, log_type, &filename).await?)
+ Ok(
+ logs::get_output_by_filename(&profile_path, log_type, &filename)
+ .await?,
+ )
}
/// Delete all logs for a profile by profile id
@@ -83,7 +86,10 @@ pub async fn logs_delete_logs_by_filename(
log_type: LogType,
filename: String,
) -> Result<()> {
- Ok(logs::delete_logs_by_filename(profile_path, log_type, &filename).await?)
+ Ok(
+ logs::delete_logs_by_filename(profile_path, log_type, &filename)
+ .await?,
+ )
}
/// Get live log from a cursor
diff --git a/apps/app/src-tauri/src/api/metadata.rs b/apps/app/src/api/metadata.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/metadata.rs
rename to apps/app/src/api/metadata.rs
diff --git a/apps/app/src-tauri/src/api/mod.rs b/apps/app/src/api/mod.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/mod.rs
rename to apps/app/src/api/mod.rs
diff --git a/apps/app/src-tauri/src/api/mr_auth.rs b/apps/app/src/api/mr_auth.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/mr_auth.rs
rename to apps/app/src/api/mr_auth.rs
diff --git a/apps/app/src-tauri/src/api/pack.rs b/apps/app/src/api/pack.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/pack.rs
rename to apps/app/src/api/pack.rs
diff --git a/apps/app/src-tauri/src/api/process.rs b/apps/app/src/api/process.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/process.rs
rename to apps/app/src/api/process.rs
diff --git a/apps/app/src-tauri/src/api/profile.rs b/apps/app/src/api/profile.rs
similarity index 99%
rename from apps/app/src-tauri/src/api/profile.rs
rename to apps/app/src/api/profile.rs
index dd034f1fc..fe66a8d49 100644
--- a/apps/app/src-tauri/src/api/profile.rs
+++ b/apps/app/src/api/profile.rs
@@ -330,11 +330,11 @@ pub async fn profile_edit(
}
}
- prof.java = edit_profile.java.clone();
+ prof.java.clone_from(&edit_profile.java);
prof.memory = edit_profile.memory;
prof.resolution = edit_profile.resolution;
prof.fullscreen = edit_profile.fullscreen;
- prof.hooks = edit_profile.hooks.clone();
+ prof.hooks.clone_from(&edit_profile.hooks);
prof.metadata.date_modified = chrono::Utc::now();
diff --git a/apps/app/src-tauri/src/api/profile_create.rs b/apps/app/src/api/profile_create.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/profile_create.rs
rename to apps/app/src/api/profile_create.rs
diff --git a/apps/app/src-tauri/src/api/settings.rs b/apps/app/src/api/settings.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/settings.rs
rename to apps/app/src/api/settings.rs
diff --git a/apps/app/src-tauri/src/api/tags.rs b/apps/app/src/api/tags.rs
similarity index 100%
rename from apps/app/src-tauri/src/api/tags.rs
rename to apps/app/src/api/tags.rs
diff --git a/apps/app/src-tauri/src/api/utils.rs b/apps/app/src/api/utils.rs
similarity index 98%
rename from apps/app/src-tauri/src/api/utils.rs
rename to apps/app/src/api/utils.rs
index e7e7543df..ef7cb575a 100644
--- a/apps/app/src-tauri/src/api/utils.rs
+++ b/apps/app/src/api/utils.rs
@@ -37,6 +37,7 @@ pub fn get_os() -> OS {
os
}
#[derive(Debug, Clone, Serialize, Deserialize)]
+#[allow(clippy::enum_variant_names)]
pub enum OS {
Windows,
Linux,
@@ -99,14 +100,13 @@ pub fn show_in_folder(path: PathBuf) -> Result<()> {
#[cfg(target_os = "linux")]
{
use std::fs::metadata;
- use std::path::PathBuf;
if path.to_string_lossy().to_string().contains(',') {
// see https://gitlab.freedesktop.org/dbus/dbus/-/issues/76
let new_path = match metadata(&path)?.is_dir() {
true => path,
false => {
- let mut path2 = PathBuf::from(path);
+ let mut path2 = path.clone();
path2.pop();
path2
}
diff --git a/apps/app/src-tauri/src/error.rs b/apps/app/src/error.rs
similarity index 100%
rename from apps/app/src-tauri/src/error.rs
rename to apps/app/src/error.rs
diff --git a/apps/app/src-tauri/src/macos/delegate.rs b/apps/app/src/macos/delegate.rs
similarity index 100%
rename from apps/app/src-tauri/src/macos/delegate.rs
rename to apps/app/src/macos/delegate.rs
diff --git a/apps/app/src-tauri/src/macos/mod.rs b/apps/app/src/macos/mod.rs
similarity index 100%
rename from apps/app/src-tauri/src/macos/mod.rs
rename to apps/app/src/macos/mod.rs
diff --git a/apps/app/src-tauri/src/macos/window_ext.rs b/apps/app/src/macos/window_ext.rs
similarity index 100%
rename from apps/app/src-tauri/src/macos/window_ext.rs
rename to apps/app/src/macos/window_ext.rs
diff --git a/apps/app/src-tauri/src/main.rs b/apps/app/src/main.rs
similarity index 100%
rename from apps/app/src-tauri/src/main.rs
rename to apps/app/src/main.rs
diff --git a/apps/app/src-tauri/tauri.conf.json b/apps/app/tauri.conf.json
similarity index 85%
rename from apps/app/src-tauri/tauri.conf.json
rename to apps/app/tauri.conf.json
index fef2e67c7..0cb4c834d 100644
--- a/apps/app/src-tauri/tauri.conf.json
+++ b/apps/app/tauri.conf.json
@@ -1,9 +1,9 @@
{
"build": {
- "beforeDevCommand": "pnpm run --filter=@modrinth/app vite:dev",
- "beforeBuildCommand": "pnpm build",
+ "beforeDevCommand": "pnpm turbo run dev --filter=@modrinth/app-frontend",
+ "beforeBuildCommand": "pnpm turbo run build --filter=@modrinth/app-frontend",
"devPath": "http://localhost:1420",
- "distDir": "../../../dist/apps/app",
+ "distDir": "../app-frontend/dist",
"withGlobalTauri": false
},
"package": {
@@ -81,10 +81,7 @@
"csp": "default-src 'self'; connect-src https://modrinth.com https://*.modrinth.com https://mixpanel.com https://*.mixpanel.com https://*.cloudflare.com https://api.mclo.gs; font-src https://cdn-raw.modrinth.com/fonts/inter/; img-src tauri: https: data: blob: 'unsafe-inline' asset: https://asset.localhost; script-src https://*.cloudflare.com 'self'; frame-src https://*.cloudflare.com https://www.youtube.com https://www.youtube-nocookie.com https://discord.com 'self'; style-src unsafe-inline 'self'"
},
"updater": {
- "active": true,
- "endpoints": ["https://launcher-files.modrinth.com/updates.json"],
- "dialog": true,
- "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDIwMzM5QkE0M0FCOERBMzkKUldRNTJyZzZwSnN6SUdPRGdZREtUUGxMblZqeG9OVHYxRUlRTzJBc2U3MUNJaDMvZDQ1UytZZmYK"
+ "active": false
},
"windows": [
{
diff --git a/apps/app/src-tauri/tauri.macos.conf.json b/apps/app/tauri.macos.conf.json
similarity index 100%
rename from apps/app/src-tauri/tauri.macos.conf.json
rename to apps/app/tauri.macos.conf.json
diff --git a/apps/frontend/.env b/apps/frontend/.env
deleted file mode 100644
index 83c6a27b4..000000000
--- a/apps/frontend/.env
+++ /dev/null
@@ -1,3 +0,0 @@
-BASE_URL=https://api.modrinth.com/v2/
-BROWSER_BASE_URL=https://api.modrinth.com/v2/
-PYRO_BASE_URL=https://39d5-144-172-172-236.ngrok-free.app/
\ No newline at end of file
diff --git a/apps/frontend/.eslintrc.cjs b/apps/frontend/.eslintrc.cjs
new file mode 100644
index 000000000..631f74037
--- /dev/null
+++ b/apps/frontend/.eslintrc.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ root: true,
+ extends: ["custom/nuxt"],
+};
diff --git a/apps/frontend/.eslintrc.json b/apps/frontend/.eslintrc.json
deleted file mode 100644
index 52fb09d51..000000000
--- a/apps/frontend/.eslintrc.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "extends": ["@nuxt/eslint-config", "plugin:prettier/recommended", "prettier"],
- "env": {
- "browser": true,
- "node": true
- },
- "ignorePatterns": [".nuxt/**", ".output/**", "node_modules"],
- "overrides": [
- {
- "files": ["*.ts", "*.tsx", "*.js", "*.jsx", "*.vue"],
- "rules": {
- "no-console": "off",
- "vue/no-v-html": "off",
- "vue/multi-word-component-names": "off"
- }
- }
- ]
-}
diff --git a/apps/frontend/.prettierignore b/apps/frontend/.prettierignore
index 951dbd850..4987eb4d5 100644
--- a/apps/frontend/.prettierignore
+++ b/apps/frontend/.prettierignore
@@ -1,3 +1,4 @@
**/.nuxt
**/dist
-**/node_modules
\ No newline at end of file
+**/.output
+src/generated/**
diff --git a/apps/frontend/nuxt.config.ts b/apps/frontend/nuxt.config.ts
index d9f98a62e..eb44320f0 100644
--- a/apps/frontend/nuxt.config.ts
+++ b/apps/frontend/nuxt.config.ts
@@ -1,4 +1,3 @@
-/* eslint-disable no-extra-semi */
import { promises as fs } from "fs";
import { pathToFileURL } from "node:url";
import svgLoader from "vite-svg-loader";
@@ -374,9 +373,6 @@ export default defineNuxtConfig({
},
nitro: {
moduleSideEffects: ["@vintl/compact-number/locale-data"],
- output: {
- dir: "../../dist/apps/knossos/.output",
- },
},
devtools: {
enabled: true,
diff --git a/apps/frontend/package.json b/apps/frontend/package.json
index 17df4b575..90b5877e0 100644
--- a/apps/frontend/package.json
+++ b/apps/frontend/package.json
@@ -8,40 +8,26 @@
"generate": "nuxi generate",
"preview": "nuxi preview",
"postinstall": "nuxi prepare",
- "lint:js": "eslint ./src --ext .js,.vue,.ts",
- "lint": "npm run lint:js && prettier --check .",
+ "lint": "eslint . && prettier --check .",
"fix": "eslint . --fix && prettier --write .",
"intl:extract": "formatjs extract \"{,components,composables,layouts,middleware,modules,pages,plugins,utils}/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" --ignore '**/*.d.ts' --ignore 'node_modules' --out-file locales/en-US/index.json --format crowdin --preserve-whitespace"
},
"devDependencies": {
- "@formatjs/cli": "^6.1.2",
+ "eslint": "^8.57.0",
"@nuxt/devtools": "^1.3.3",
- "@nuxt/eslint-config": "^0.3.13",
- "@nuxtjs/eslint-config-typescript": "^12.1.0",
"@nuxtjs/turnstile": "^0.8.0",
"@types/node": "^20.1.0",
- "@typescript-eslint/eslint-plugin": "^7.15.0",
- "@typescript-eslint/parser": "^7.15.0",
"@vintl/compact-number": "^2.0.5",
"@vintl/how-ago": "^3.0.1",
"@vintl/nuxt": "^1.8.0",
"autoprefixer": "^10.4.19",
- "eslint": "^8.41.0",
- "eslint-config-custom": "workspace:*",
- "eslint-config-prettier": "^9.1.0",
- "eslint-import-resolver-typescript": "^3.5.5",
- "eslint-plugin-import": "^2.27.5",
- "eslint-plugin-prettier": "^5.1.3",
- "eslint-plugin-vue": "^9.27.0",
"glob": "^10.2.7",
"nuxt": "^3.12.3",
"postcss": "^8.4.39",
- "prettier": "^3.3.2",
"prettier-plugin-tailwindcss": "^0.6.5",
"sass": "^1.58.0",
"tailwindcss": "^3.4.4",
"typescript": "^5.4.5",
- "vite-plugin-eslint": "^1.8.1",
"vite-svg-loader": "^5.1.0",
"vue-tsc": "^2.0.24"
},
@@ -66,10 +52,5 @@
"vue-multiselect": "3.0.0-alpha.2",
"vue3-apexcharts": "^1.5.2",
"xss": "^1.0.14"
- },
- "pnpm": {
- "patchedDependencies": {
- "readable-stream@2.3.8": "patches/readable-stream@2.3.8.patch"
- }
}
}
diff --git a/apps/frontend/src/components/ui/Badge.vue b/apps/frontend/src/components/ui/Badge.vue
index 7ce5937df..9114aca14 100644
--- a/apps/frontend/src/components/ui/Badge.vue
+++ b/apps/frontend/src/components/ui/Badge.vue
@@ -1,5 +1,5 @@
-
+
{{ $capitalizeString(type) }}
diff --git a/apps/frontend/src/composables/auth.js b/apps/frontend/src/composables/auth.js
index c2eeadd50..e5483cf2b 100644
--- a/apps/frontend/src/composables/auth.js
+++ b/apps/frontend/src/composables/auth.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useAuth = async (oldToken = null) => {
const auth = useState("auth", () => ({
user: null,
diff --git a/apps/frontend/src/composables/auth/scopes.ts b/apps/frontend/src/composables/auth/scopes.ts
index 685e5ca72..a9c54de0b 100644
--- a/apps/frontend/src/composables/auth/scopes.ts
+++ b/apps/frontend/src/composables/auth/scopes.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/no-unused-vars */
export const scopeMessages = defineMessages({
userReadEmailLabel: {
id: "scopes.userReadEmail.label",
diff --git a/apps/frontend/src/composables/cosmetics.js b/apps/frontend/src/composables/cosmetics.js
index eb0de56ea..294c8882b 100644
--- a/apps/frontend/src/composables/cosmetics.js
+++ b/apps/frontend/src/composables/cosmetics.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useCosmetics = () =>
useState("cosmetics", () => {
const cosmetics = useCookie("cosmetics", {
diff --git a/apps/frontend/src/composables/date.js b/apps/frontend/src/composables/date.js
index 226826ae7..36eb8c620 100644
--- a/apps/frontend/src/composables/date.js
+++ b/apps/frontend/src/composables/date.js
@@ -1,8 +1,7 @@
-/* eslint-disable no-undef */
import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
-dayjs.extend(relativeTime);
+dayjs.extend(relativeTime); // eslint-disable-line import/no-named-as-default-member
export const useCurrentDate = () => useState("currentDate", () => Date.now());
diff --git a/apps/frontend/src/composables/fetch.js b/apps/frontend/src/composables/fetch.js
index 2cba6cb09..3529c018b 100644
--- a/apps/frontend/src/composables/fetch.js
+++ b/apps/frontend/src/composables/fetch.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useBaseFetch = async (url, options = {}, skipAuth = false) => {
const config = useRuntimeConfig();
let base = process.server ? config.apiBaseUrl : config.public.apiBaseUrl;
diff --git a/apps/frontend/src/composables/loading.js b/apps/frontend/src/composables/loading.js
index 121cc293a..eab1ef626 100644
--- a/apps/frontend/src/composables/loading.js
+++ b/apps/frontend/src/composables/loading.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useLoading = () => useState("loading", () => false);
export const startLoading = () => {
diff --git a/apps/frontend/src/composables/notifs.js b/apps/frontend/src/composables/notifs.js
index f5da04b21..292832b8a 100644
--- a/apps/frontend/src/composables/notifs.js
+++ b/apps/frontend/src/composables/notifs.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useNotifications = () => useState("notifications", () => []);
export const addNotification = (notification) => {
diff --git a/apps/frontend/src/composables/route-params.js b/apps/frontend/src/composables/route-params.js
index 6bb4348b4..848957821 100644
--- a/apps/frontend/src/composables/route-params.js
+++ b/apps/frontend/src/composables/route-params.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
/**
* Extracts the [id] from the route params and returns it as a ref.
*
diff --git a/apps/frontend/src/composables/tag.js b/apps/frontend/src/composables/tag.js
index 2400e2c4b..e836a0469 100644
--- a/apps/frontend/src/composables/tag.js
+++ b/apps/frontend/src/composables/tag.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
import tags from "~/generated/state.json";
export const useTags = () =>
diff --git a/apps/frontend/src/composables/theme.js b/apps/frontend/src/composables/theme.js
index b67824739..f2401e12b 100644
--- a/apps/frontend/src/composables/theme.js
+++ b/apps/frontend/src/composables/theme.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useTheme = () =>
useState("theme", () => {
const colorMode = useCookie("color-mode", {
diff --git a/apps/frontend/src/composables/user.js b/apps/frontend/src/composables/user.js
index d7ffd6da6..e28b96938 100644
--- a/apps/frontend/src/composables/user.js
+++ b/apps/frontend/src/composables/user.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const useUser = async (force = false) => {
const user = useState("user", () => {});
diff --git a/apps/frontend/src/helpers/infer.js b/apps/frontend/src/helpers/infer.js
index 7573b9700..bfa80dcdb 100644
--- a/apps/frontend/src/helpers/infer.js
+++ b/apps/frontend/src/helpers/infer.js
@@ -97,7 +97,7 @@ export const inferVersionInfo = async function (rawFile, project, gameVersions)
const inferFunctions = {
// Forge 1.13+ and NeoForge
"META-INF/mods.toml": async (file, zip) => {
- const metadata = TOML.parse(file, { joiner: "\n" });
+ const metadata = TOML.parse(file, { joiner: "\n" }); // eslint-disable-line import/no-named-as-default-member
if (metadata.mods && metadata.mods.length > 0) {
let versionNum = metadata.mods[0].version;
diff --git a/apps/frontend/src/helpers/notifications.js b/apps/frontend/src/helpers/notifications.js
index c9b761556..e499e9e2e 100644
--- a/apps/frontend/src/helpers/notifications.js
+++ b/apps/frontend/src/helpers/notifications.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
import { useNuxtApp } from "#imports";
async function getBulk(type, ids, apiVersion = 2) {
diff --git a/apps/frontend/src/helpers/package.js b/apps/frontend/src/helpers/package.js
index 5846e4794..931cfef9e 100644
--- a/apps/frontend/src/helpers/package.js
+++ b/apps/frontend/src/helpers/package.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
import JSZip from "jszip";
import TOML from "@ltd/j-toml";
@@ -132,7 +131,7 @@ export const createDataPackVersion = async function (
primaryZipReader.file("quilt.mod.json", JSON.stringify(quiltModJson));
}
if (loaders.includes("forge")) {
- primaryZipReader.file("META-INF/mods.toml", TOML.stringify(forgeModsToml, { newline: "\n" }));
+ primaryZipReader.file("META-INF/mods.toml", TOML.stringify(forgeModsToml, { newline: "\n" })); // eslint-disable-line import/no-named-as-default-member
}
if (!newForge && loaders.includes("forge")) {
diff --git a/apps/frontend/src/helpers/projects.js b/apps/frontend/src/helpers/projects.js
index ce27f020b..26de17772 100644
--- a/apps/frontend/src/helpers/projects.js
+++ b/apps/frontend/src/helpers/projects.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const getProjectTypeForUrl = (type, categories) => {
return getProjectTypeForUrlShorthand(type, categories);
};
diff --git a/apps/frontend/src/helpers/teams.js b/apps/frontend/src/helpers/teams.js
index 54cfd86e4..bf3f32818 100644
--- a/apps/frontend/src/helpers/teams.js
+++ b/apps/frontend/src/helpers/teams.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
export const acceptTeamInvite = async (teamId) => {
await useBaseFetch(`team/${teamId}/join`, {
apiVersion: 3,
diff --git a/apps/frontend/src/middleware/auth.js b/apps/frontend/src/middleware/auth.js
index d90468ecf..6244ee721 100644
--- a/apps/frontend/src/middleware/auth.js
+++ b/apps/frontend/src/middleware/auth.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
const whitelistedParams = ["flow", "error"];
export default defineNuxtRouteMiddleware(async (_to, from) => {
diff --git a/apps/frontend/src/pages/dashboard/revenue/transfers.vue b/apps/frontend/src/pages/dashboard/revenue/transfers.vue
index 5e8bc0407..d2fc96c7c 100644
--- a/apps/frontend/src/pages/dashboard/revenue/transfers.vue
+++ b/apps/frontend/src/pages/dashboard/revenue/transfers.vue
@@ -94,10 +94,9 @@
diff --git a/packages/ui/src/components/base/Button.vue b/packages/ui/src/components/base/Button.vue
index c7f9eedcc..c8c24f334 100644
--- a/packages/ui/src/components/base/Button.vue
+++ b/packages/ui/src/components/base/Button.vue
@@ -46,7 +46,7 @@ const props = defineProps({
})
const accentedButton = computed(() =>
- ['danger', 'primary', 'red', 'orange', 'green', 'blue', 'purple', 'gray'].includes(props.color)
+ ['danger', 'primary', 'red', 'orange', 'green', 'blue', 'purple', 'gray'].includes(props.color),
)
diff --git a/packages/ui/src/components/base/Card.vue b/packages/ui/src/components/base/Card.vue
index 70afbe09c..db7c5fb9f 100644
--- a/packages/ui/src/components/base/Card.vue
+++ b/packages/ui/src/components/base/Card.vue
@@ -13,7 +13,7 @@ const props = withDefaults(
collapsible: false,
defaultCollapsed: false,
noAutoBody: false,
- }
+ },
)
const state = reactive({
diff --git a/packages/ui/src/components/base/Checkbox.vue b/packages/ui/src/components/base/Checkbox.vue
index 1224d37fb..6eaf37f18 100644
--- a/packages/ui/src/components/base/Checkbox.vue
+++ b/packages/ui/src/components/base/Checkbox.vue
@@ -46,7 +46,7 @@ const props = withDefaults(
modelValue: false,
clickEvent: () => {},
collapsingToggleStyle: false,
- }
+ },
)
function toggle() {
@@ -89,7 +89,9 @@ function toggle() {
color: var(--color-contrast);
background-color: var(--color-button-bg);
border-radius: var(--radius-xs);
- box-shadow: var(--shadow-inset-sm), 0 0 0 0 transparent;
+ box-shadow:
+ var(--shadow-inset-sm),
+ 0 0 0 0 transparent;
&.checked {
background-color: var(--color-brand);
diff --git a/packages/ui/src/components/base/Chips.vue b/packages/ui/src/components/base/Chips.vue
index f241116f1..280958cca 100644
--- a/packages/ui/src/components/base/Chips.vue
+++ b/packages/ui/src/components/base/Chips.vue
@@ -95,7 +95,9 @@ export default defineComponent({
.selected {
color: var(--color-contrast);
background-color: var(--color-brand-highlight);
- box-shadow: inset 0 0 0 transparent, 0 0 0 2px var(--color-brand);
+ box-shadow:
+ inset 0 0 0 transparent,
+ 0 0 0 2px var(--color-brand);
}
}
diff --git a/packages/ui/src/components/base/CopyCode.vue b/packages/ui/src/components/base/CopyCode.vue
index 344c16876..9c1467799 100644
--- a/packages/ui/src/components/base/CopyCode.vue
+++ b/packages/ui/src/components/base/CopyCode.vue
@@ -39,7 +39,10 @@ async function copyText() {
width: min-content;
border-radius: 10px;
user-select: text;
- transition: opacity 0.5s ease-in-out, filter 0.2s ease-in-out, transform 0.05s ease-in-out,
+ transition:
+ opacity 0.5s ease-in-out,
+ filter 0.2s ease-in-out,
+ transform 0.05s ease-in-out,
outline 0.2s ease-in-out;
@media (prefers-reduced-motion) {
diff --git a/packages/ui/src/components/base/DropArea.vue b/packages/ui/src/components/base/DropArea.vue
index 41a457198..505046415 100644
--- a/packages/ui/src/components/base/DropArea.vue
+++ b/packages/ui/src/components/base/DropArea.vue
@@ -21,7 +21,7 @@ const props = withDefaults(
}>(),
{
accept: '*',
- }
+ },
)
const emit = defineEmits(['change'])
@@ -77,7 +77,9 @@ onMounted(() => {
z-index: 10;
visibility: hidden;
background-color: hsla(0, 0%, 0%, 0.5);
- transition: visibility 0.2s ease-in-out, background-color 0.1s ease-in-out;
+ transition:
+ visibility 0.2s ease-in-out,
+ background-color 0.1s ease-in-out;
display: flex;
&::before {
--indent: 4rem;
diff --git a/packages/ui/src/components/base/DropdownSelect.vue b/packages/ui/src/components/base/DropdownSelect.vue
index 558705675..0be782f83 100644
--- a/packages/ui/src/components/base/DropdownSelect.vue
+++ b/packages/ui/src/components/base/DropdownSelect.vue
@@ -125,7 +125,7 @@ watch(
() => props.modelValue,
(newValue) => {
selectedValue.value = newValue
- }
+ },
)
const toggleDropdown = () => {
@@ -212,7 +212,9 @@ const isChildOfDropdown = (element) => {
cursor: pointer;
user-select: none;
border-radius: var(--radius-md);
- box-shadow: var(--shadow-inset-sm), 0 0 0 0 transparent;
+ box-shadow:
+ var(--shadow-inset-sm),
+ 0 0 0 0 transparent;
transition: 0.05s;
@@ -253,7 +255,9 @@ const isChildOfDropdown = (element) => {
z-index: 10;
max-height: 18.75rem;
overflow-y: auto;
- box-shadow: var(--shadow-inset-sm), 0 0 0 0 transparent;
+ box-shadow:
+ var(--shadow-inset-sm),
+ 0 0 0 0 transparent;
.option {
background-color: var(--color-button-bg);
diff --git a/packages/ui/src/components/base/Notifications.vue b/packages/ui/src/components/base/Notifications.vue
index e377a52a2..53b18f2e7 100644
--- a/packages/ui/src/components/base/Notifications.vue
+++ b/packages/ui/src/components/base/Notifications.vue
@@ -28,7 +28,7 @@ defineExpose({
(x) =>
x.text === notification.text &&
x.title === notification.title &&
- x.type === notification.type
+ x.type === notification.type,
)
if (existingNotif) {
setNotificationTimer(existingNotif)
diff --git a/packages/ui/src/components/base/OverflowMenu.vue b/packages/ui/src/components/base/OverflowMenu.vue
index 44af8ab78..ba95dd9d1 100644
--- a/packages/ui/src/components/base/OverflowMenu.vue
+++ b/packages/ui/src/components/base/OverflowMenu.vue
@@ -47,8 +47,8 @@