From 1a9c7fa79191179661263c9341f17069ec199534 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Tue, 5 Aug 2025 16:09:47 +1000 Subject: [PATCH] Move frontend to `main` folder (#109) * feat: small refactor * fix: appimage build script * fix: add NO_STRIP to AppImage build * fix: build and dev mode from refactor * fix: submodule step 1 * fix: submodules step 2 --- desktop/.github/workflows/release.yml | 3 +- desktop/.gitignore | 5 +- desktop/.gitmodules | 9 +- desktop/build.mjs | 48 + desktop/composables/app-state.ts | 3 - desktop/{ => libs}/drop-base | 0 desktop/{ => main}/app.vue | 27 +- desktop/{ => main}/assets/main.scss | 0 desktop/{ => main}/assets/wallpaper.jpg | Bin .../components/GameOptions/Launch.vue | 0 .../components/GameOptionsModal.vue | 0 .../components/GameStatusButton.vue | 0 desktop/{ => main}/components/Header.vue | 2 +- .../{ => main}/components/HeaderButton.vue | 0 .../components/HeaderQueueWidget.vue | 0 .../components/HeaderUserWidget.vue | 4 +- .../{ => main}/components/HeaderWidget.vue | 0 .../components/InitiateAuthModule.vue | 0 .../{ => main}/components/LibrarySearch.vue | 0 .../components/LoadingIndicator.vue | 0 desktop/{ => main}/components/Logo.vue | 0 desktop/{ => main}/components/MiniHeader.vue | 0 .../components/OfflineHeaderWidget.vue | 0 desktop/{ => main}/components/PageWidget.vue | 0 .../{ => main}/components/WindowControl.vue | 0 desktop/{ => main}/components/Wordmark.vue | 0 desktop/main/composables/app-state.ts | 3 + .../composables/current-page-engine.ts | 0 desktop/{ => main}/composables/downloads.ts | 0 desktop/{ => main}/composables/game.ts | 0 .../composables/generateGameMeta.ts | 0 .../composables/state-navigation.ts | 8 +- desktop/{ => main}/composables/use-object.ts | 0 desktop/{ => main}/error.vue | 1 + desktop/{ => main}/layouts/default.vue | 0 desktop/{ => main}/layouts/mini.vue | 0 desktop/{ => main}/nuxt.config.ts | 6 +- desktop/main/package.json | 37 + desktop/{ => main}/pages/auth/code.vue | 0 desktop/{ => main}/pages/auth/failed.vue | 0 desktop/{ => main}/pages/auth/index.vue | 0 desktop/{ => main}/pages/auth/processing.vue | 0 desktop/{ => main}/pages/auth/signedout.vue | 0 .../pages/error/serverunavailable.vue | 0 desktop/{ => main}/pages/index.vue | 0 desktop/{ => main}/pages/library.vue | 0 .../{ => main}/pages/library/[id]/index.vue | 0 desktop/{ => main}/pages/library/index.vue | 0 desktop/{ => main}/pages/queue.vue | 0 desktop/{ => main}/pages/quit.vue | 0 desktop/{ => main}/pages/settings.vue | 0 desktop/{ => main}/pages/settings/account.vue | 0 desktop/{ => main}/pages/settings/debug.vue | 0 .../{ => main}/pages/settings/downloads.vue | 0 desktop/{ => main}/pages/settings/index.vue | 0 .../{ => main}/pages/settings/interface.vue | 0 desktop/{ => main}/pages/setup/index.vue | 0 desktop/{ => main}/pages/setup/server.vue | 0 desktop/{ => main}/pages/store/index.vue | 0 .../plugins/global-error-handler.ts | 0 desktop/{ => main}/plugins/vuedraggable.ts | 0 .../fonts/helvetica/Helvetica-Bold.woff | Bin .../helvetica/Helvetica-BoldOblique.woff | Bin .../fonts/helvetica/Helvetica-Oblique.woff | Bin .../public/fonts/helvetica/Helvetica.woff | Bin .../helvetica-compressed-5871d14b6903a.woff | Bin .../helvetica-light-587ebe5a59211.woff | Bin .../helvetica-light-587ebe5a59211.woff2 | Bin .../helvetica-rounded-bold-5871d05ead8de.woff | Bin .../fonts/inter/InterVariable-Italic.ttf | Bin .../public/fonts/inter/InterVariable.ttf | Bin .../fonts/motiva/MotivaSansBlack.woff.ttf | Bin .../fonts/motiva/MotivaSansBold.woff.ttf | Bin .../fonts/motiva/MotivaSansExtraBold.ttf | Bin .../fonts/motiva/MotivaSansLight.woff.ttf | Bin .../fonts/motiva/MotivaSansMedium.woff.ttf | Bin .../fonts/motiva/MotivaSansRegular.woff.ttf | Bin .../public/fonts/motiva/MotivaSansThin.ttf | Bin desktop/{ => main}/tailwind.config.js | 0 desktop/{ => main}/tsconfig.json | 0 desktop/{ => main}/types.ts | 0 desktop/main/yarn.lock | 8091 ++++++++++++++++ desktop/optimize-appimage.sh | 22 + desktop/package.json | 44 +- desktop/src-tauri/Cargo.lock | 28 +- desktop/src-tauri/Cargo.toml | 2 +- desktop/src-tauri/src/lib.rs | 2 +- desktop/src-tauri/tauri.conf.json | 10 +- desktop/yarn.lock | 8415 +---------------- 89 files changed, 8481 insertions(+), 8289 deletions(-) create mode 100644 desktop/build.mjs delete mode 100644 desktop/composables/app-state.ts rename desktop/{ => libs}/drop-base (100%) rename desktop/{ => main}/app.vue (75%) rename desktop/{ => main}/assets/main.scss (100%) rename desktop/{ => main}/assets/wallpaper.jpg (100%) rename desktop/{ => main}/components/GameOptions/Launch.vue (100%) rename desktop/{ => main}/components/GameOptionsModal.vue (100%) rename desktop/{ => main}/components/GameStatusButton.vue (100%) rename desktop/{ => main}/components/Header.vue (97%) rename desktop/{ => main}/components/HeaderButton.vue (100%) rename desktop/{ => main}/components/HeaderQueueWidget.vue (100%) rename desktop/{ => main}/components/HeaderUserWidget.vue (96%) rename desktop/{ => main}/components/HeaderWidget.vue (100%) rename desktop/{ => main}/components/InitiateAuthModule.vue (100%) rename desktop/{ => main}/components/LibrarySearch.vue (100%) rename desktop/{ => main}/components/LoadingIndicator.vue (100%) rename desktop/{ => main}/components/Logo.vue (100%) rename desktop/{ => main}/components/MiniHeader.vue (100%) rename desktop/{ => main}/components/OfflineHeaderWidget.vue (100%) rename desktop/{ => main}/components/PageWidget.vue (100%) rename desktop/{ => main}/components/WindowControl.vue (100%) rename desktop/{ => main}/components/Wordmark.vue (100%) create mode 100644 desktop/main/composables/app-state.ts rename desktop/{ => main}/composables/current-page-engine.ts (100%) rename desktop/{ => main}/composables/downloads.ts (100%) rename desktop/{ => main}/composables/game.ts (100%) rename desktop/{ => main}/composables/generateGameMeta.ts (100%) rename desktop/{ => main}/composables/state-navigation.ts (91%) rename desktop/{ => main}/composables/use-object.ts (100%) rename desktop/{ => main}/error.vue (99%) rename desktop/{ => main}/layouts/default.vue (100%) rename desktop/{ => main}/layouts/mini.vue (100%) rename desktop/{ => main}/nuxt.config.ts (78%) create mode 100644 desktop/main/package.json rename desktop/{ => main}/pages/auth/code.vue (100%) rename desktop/{ => main}/pages/auth/failed.vue (100%) rename desktop/{ => main}/pages/auth/index.vue (100%) rename desktop/{ => main}/pages/auth/processing.vue (100%) rename desktop/{ => main}/pages/auth/signedout.vue (100%) rename desktop/{ => main}/pages/error/serverunavailable.vue (100%) rename desktop/{ => main}/pages/index.vue (100%) rename desktop/{ => main}/pages/library.vue (100%) rename desktop/{ => main}/pages/library/[id]/index.vue (100%) rename desktop/{ => main}/pages/library/index.vue (100%) rename desktop/{ => main}/pages/queue.vue (100%) rename desktop/{ => main}/pages/quit.vue (100%) rename desktop/{ => main}/pages/settings.vue (100%) rename desktop/{ => main}/pages/settings/account.vue (100%) rename desktop/{ => main}/pages/settings/debug.vue (100%) rename desktop/{ => main}/pages/settings/downloads.vue (100%) rename desktop/{ => main}/pages/settings/index.vue (100%) rename desktop/{ => main}/pages/settings/interface.vue (100%) rename desktop/{ => main}/pages/setup/index.vue (100%) rename desktop/{ => main}/pages/setup/server.vue (100%) rename desktop/{ => main}/pages/store/index.vue (100%) rename desktop/{ => main}/plugins/global-error-handler.ts (100%) rename desktop/{ => main}/plugins/vuedraggable.ts (100%) rename desktop/{ => main}/public/fonts/helvetica/Helvetica-Bold.woff (100%) rename desktop/{ => main}/public/fonts/helvetica/Helvetica-BoldOblique.woff (100%) rename desktop/{ => main}/public/fonts/helvetica/Helvetica-Oblique.woff (100%) rename desktop/{ => main}/public/fonts/helvetica/Helvetica.woff (100%) rename desktop/{ => main}/public/fonts/helvetica/helvetica-compressed-5871d14b6903a.woff (100%) rename desktop/{ => main}/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff (100%) rename desktop/{ => main}/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff2 (100%) rename desktop/{ => main}/public/fonts/helvetica/helvetica-rounded-bold-5871d05ead8de.woff (100%) rename desktop/{ => main}/public/fonts/inter/InterVariable-Italic.ttf (100%) rename desktop/{ => main}/public/fonts/inter/InterVariable.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansBlack.woff.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansBold.woff.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansExtraBold.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansLight.woff.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansMedium.woff.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansRegular.woff.ttf (100%) rename desktop/{ => main}/public/fonts/motiva/MotivaSansThin.ttf (100%) rename desktop/{ => main}/tailwind.config.js (100%) rename desktop/{ => main}/tsconfig.json (100%) rename desktop/{ => main}/types.ts (100%) create mode 100644 desktop/main/yarn.lock create mode 100755 desktop/optimize-appimage.sh diff --git a/desktop/.github/workflows/release.yml b/desktop/.github/workflows/release.yml index 9e604614..455fdc74 100644 --- a/desktop/.github/workflows/release.yml +++ b/desktop/.github/workflows/release.yml @@ -94,10 +94,11 @@ jobs: APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }} + NO_STRIP: true with: tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version. releaseName: 'Auto-release v__VERSION__' releaseBody: 'See the assets to download this version and install. This release was created automatically.' releaseDraft: false prerelease: true - args: ${{ matrix.args }} + args: ${{ matrix.args }} \ No newline at end of file diff --git a/desktop/.gitignore b/desktop/.gitignore index 5767a3f2..c60be723 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -26,4 +26,7 @@ dist-ssr .output src-tauri/flamegraph.svg -src-tauri/perf* \ No newline at end of file +src-tauri/perf* + +/*.AppImage +/squashfs-root \ No newline at end of file diff --git a/desktop/.gitmodules b/desktop/.gitmodules index f47083b2..df4511d8 100644 --- a/desktop/.gitmodules +++ b/desktop/.gitmodules @@ -1,9 +1,6 @@ -[submodule "drop-base"] - path = drop-base - url = https://github.com/drop-oss/drop-base [submodule "src-tauri/tailscale/libtailscale"] path = src-tauri/tailscale/libtailscale url = https://github.com/tailscale/libtailscale.git -[submodule "src-tauri/umu/umu-launcher"] - path = src-tauri/umu/umu-launcher - url = https://github.com/Open-Wine-Components/umu-launcher.git +[submodule "libs/drop-base"] + path = libs/drop-base + url = https://github.com/drop-oss/drop-base.git diff --git a/desktop/build.mjs b/desktop/build.mjs new file mode 100644 index 00000000..c4846f1f --- /dev/null +++ b/desktop/build.mjs @@ -0,0 +1,48 @@ +import fs from "fs"; +import process from "process"; +import childProcess from "child_process"; +import createLogger from "pino"; + +const OUTPUT = "./.output"; +const logger = createLogger({ transport: { target: "pino-pretty" } }); + +async function spawn(exec, opts) { + const output = childProcess.spawn(exec, { ...opts, shell: true }); + output.stdout.on("data", (data) => { + process.stdout.write(data); + }); + output.stderr.on("data", (data) => { + process.stderr.write(data); + }); + + return await new Promise((resolve, reject) => { + output.on("error", (err) => reject(err)); + output.on("exit", () => resolve()); + }); +} + +const views = fs.readdirSync(".").filter((view) => { + const expectedPath = `./${view}/package.json`; + return fs.existsSync(expectedPath); +}); + +fs.mkdirSync(OUTPUT, { recursive: true }); + +for (const view of views) { + const loggerChild = logger.child({}); + process.chdir(`./${view}`); + + loggerChild.info(`Install deps for "${view}"`); + await spawn("yarn"); + + loggerChild.info(`Building "${view}"`); + await spawn("yarn build", { + env: { ...process.env, NUXT_APP_BASE_URL: `/${view}/` }, + }); + + process.chdir(".."); + + fs.cpSync(`./${view}/.output/public`, `${OUTPUT}/${view}`, { + recursive: true, + }); +} \ No newline at end of file diff --git a/desktop/composables/app-state.ts b/desktop/composables/app-state.ts deleted file mode 100644 index 2781bd2d..00000000 --- a/desktop/composables/app-state.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { AppState } from "~/types"; - -export const useAppState = () => useState("state"); \ No newline at end of file diff --git a/desktop/drop-base b/desktop/libs/drop-base similarity index 100% rename from desktop/drop-base rename to desktop/libs/drop-base diff --git a/desktop/app.vue b/desktop/main/app.vue similarity index 75% rename from desktop/app.vue rename to desktop/main/app.vue index 46a38ab4..7d4165fe 100644 --- a/desktop/app.vue +++ b/desktop/main/app.vue @@ -10,8 +10,6 @@ import "~/composables/downloads.js"; import { invoke } from "@tauri-apps/api/core"; -import { AppStatus } from "~/types"; -import { listen } from "@tauri-apps/api/event"; import { useAppState } from "./composables/app-state.js"; import { initialNavigation, @@ -21,19 +19,26 @@ import { const router = useRouter(); const state = useAppState(); -try { - state.value = JSON.parse(await invoke("fetch_state")); -} catch (e) { - console.error("failed to parse state", e); + +async function fetchState() { + try { + state.value = JSON.parse(await invoke("fetch_state")); + if (!state.value) + throw createError({ + statusCode: 500, + statusMessage: `App state is: ${state.value}`, + fatal: true, + }); + } catch (e) { + console.error("failed to parse state", e); + throw e; + } } +await fetchState(); // This is inefficient but apparently we do it lol router.beforeEach(async () => { - try { - state.value = JSON.parse(await invoke("fetch_state")); - } catch (e) { - console.error("failed to parse state", e); - } + await fetchState(); }); setupHooks(); diff --git a/desktop/assets/main.scss b/desktop/main/assets/main.scss similarity index 100% rename from desktop/assets/main.scss rename to desktop/main/assets/main.scss diff --git a/desktop/assets/wallpaper.jpg b/desktop/main/assets/wallpaper.jpg similarity index 100% rename from desktop/assets/wallpaper.jpg rename to desktop/main/assets/wallpaper.jpg diff --git a/desktop/components/GameOptions/Launch.vue b/desktop/main/components/GameOptions/Launch.vue similarity index 100% rename from desktop/components/GameOptions/Launch.vue rename to desktop/main/components/GameOptions/Launch.vue diff --git a/desktop/components/GameOptionsModal.vue b/desktop/main/components/GameOptionsModal.vue similarity index 100% rename from desktop/components/GameOptionsModal.vue rename to desktop/main/components/GameOptionsModal.vue diff --git a/desktop/components/GameStatusButton.vue b/desktop/main/components/GameStatusButton.vue similarity index 100% rename from desktop/components/GameStatusButton.vue rename to desktop/main/components/GameStatusButton.vue diff --git a/desktop/components/Header.vue b/desktop/main/components/Header.vue similarity index 97% rename from desktop/components/Header.vue rename to desktop/main/components/Header.vue index 5cf299fd..160b9aec 100644 --- a/desktop/components/Header.vue +++ b/desktop/main/components/Header.vue @@ -37,7 +37,7 @@ - + diff --git a/desktop/components/HeaderButton.vue b/desktop/main/components/HeaderButton.vue similarity index 100% rename from desktop/components/HeaderButton.vue rename to desktop/main/components/HeaderButton.vue diff --git a/desktop/components/HeaderQueueWidget.vue b/desktop/main/components/HeaderQueueWidget.vue similarity index 100% rename from desktop/components/HeaderQueueWidget.vue rename to desktop/main/components/HeaderQueueWidget.vue diff --git a/desktop/components/HeaderUserWidget.vue b/desktop/main/components/HeaderUserWidget.vue similarity index 96% rename from desktop/components/HeaderUserWidget.vue rename to desktop/main/components/HeaderUserWidget.vue index b6e245fe..518f99c9 100644 --- a/desktop/components/HeaderUserWidget.vue +++ b/desktop/main/components/HeaderUserWidget.vue @@ -1,5 +1,5 @@