From 69e59e352dabc3472bc49c93d91374ab05c1b06f Mon Sep 17 00:00:00 2001 From: cade Date: Wed, 1 Jul 2026 15:34:55 +0800 Subject: [PATCH 1/7] Added typecheck build step --- .github/workflows/build.yml | 3 +++ mise.toml | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6853cb354..0aa00d4f2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,6 +32,9 @@ jobs: - name: Install pnpm dependencies run: pnpm install --frozen-lockfile + - name: Check type validity + run: mise typecheck + - if: matrix.platform == 'linux' name: Install bsdtar # Required by electron-builder when targeting pacman. run: | diff --git a/mise.toml b/mise.toml index 394a504af..458101bca 100644 --- a/mise.toml +++ b/mise.toml @@ -6,3 +6,7 @@ python = { version = "3.12", postinstall = "python -m pip install pipx" } [tasks.dev] description = "Start in dev mode" run = "pnpm run dev" + +[tasks.typecheck] +description = "Ensure that the app is appropriately typed" +run = "pnpm typecheck" From d184bfccdab1a4083e7e32e1b3548ce1797992e7 Mon Sep 17 00:00:00 2001 From: cade Date: Wed, 1 Jul 2026 15:50:21 +0800 Subject: [PATCH 2/7] Moved typecheck to separate file and added quasar prepare task --- .github/workflows/build.yml | 3 --- .github/workflows/typecheck.yml | 24 ++++++++++++++++++++++++ mise/config.ci.toml | 6 ++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/typecheck.yml create mode 100644 mise/config.ci.toml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0aa00d4f2..6853cb354 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,9 +32,6 @@ jobs: - name: Install pnpm dependencies run: pnpm install --frozen-lockfile - - name: Check type validity - run: mise typecheck - - if: matrix.platform == 'linux' name: Install bsdtar # Required by electron-builder when targeting pacman. run: | diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml new file mode 100644 index 000000000..f37ceaef3 --- /dev/null +++ b/.github/workflows/typecheck.yml @@ -0,0 +1,24 @@ +name: Typecheck + +on: [push] + +jobs: + typecheck: + name: Typecheck + runs-on: ubuntu-latest + env: + MISE_ENV: ci + steps: + - uses: actions/checkout@v4 + + - uses: jdx/mise-action@v3 + with: + install: true + cache: true + log_level: debug + + - name: Install pnpm dependencies + run: pnpm install --frozen-lockfile + + - name: Check type validity + run: mise typecheck diff --git a/mise/config.ci.toml b/mise/config.ci.toml new file mode 100644 index 000000000..630f1eb9b --- /dev/null +++ b/mise/config.ci.toml @@ -0,0 +1,6 @@ +[tasks.typecheck] +description = "Perform typechecking tasks" +run = [ + "npx @quasar/cli prepare", + "pnpm typecheck", +] From 537760525b9a06a839ff458b79d9d54eddaeef03 Mon Sep 17 00:00:00 2001 From: cade Date: Wed, 1 Jul 2026 15:52:27 +0800 Subject: [PATCH 3/7] TEST: Purposefully broke type to verify typecheck causes issues --- src/installers/PackageInstaller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/installers/PackageInstaller.ts b/src/installers/PackageInstaller.ts index ae72e3aad..0149e6b08 100644 --- a/src/installers/PackageInstaller.ts +++ b/src/installers/PackageInstaller.ts @@ -64,7 +64,7 @@ export async function uninstallModLoader(mod: ManifestV2, profile: ImmutableProf const fs = FsProvider.instance; try { - const loader = MOD_LOADER_VARIANTS[GameManager.activeGame.internalFolderName]!.find( + const loader = MOD_LOADER_VARIANTS[GameManager.activeGame.internalFolderName].find( loader => loader.packageName.toLowerCase() === mod.getName().toLowerCase() ); From c8ee6ad1bbd0b7c1597fcc2adaebc5cc48b8b510 Mon Sep 17 00:00:00 2001 From: cade Date: Wed, 1 Jul 2026 15:54:07 +0800 Subject: [PATCH 4/7] RESET: Re-added purposefully broken type to allow merge --- src/installers/PackageInstaller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/installers/PackageInstaller.ts b/src/installers/PackageInstaller.ts index 0149e6b08..ae72e3aad 100644 --- a/src/installers/PackageInstaller.ts +++ b/src/installers/PackageInstaller.ts @@ -64,7 +64,7 @@ export async function uninstallModLoader(mod: ManifestV2, profile: ImmutableProf const fs = FsProvider.instance; try { - const loader = MOD_LOADER_VARIANTS[GameManager.activeGame.internalFolderName].find( + const loader = MOD_LOADER_VARIANTS[GameManager.activeGame.internalFolderName]!.find( loader => loader.packageName.toLowerCase() === mod.getName().toLowerCase() ); From 0af3822c4115b3fa6291c4cacc1aa2fa266b5000 Mon Sep 17 00:00:00 2001 From: cade Date: Thu, 2 Jul 2026 11:50:16 +0800 Subject: [PATCH 5/7] Switched tsc for vue-tsc and fixed remaining errors --- package.json | 4 +- src-electron/ipc/node-path-impl.ts | 4 +- src/components/DeferredInput.vue | 2 +- src/components/Progress.vue | 3 +- src/components/buttons/DonateButton.vue | 2 +- src/components/buttons/DonateIconButton.vue | 2 +- .../importing/LocalFileImportModal.vue | 22 +- src/components/input/MultiSelect.vue | 2 +- .../modals/CategorySelectorModal.vue | 4 +- src/components/modals/ErrorModal.vue | 4 +- .../profiles-modals/ImportProfileModal.vue | 6 +- .../profiles-modals/RenameProfileModal.vue | 2 +- .../settings-components/SettingsView.vue | 8 +- src/components/v2/OnlinePreviewPanel.vue | 676 +++++++++--------- .../views/DownloadModVersionSelectModal.vue | 6 +- .../views/LocalModList/LocalModCard.vue | 8 +- .../LocalModList/LocalModDraggableList.vue | 4 +- src/components/views/OnlineModList.vue | 2 +- .../views/OnlineModListWithPanel.vue | 4 +- src/components/views/OnlineModView.vue | 2 +- src/pages/ConfigEditor.vue | 2 +- src/pages/DownloadMonitor.vue | 3 +- src/pages/GameSelectionScreen.vue | 4 +- src/pages/Manager.vue | 18 +- src/pages/Splash.vue | 4 +- src/providers/node/path/path.ts | 4 +- src/store/index.ts | 24 +- src/store/modules/DownloadModule.ts | 2 +- src/store/modules/ErrorModule.ts | 2 +- src/store/modules/ModalsModule.ts | 2 +- src/store/modules/ProfileExportModule.ts | 2 +- src/store/modules/ProfileModule.ts | 2 +- src/store/modules/ProfilesModule.ts | 2 +- src/store/modules/SplashModule.ts | 2 +- src/utils/DateUtils.ts | 2 +- 35 files changed, 425 insertions(+), 417 deletions(-) diff --git a/package.json b/package.json index 11caab743..1d609fd2d 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "publish-win": "quasar build --mode electron -T win32 --publish always", "publish-linux": "quasar build --mode electron -T linux --publish always", "test": "vitest run ./test/vitest", - "typecheck": "tsc" + "typecheck": "vue-tsc" }, "dependencies": { "@node-steam/vdf": "^2.1.0", @@ -100,12 +100,12 @@ "sass": "^1.70.0", "sass-loader": "^16.0.5", "sinon": "^11.1.1", - "tsc": "^2.0.4", "tsx": "^4.20.5", "typescript": "^5.9.2", "vite-plugin-node-polyfills": "^0.23.0", "vitest": "^3.2.4", "vue": "^3.5.16", + "vue-tsc": "^3.3.5", "wallaby-vue-compiler": "^1.0.3" }, "engines": { diff --git a/src-electron/ipc/node-path-impl.ts b/src-electron/ipc/node-path-impl.ts index 046bdcf76..f1f5077ba 100644 --- a/src-electron/ipc/node-path-impl.ts +++ b/src-electron/ipc/node-path-impl.ts @@ -5,8 +5,8 @@ export function hookPathIpc(browserWindow: BrowserWindow) { ipcMain.on("node:path:join", (event, ...args) => { event.returnValue = path.join(...args); }); - ipcMain.on("node:path:basename", (event, toResolve) => { - event.returnValue = path.basename(toResolve); + ipcMain.on("node:path:basename", (event, base, suffix) => { + event.returnValue = path.basename(base, suffix); }); ipcMain.on("node:path:resolve", (event, ...args) => { event.returnValue = path.resolve(...args); diff --git a/src/components/DeferredInput.vue b/src/components/DeferredInput.vue index f1c4b7606..7147be263 100644 --- a/src/components/DeferredInput.vue +++ b/src/components/DeferredInput.vue @@ -22,5 +22,5 @@ function emitChange(value: string): void { diff --git a/src/components/Progress.vue b/src/components/Progress.vue index e35a9a7b4..1aa845008 100644 --- a/src/components/Progress.vue +++ b/src/components/Progress.vue @@ -18,8 +18,7 @@ type ProgressProps = { const props = withDefaults(defineProps(), { max: 100, - value: undefined, - className: [] + className: () => [] as string[] }); diff --git a/src/components/buttons/DonateButton.vue b/src/components/buttons/DonateButton.vue index 9d27eaf43..4ee2ee5b9 100644 --- a/src/components/buttons/DonateButton.vue +++ b/src/components/buttons/DonateButton.vue @@ -1,6 +1,6 @@