From 3b830e2a44a8be46e99306918e182fe802c91624 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 --- .github/workflows/release.yml | 3 +- .gitignore | 5 +- .gitmodules | 9 +- build.mjs | 48 + composables/app-state.ts | 3 - drop-base => libs/drop-base | 0 app.vue => main/app.vue | 27 +- {assets => main/assets}/main.scss | 0 {assets => main/assets}/wallpaper.jpg | Bin .../components}/GameOptions/Launch.vue | 0 .../components}/GameOptionsModal.vue | 0 .../components}/GameStatusButton.vue | 0 {components => main/components}/Header.vue | 2 +- .../components}/HeaderButton.vue | 0 .../components}/HeaderQueueWidget.vue | 0 .../components}/HeaderUserWidget.vue | 4 +- .../components}/HeaderWidget.vue | 0 .../components}/InitiateAuthModule.vue | 0 .../components}/LibrarySearch.vue | 0 .../components}/LoadingIndicator.vue | 0 {components => main/components}/Logo.vue | 0 .../components}/MiniHeader.vue | 0 .../components}/OfflineHeaderWidget.vue | 0 .../components}/PageWidget.vue | 0 .../components}/WindowControl.vue | 0 {components => main/components}/Wordmark.vue | 0 main/composables/app-state.ts | 3 + .../composables}/current-page-engine.ts | 0 .../composables}/downloads.ts | 0 {composables => main/composables}/game.ts | 0 .../composables}/generateGameMeta.ts | 0 .../composables}/state-navigation.ts | 8 +- .../composables}/use-object.ts | 0 error.vue => main/error.vue | 1 + {layouts => main/layouts}/default.vue | 0 {layouts => main/layouts}/mini.vue | 0 nuxt.config.ts => main/nuxt.config.ts | 6 +- main/package.json | 37 + {pages => main/pages}/auth/code.vue | 0 {pages => main/pages}/auth/failed.vue | 0 {pages => main/pages}/auth/index.vue | 0 {pages => main/pages}/auth/processing.vue | 0 {pages => main/pages}/auth/signedout.vue | 0 .../pages}/error/serverunavailable.vue | 0 {pages => main/pages}/index.vue | 0 {pages => main/pages}/library.vue | 0 {pages => main/pages}/library/[id]/index.vue | 0 {pages => main/pages}/library/index.vue | 0 {pages => main/pages}/queue.vue | 0 {pages => main/pages}/quit.vue | 0 {pages => main/pages}/settings.vue | 0 {pages => main/pages}/settings/account.vue | 0 {pages => main/pages}/settings/debug.vue | 0 {pages => main/pages}/settings/downloads.vue | 0 {pages => main/pages}/settings/index.vue | 0 {pages => main/pages}/settings/interface.vue | 0 {pages => main/pages}/setup/index.vue | 0 {pages => main/pages}/setup/server.vue | 0 {pages => main/pages}/store/index.vue | 0 .../plugins}/global-error-handler.ts | 0 {plugins => 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 tailwind.config.js => main/tailwind.config.js | 0 tsconfig.json => main/tsconfig.json | 0 types.ts => main/types.ts | 0 main/yarn.lock | 8091 ++++++++++++++++ optimize-appimage.sh | 22 + package.json | 44 +- src-tauri/Cargo.lock | 28 +- src-tauri/Cargo.toml | 2 +- src-tauri/src/lib.rs | 2 +- src-tauri/tauri.conf.json | 10 +- yarn.lock | 8415 +---------------- 89 files changed, 8481 insertions(+), 8289 deletions(-) create mode 100644 build.mjs delete mode 100644 composables/app-state.ts rename drop-base => libs/drop-base (100%) rename app.vue => main/app.vue (75%) rename {assets => main/assets}/main.scss (100%) rename {assets => main/assets}/wallpaper.jpg (100%) rename {components => main/components}/GameOptions/Launch.vue (100%) rename {components => main/components}/GameOptionsModal.vue (100%) rename {components => main/components}/GameStatusButton.vue (100%) rename {components => main/components}/Header.vue (97%) rename {components => main/components}/HeaderButton.vue (100%) rename {components => main/components}/HeaderQueueWidget.vue (100%) rename {components => main/components}/HeaderUserWidget.vue (96%) rename {components => main/components}/HeaderWidget.vue (100%) rename {components => main/components}/InitiateAuthModule.vue (100%) rename {components => main/components}/LibrarySearch.vue (100%) rename {components => main/components}/LoadingIndicator.vue (100%) rename {components => main/components}/Logo.vue (100%) rename {components => main/components}/MiniHeader.vue (100%) rename {components => main/components}/OfflineHeaderWidget.vue (100%) rename {components => main/components}/PageWidget.vue (100%) rename {components => main/components}/WindowControl.vue (100%) rename {components => main/components}/Wordmark.vue (100%) create mode 100644 main/composables/app-state.ts rename {composables => main/composables}/current-page-engine.ts (100%) rename {composables => main/composables}/downloads.ts (100%) rename {composables => main/composables}/game.ts (100%) rename {composables => main/composables}/generateGameMeta.ts (100%) rename {composables => main/composables}/state-navigation.ts (91%) rename {composables => main/composables}/use-object.ts (100%) rename error.vue => main/error.vue (99%) rename {layouts => main/layouts}/default.vue (100%) rename {layouts => main/layouts}/mini.vue (100%) rename nuxt.config.ts => main/nuxt.config.ts (78%) create mode 100644 main/package.json rename {pages => main/pages}/auth/code.vue (100%) rename {pages => main/pages}/auth/failed.vue (100%) rename {pages => main/pages}/auth/index.vue (100%) rename {pages => main/pages}/auth/processing.vue (100%) rename {pages => main/pages}/auth/signedout.vue (100%) rename {pages => main/pages}/error/serverunavailable.vue (100%) rename {pages => main/pages}/index.vue (100%) rename {pages => main/pages}/library.vue (100%) rename {pages => main/pages}/library/[id]/index.vue (100%) rename {pages => main/pages}/library/index.vue (100%) rename {pages => main/pages}/queue.vue (100%) rename {pages => main/pages}/quit.vue (100%) rename {pages => main/pages}/settings.vue (100%) rename {pages => main/pages}/settings/account.vue (100%) rename {pages => main/pages}/settings/debug.vue (100%) rename {pages => main/pages}/settings/downloads.vue (100%) rename {pages => main/pages}/settings/index.vue (100%) rename {pages => main/pages}/settings/interface.vue (100%) rename {pages => main/pages}/setup/index.vue (100%) rename {pages => main/pages}/setup/server.vue (100%) rename {pages => main/pages}/store/index.vue (100%) rename {plugins => main/plugins}/global-error-handler.ts (100%) rename {plugins => main/plugins}/vuedraggable.ts (100%) rename {public => main/public}/fonts/helvetica/Helvetica-Bold.woff (100%) rename {public => main/public}/fonts/helvetica/Helvetica-BoldOblique.woff (100%) rename {public => main/public}/fonts/helvetica/Helvetica-Oblique.woff (100%) rename {public => main/public}/fonts/helvetica/Helvetica.woff (100%) rename {public => main/public}/fonts/helvetica/helvetica-compressed-5871d14b6903a.woff (100%) rename {public => main/public}/fonts/helvetica/helvetica-light-587ebe5a59211.woff (100%) rename {public => main/public}/fonts/helvetica/helvetica-light-587ebe5a59211.woff2 (100%) rename {public => main/public}/fonts/helvetica/helvetica-rounded-bold-5871d05ead8de.woff (100%) rename {public => main/public}/fonts/inter/InterVariable-Italic.ttf (100%) rename {public => main/public}/fonts/inter/InterVariable.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansBlack.woff.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansBold.woff.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansExtraBold.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansLight.woff.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansMedium.woff.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansRegular.woff.ttf (100%) rename {public => main/public}/fonts/motiva/MotivaSansThin.ttf (100%) rename tailwind.config.js => main/tailwind.config.js (100%) rename tsconfig.json => main/tsconfig.json (100%) rename types.ts => main/types.ts (100%) create mode 100644 main/yarn.lock create mode 100755 optimize-appimage.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9e60461..455fdc7 100644 --- a/.github/workflows/release.yml +++ b/.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/.gitignore b/.gitignore index 5767a3f..c60be72 100644 --- a/.gitignore +++ b/.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/.gitmodules b/.gitmodules index f47083b..df4511d 100644 --- a/.gitmodules +++ b/.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/build.mjs b/build.mjs new file mode 100644 index 0000000..c4846f1 --- /dev/null +++ b/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/composables/app-state.ts b/composables/app-state.ts deleted file mode 100644 index 2781bd2..0000000 --- a/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/drop-base b/libs/drop-base similarity index 100% rename from drop-base rename to libs/drop-base diff --git a/app.vue b/main/app.vue similarity index 75% rename from app.vue rename to main/app.vue index 46a38ab..7d4165f 100644 --- a/app.vue +++ b/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/assets/main.scss b/main/assets/main.scss similarity index 100% rename from assets/main.scss rename to main/assets/main.scss diff --git a/assets/wallpaper.jpg b/main/assets/wallpaper.jpg similarity index 100% rename from assets/wallpaper.jpg rename to main/assets/wallpaper.jpg diff --git a/components/GameOptions/Launch.vue b/main/components/GameOptions/Launch.vue similarity index 100% rename from components/GameOptions/Launch.vue rename to main/components/GameOptions/Launch.vue diff --git a/components/GameOptionsModal.vue b/main/components/GameOptionsModal.vue similarity index 100% rename from components/GameOptionsModal.vue rename to main/components/GameOptionsModal.vue diff --git a/components/GameStatusButton.vue b/main/components/GameStatusButton.vue similarity index 100% rename from components/GameStatusButton.vue rename to main/components/GameStatusButton.vue diff --git a/components/Header.vue b/main/components/Header.vue similarity index 97% rename from components/Header.vue rename to main/components/Header.vue index 5cf299f..160b9ae 100644 --- a/components/Header.vue +++ b/main/components/Header.vue @@ -37,7 +37,7 @@ - + diff --git a/components/HeaderButton.vue b/main/components/HeaderButton.vue similarity index 100% rename from components/HeaderButton.vue rename to main/components/HeaderButton.vue diff --git a/components/HeaderQueueWidget.vue b/main/components/HeaderQueueWidget.vue similarity index 100% rename from components/HeaderQueueWidget.vue rename to main/components/HeaderQueueWidget.vue diff --git a/components/HeaderUserWidget.vue b/main/components/HeaderUserWidget.vue similarity index 96% rename from components/HeaderUserWidget.vue rename to main/components/HeaderUserWidget.vue index b6e245f..518f99c 100644 --- a/components/HeaderUserWidget.vue +++ b/main/components/HeaderUserWidget.vue @@ -1,5 +1,5 @@