chore(native): bump and align dependencies (#5331)

- This standardises package versions between desktop, agent, appload, relay
  all the native components to resolve version inconsistencies and prepare
  for unified bumps in the future.

- Account for recent minor dependency bumps as a follow-up to #5329

Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com>
This commit is contained in:
Shreyas 2025-08-21 16:24:30 +05:30 committed by GitHub
parent 42089fbb55
commit a0fbb7b076
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 992 additions and 2040 deletions

View file

@ -36,7 +36,7 @@
"pnpm": { "pnpm": {
"overrides": { "overrides": {
"cross-spawn": "7.0.6", "cross-spawn": "7.0.6",
"vue": "3.5.18", "vue": "3.5.19",
"@nestjs-modules/mailer>mjml": "5.0.0-alpha.4", "@nestjs-modules/mailer>mjml": "5.0.0-alpha.4",
"subscriptions-transport-ws>ws": "7.5.10", "subscriptions-transport-ws>ws": "7.5.10",
"braces": "3.0.3", "braces": "3.0.3",

View file

@ -10,28 +10,28 @@
"tauri": "tauri" "tauri": "tauri"
}, },
"dependencies": { "dependencies": {
"@hoppscotch/ui": "^0.2.1", "@hoppscotch/ui": "0.2.5",
"@tauri-apps/api": "^2.0.2", "@tauri-apps/api": "2.1.1",
"@tauri-apps/plugin-shell": "^2.0.0", "@tauri-apps/plugin-shell": "^2.0.0",
"@vueuse/core": "^11.1.0", "@vueuse/core": "13.7.0",
"axios": "1.8.2", "axios": "1.11.0",
"fp-ts": "^2.16.9", "fp-ts": "2.16.11",
"lodash-es": "4.17.21", "lodash-es": "4.17.21",
"vue": "3.3.9" "vue": "3.5.19"
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/lucide": "^1.2.8", "@iconify-json/lucide": "1.2.63",
"@tauri-apps/cli": "^2.0.3", "@tauri-apps/cli": "^2.0.3",
"@types/lodash-es": "4.17.12", "@types/lodash-es": "4.17.12",
"@types/node": "^22.7.5", "@types/node": "24.3.0",
"@vitejs/plugin-vue": "^5.1.4", "@vitejs/plugin-vue": "5.1.4",
"autoprefixer": "^10.4.20", "autoprefixer": "10.4.21",
"postcss": "^8.4.47", "postcss": "8.5.6",
"tailwindcss": "^3.4.13", "tailwindcss": "3.4.16",
"typescript": "5.8.3", "typescript": "5.9.2",
"unplugin-icons": "^0.19.3", "unplugin-icons": "22.2.0",
"unplugin-vue-components": "28.4.1", "unplugin-vue-components": "29.0.0",
"vite": "^5.4.8", "vite": "6.3.5",
"vue-tsc": "2.2.0" "vue-tsc": "2.2.0"
} }
} }

View file

@ -40,11 +40,11 @@
"@hoppscotch/httpsnippet": "3.0.9", "@hoppscotch/httpsnippet": "3.0.9",
"@hoppscotch/js-sandbox": "workspace:^", "@hoppscotch/js-sandbox": "workspace:^",
"@hoppscotch/kernel": "workspace:^", "@hoppscotch/kernel": "workspace:^",
"@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#1b52e49d881926135838cf6cfebdc1643a9bec31", "@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#e8dbe06eabf947e5efaf07d2e573238ceb11a7b1",
"@hoppscotch/ui": "0.2.5", "@hoppscotch/ui": "0.2.5",
"@hoppscotch/vue-toasted": "0.1.0", "@hoppscotch/vue-toasted": "0.1.0",
"@lezer/highlight": "1.2.1", "@lezer/highlight": "1.2.1",
"@noble/curves": "1.9.6", "@noble/curves": "1.9.7",
"@scure/base": "1.2.6", "@scure/base": "1.2.6",
"@shopify/lang-jsonc": "1.0.1", "@shopify/lang-jsonc": "1.0.1",
"@tauri-apps/api": "2.1.1", "@tauri-apps/api": "2.1.1",
@ -106,7 +106,7 @@
"util": "0.12.5", "util": "0.12.5",
"uuid": "11.1.0", "uuid": "11.1.0",
"verzod": "0.4.0", "verzod": "0.4.0",
"vue": "3.5.18", "vue": "3.5.19",
"vue-i18n": "11.1.11", "vue-i18n": "11.1.11",
"vue-json-pretty": "2.5.0", "vue-json-pretty": "2.5.0",
"vue-pdf-embed": "2.1.3", "vue-pdf-embed": "2.1.3",
@ -147,9 +147,9 @@
"@typescript-eslint/eslint-plugin": "8.40.0", "@typescript-eslint/eslint-plugin": "8.40.0",
"@typescript-eslint/parser": "8.40.0", "@typescript-eslint/parser": "8.40.0",
"@vitejs/plugin-vue": "5.1.4", "@vitejs/plugin-vue": "5.1.4",
"@vue/compiler-sfc": "3.5.18", "@vue/compiler-sfc": "3.5.19",
"@vue/eslint-config-typescript": "13.0.0", "@vue/eslint-config-typescript": "13.0.0",
"@vue/runtime-core": "3.5.18", "@vue/runtime-core": "3.5.19",
"autoprefixer": "10.4.21", "autoprefixer": "10.4.21",
"cross-env": "10.0.0", "cross-env": "10.0.0",
"dotenv": "17.2.1", "dotenv": "17.2.1",
@ -176,7 +176,7 @@
"vite-plugin-html-config": "2.0.2", "vite-plugin-html-config": "2.0.2",
"vite-plugin-pages": "0.33.1", "vite-plugin-pages": "0.33.1",
"vite-plugin-pages-sitemap": "1.7.1", "vite-plugin-pages-sitemap": "1.7.1",
"vite-plugin-pwa": "1.0.2", "vite-plugin-pwa": "1.0.3",
"vite-plugin-vue-layouts": "0.11.0", "vite-plugin-vue-layouts": "0.11.0",
"vitest": "3.2.4", "vitest": "3.2.4",
"vue-tsc": "1.8.8" "vue-tsc": "1.8.8"

View file

@ -19,46 +19,46 @@
"build:portable": "pnpm tauri build -- --no-default-features --features portable" "build:portable": "pnpm tauri build -- --no-default-features --features portable"
}, },
"dependencies": { "dependencies": {
"@fontsource-variable/inter": "5.1.0", "@fontsource-variable/inter": "5.2.6",
"@fontsource-variable/material-symbols-rounded": "5.1.3", "@fontsource-variable/material-symbols-rounded": "5.2.19",
"@fontsource-variable/roboto-mono": "5.1.0", "@fontsource-variable/roboto-mono": "5.2.6",
"@hoppscotch/common": "workspace:^", "@hoppscotch/common": "workspace:^",
"@hoppscotch/kernel": "workspace:^", "@hoppscotch/kernel": "workspace:^",
"@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#1b52e49d881926135838cf6cfebdc1643a9bec31", "@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#e8dbe06eabf947e5efaf07d2e573238ceb11a7b1",
"@hoppscotch/ui": "0.2.1", "@hoppscotch/ui": "0.2.5",
"@tauri-apps/api": "2.1.1", "@tauri-apps/api": "2.1.1",
"@tauri-apps/plugin-fs": "2.0.2", "@tauri-apps/plugin-fs": "2.0.2",
"@tauri-apps/plugin-process": "2.2.0", "@tauri-apps/plugin-process": "2.2.0",
"@tauri-apps/plugin-shell": "2.0.1", "@tauri-apps/plugin-shell": "2.0.1",
"@tauri-apps/plugin-store": "2.2.0", "@tauri-apps/plugin-store": "2.2.0",
"@tauri-apps/plugin-updater": "2.5.1", "@tauri-apps/plugin-updater": "2.5.1",
"@vueuse/core": "11.1.0", "@vueuse/core": "13.7.0",
"fp-ts": "2.16.9", "fp-ts": "2.16.11",
"rxjs": "7.8.1", "rxjs": "7.8.2",
"vue": "^3.3.4", "vue": "3.5.19",
"vue-router": "4.4.5", "vue-router": "4.5.1",
"vue-tippy": "6.5.0", "vue-tippy": "6.7.1",
"zod": "3.23.8" "zod": "3.25.32"
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/lucide": "1.2.10", "@iconify-json/lucide": "1.2.63",
"@rushstack/eslint-patch": "1.10.4", "@rushstack/eslint-patch": "1.12.0",
"@tauri-apps/cli": "^2", "@tauri-apps/cli": "^2",
"@typescript-eslint/eslint-plugin": "8.9.0", "@typescript-eslint/eslint-plugin": "8.40.0",
"@typescript-eslint/parser": "8.9.0", "@typescript-eslint/parser": "8.40.0",
"@vitejs/plugin-vue": "^5.0.5", "@vitejs/plugin-vue": "5.1.4",
"@vue/eslint-config-typescript": "13.0.0", "@vue/eslint-config-typescript": "13.0.0",
"autoprefixer": "10.4.20", "autoprefixer": "10.4.21",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-plugin-prettier": "5.2.1", "eslint-plugin-prettier": "5.5.4",
"eslint-plugin-vue": "9.29.0", "eslint-plugin-vue": "10.4.0",
"postcss": "8.4.49", "postcss": "8.5.6",
"sass": "1.80.3", "sass": "1.90.0",
"tailwindcss": "3.4.14", "tailwindcss": "3.4.16",
"typescript": "^5.8.3", "typescript": "5.9.2",
"unplugin-icons": "0.19.3", "unplugin-icons": "22.2.0",
"unplugin-vue-components": "0.27.4", "unplugin-vue-components": "29.0.0",
"vite": "^5.3.1", "vite": "6.3.5",
"vue-tsc": "2.2.0" "vue-tsc": "2.2.0"
} }
} }

View file

@ -10,7 +10,7 @@
"tauri": "tauri" "tauri": "tauri"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.0.0-alpha.11", "@tauri-apps/api": "^2.1.1",
"tauri-plugin-appload-api": "file:../../" "tauri-plugin-appload-api": "file:../../"
}, },
"devDependencies": { "devDependencies": {

View file

@ -22,12 +22,12 @@
"pretest": "pnpm build" "pretest": "pnpm build"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.0.0" "@tauri-apps/api": "2.1.1"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-typescript": "^11.1.6", "@rollup/plugin-typescript": "^11.1.6",
"rollup": "^4.9.6", "rollup": "^4.9.6",
"typescript": "^5.8.3", "typescript": "5.9.2",
"tslib": "^2.6.2" "tslib": "^2.6.2"
} }
} }

View file

@ -22,12 +22,12 @@
"pretest": "pnpm build" "pretest": "pnpm build"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.0.0" "@tauri-apps/api": "2.1.1"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-typescript": "^11.1.6", "@rollup/plugin-typescript": "^11.1.6",
"rollup": "^4.9.6", "rollup": "^4.9.6",
"typescript": "^5.8.3", "typescript": "5.9.2",
"tslib": "^2.6.2" "tslib": "^2.6.2"
} }
} }

View file

@ -5341,7 +5341,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-appload" name = "tauri-plugin-appload"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/CuriousCorrelation/tauri-plugin-appload?rev=1b52e49d881926135838cf6cfebdc1643a9bec31#1b52e49d881926135838cf6cfebdc1643a9bec31" source = "git+https://github.com/CuriousCorrelation/tauri-plugin-appload?rev=e8dbe06eabf947e5efaf07d2e573238ceb11a7b1#e8dbe06eabf947e5efaf07d2e573238ceb11a7b1"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"blake3", "blake3",
@ -5495,7 +5495,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-relay" name = "tauri-plugin-relay"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/CuriousCorrelation/tauri-plugin-relay?rev=4ed4fcafeb93856591e8a36522f6ec6e340e4dc5#4ed4fcafeb93856591e8a36522f6ec6e340e4dc5" source = "git+https://github.com/CuriousCorrelation/tauri-plugin-relay?rev=ff18f776ddeb53dbbdeaf97e1fabc30bdc57c158#ff18f776ddeb53dbbdeaf97e1fabc30bdc57c158"
dependencies = [ dependencies = [
"relay", "relay",
"serde", "serde",

View file

@ -29,8 +29,8 @@ tauri-plugin-store = "2.2.0"
tauri-plugin-dialog = "2.2.0" tauri-plugin-dialog = "2.2.0"
tauri-plugin-fs = "2.2.0" tauri-plugin-fs = "2.2.0"
tauri-plugin-deep-link = "2.2.0" tauri-plugin-deep-link = "2.2.0"
tauri-plugin-appload = { git = "https://github.com/CuriousCorrelation/tauri-plugin-appload", rev = "1b52e49d881926135838cf6cfebdc1643a9bec31" } tauri-plugin-appload = { git = "https://github.com/CuriousCorrelation/tauri-plugin-appload", rev = "e8dbe06eabf947e5efaf07d2e573238ceb11a7b1" }
tauri-plugin-relay = { git = "https://github.com/CuriousCorrelation/tauri-plugin-relay", rev = "4ed4fcafeb93856591e8a36522f6ec6e340e4dc5" } tauri-plugin-relay = { git = "https://github.com/CuriousCorrelation/tauri-plugin-relay", rev = "ff18f776ddeb53dbbdeaf97e1fabc30bdc57c158" }
axum = "0.8.1" axum = "0.8.1"
tower-http = { version = "0.6.2", features = ["cors"] } tower-http = { version = "0.6.2", features = ["cors"] }
random-port = "0.1.1" random-port = "0.1.1"

View file

@ -9,7 +9,7 @@
</div> </div>
</main> </main>
</div> </div>
<Toaster position="bottom-right" richColors /> <Toaster position="bottom-right" rich-colors />
</div> </div>
</template> </template>

View file

@ -2,6 +2,7 @@
// @ts-nocheck // @ts-nocheck
// Generated by unplugin-vue-components // Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399 // Read more: https://github.com/vuejs/core/pull/3399
// biome-ignore lint: disable
export {} export {}
/* prettier-ignore */ /* prettier-ignore */

View file

@ -10,14 +10,16 @@
<div <div
:class="[ :class="[
open ? '' : '-translate-x-full ease-in', open ? '' : '-translate-x-full ease-in',
expanded ? 'w-56' : 'w-16' expanded ? 'w-56' : 'w-16',
]" ]"
class="fixed md:static md:translate-x-0 md:inset-0 inset-y-0 left-0 z-30 transition duration-300 flex overflow-y-auto bg-primary border-r border-divider" class="fixed md:static md:translate-x-0 md:inset-0 inset-y-0 left-0 z-30 transition duration-300 flex overflow-y-auto bg-primary border-r border-divider"
> >
<div class="w-full"> <div class="w-full">
<div class="flex items-center px-4 my-4"> <div class="flex items-center px-4 my-4">
<img src="/logo.svg" alt="Hoppscotch" class="h-7 w-7" /> <img src="/logo.svg" alt="Hoppscotch" class="h-7 w-7" />
<span v-if="expanded" class="ml-4 font-semibold text-accentContrast">HOPPSCOTCH</span> <span v-if="expanded" class="ml-4 font-semibold text-accentContrast"
>HOPPSCOTCH</span
>
</div> </div>
<nav class="my-5"> <nav class="my-5">

View file

@ -2,13 +2,13 @@ import { createApp } from "vue"
import App from "./App.vue" import App from "./App.vue"
import router from "./router" import router from "./router"
import '@hoppscotch/ui/style.css' import "@hoppscotch/ui/style.css"
import './assets/scss/styles.scss' import "./assets/scss/styles.scss"
import './assets/scss/tailwind.scss' import "./assets/scss/tailwind.scss"
import '@fontsource-variable/inter' import "@fontsource-variable/inter"
import '@fontsource-variable/material-symbols-rounded' import "@fontsource-variable/material-symbols-rounded"
import '@fontsource-variable/roboto-mono' import "@fontsource-variable/roboto-mono"
const app = createApp(App) const app = createApp(App)
app.use(router) app.use(router)
app.mount('#app') app.mount("#app")

View file

@ -1,15 +1,15 @@
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from "vue-router"
import Home from './views/Home.vue' import Home from "./views/Home.vue"
const router = createRouter({ const router = createRouter({
history: createWebHistory(), history: createWebHistory(),
routes: [ routes: [
{ {
path: '/', path: "/",
name: 'home', name: "home",
component: Home component: Home,
} },
] ],
}) })
export default router export default router

View file

@ -17,18 +17,18 @@ export enum UpdateStatus {
DOWNLOADING = "downloading", DOWNLOADING = "downloading",
INSTALLING = "installing", INSTALLING = "installing",
READY_TO_RESTART = "ready_to_restart", READY_TO_RESTART = "ready_to_restart",
ERROR = "error" ERROR = "error",
} }
export enum CheckResult { export enum CheckResult {
AVAILABLE, AVAILABLE,
NOT_AVAILABLE, NOT_AVAILABLE,
TIMEOUT, TIMEOUT,
ERROR ERROR,
} }
export interface UpdateState { export interface UpdateState {
status: UpdateStatus; status: UpdateStatus
version?: string; version?: string
message?: string; message?: string
} }

View file

@ -1,28 +1,30 @@
import { check, type DownloadEvent } from "@tauri-apps/plugin-updater"; import { check, type DownloadEvent } from "@tauri-apps/plugin-updater"
import { relaunch } from "@tauri-apps/plugin-process"; import { relaunch } from "@tauri-apps/plugin-process"
import { type LazyStore } from "@tauri-apps/plugin-store"; import { type LazyStore } from "@tauri-apps/plugin-store"
import { UpdateStatus, CheckResult, UpdateState } from "~/types"; import { UpdateStatus, CheckResult, UpdateState } from "~/types"
export class UpdaterService { export class UpdaterService {
private currentProgress: { downloaded: number; total?: number } = { downloaded: 0 }; private currentProgress: { downloaded: number; total?: number } = {
downloaded: 0,
}
constructor(private store: LazyStore) {} constructor(private store: LazyStore) {}
async initialize(): Promise<void> { async initialize(): Promise<void> {
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.IDLE status: UpdateStatus.IDLE,
}); })
} }
getCurrentProgress(): { downloaded: number; total?: number } { getCurrentProgress(): { downloaded: number; total?: number } {
return this.currentProgress; return this.currentProgress
} }
async checkForUpdates(timeout = 5000): Promise<CheckResult> { async checkForUpdates(timeout = 5000): Promise<CheckResult> {
try { try {
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.CHECKING status: UpdateStatus.CHECKING,
}); })
// This creats a timeout promise that is slightly longer than `check`'s internal timeout, // This creats a timeout promise that is slightly longer than `check`'s internal timeout,
// this is just to make sure we don't keep checking for updates indefinitely. // this is just to make sure we don't keep checking for updates indefinitely.
@ -31,132 +33,133 @@ export class UpdaterService {
const timeoutPromise = new Promise<null>((resolve) => { const timeoutPromise = new Promise<null>((resolve) => {
// Longer local timeout to make sure it only triggers // Longer local timeout to make sure it only triggers
// if there's an issue with `check`'s built-in timeout. // if there's an issue with `check`'s built-in timeout.
const bufferTimeout = timeout + 1000; const bufferTimeout = timeout + 1000
setTimeout(() => { setTimeout(() => {
console.log("Update check exceeded buffer timeout, likely hanging in check function"); console.log(
resolve(null); "Update check exceeded buffer timeout, likely hanging in check function"
}, bufferTimeout); )
}); resolve(null)
}, bufferTimeout)
})
const updateResult = await Promise.race([ const updateResult = await Promise.race([
check({ timeout }), check({ timeout }),
timeoutPromise timeoutPromise,
]); ])
// If we got a timeout (null), we treat it as no update available // If we got a timeout (null), we treat it as no update available
// NOTE: We could maybe show more info but for now this works fine // NOTE: We could maybe show more info but for now this works fine
if (!updateResult) { if (!updateResult) {
console.log("Update check timed out or no update available"); console.log("Update check timed out or no update available")
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.NOT_AVAILABLE status: UpdateStatus.NOT_AVAILABLE,
}); })
return CheckResult.TIMEOUT; return CheckResult.TIMEOUT
} }
const hasUpdates = updateResult.available; const hasUpdates = updateResult.available
await this.saveUpdateState( await this.saveUpdateState(
hasUpdates hasUpdates
? { ? {
status: UpdateStatus.AVAILABLE, status: UpdateStatus.AVAILABLE,
version: updateResult.version, version: updateResult.version,
message: updateResult.body message: updateResult.body,
} }
: { : {
status: UpdateStatus.NOT_AVAILABLE status: UpdateStatus.NOT_AVAILABLE,
} }
); )
console.log("Update check result:", { console.log("Update check result:", {
available: updateResult.available, available: updateResult.available,
currentVersion: updateResult.currentVersion, currentVersion: updateResult.currentVersion,
version: updateResult.version version: updateResult.version,
}); })
return hasUpdates ? CheckResult.AVAILABLE : CheckResult.NOT_AVAILABLE; return hasUpdates ? CheckResult.AVAILABLE : CheckResult.NOT_AVAILABLE
} catch (error) { } catch (error) {
console.error("Error checking for updates:", error); console.error("Error checking for updates:", error)
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.ERROR, status: UpdateStatus.ERROR,
message: String(error) message: String(error),
}); })
return CheckResult.ERROR; return CheckResult.ERROR
} }
} }
async downloadAndInstall(): Promise<void> { async downloadAndInstall(): Promise<void> {
try { try {
const updateResult = await check(); const updateResult = await check()
if (!updateResult) { if (!updateResult) {
throw new Error("No update available to install"); throw new Error("No update available to install")
} }
let totalBytes: number | undefined; let totalBytes: number | undefined
let downloadedBytes = 0; let downloadedBytes = 0
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.DOWNLOADING, status: UpdateStatus.DOWNLOADING,
}); })
await updateResult.downloadAndInstall( await updateResult.downloadAndInstall((event: DownloadEvent) => {
(event: DownloadEvent) => {
try { try {
if (event.event === 'Started') { if (event.event === "Started") {
totalBytes = event.data.contentLength; totalBytes = event.data.contentLength
downloadedBytes = 0; downloadedBytes = 0
console.log(`Download started, total size: ${totalBytes} bytes`); console.log(`Download started, total size: ${totalBytes} bytes`)
} else if (event.event === 'Progress') { } else if (event.event === "Progress") {
downloadedBytes += event.data.chunkLength; downloadedBytes += event.data.chunkLength
console.log(`Download progress: ${downloadedBytes}/${totalBytes} bytes`); console.log(
`Download progress: ${downloadedBytes}/${totalBytes} bytes`
)
this.currentProgress = { this.currentProgress = {
downloaded: downloadedBytes, downloaded: downloadedBytes,
total: totalBytes total: totalBytes,
}; }
} else if (event.event === 'Finished') { } else if (event.event === "Finished") {
console.log("Download finished, starting installation"); console.log("Download finished, starting installation")
this.saveUpdateState({ this.saveUpdateState({
status: UpdateStatus.INSTALLING status: UpdateStatus.INSTALLING,
}); })
} }
} catch (error) { } catch (error) {
console.warn('Progress tracking error:', error); console.warn("Progress tracking error:", error)
} }
} })
);
// If we reach here, it means the app hasn't restarted automatically // If we reach here, it means the app hasn't restarted automatically
// Mark as ready to restart // Mark as ready to restart
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.READY_TO_RESTART status: UpdateStatus.READY_TO_RESTART,
}); })
} catch (error) { } catch (error) {
console.error("Error installing updates:", error); console.error("Error installing updates:", error)
await this.saveUpdateState({ await this.saveUpdateState({
status: UpdateStatus.ERROR, status: UpdateStatus.ERROR,
message: String(error) message: String(error),
}); })
throw error; throw error
} }
} }
async restartApp(): Promise<void> { async restartApp(): Promise<void> {
try { try {
await relaunch(); await relaunch()
} catch (error) { } catch (error) {
console.error("Failed to restart app:", error); console.error("Failed to restart app:", error)
throw error; throw error
} }
} }
private async saveUpdateState(state: UpdateState): Promise<void> { private async saveUpdateState(state: UpdateState): Promise<void> {
try { try {
await this.store.set("updateState", state); await this.store.set("updateState", state)
await this.store.save(); await this.store.save()
} catch (error) { } catch (error) {
console.error("Failed to save update state:", error); console.error("Failed to save update state:", error)
} }
} }
} }

View file

@ -1,7 +1,7 @@
import { Config } from 'tailwindcss'; import { Config } from "tailwindcss"
import preset from '@hoppscotch/ui/ui-preset'; import preset from "@hoppscotch/ui/ui-preset"
export default { export default {
content: ['src/**/*.{vue,html}'], content: ["src/**/*.{vue,html}"],
presets: [preset], presets: [preset],
} satisfies Config; } satisfies Config

View file

@ -47,18 +47,18 @@ export default defineConfig(async () => ({
}, },
optimizeDeps: { optimizeDeps: {
include: ['@hoppscotch/kernel'] include: ["@hoppscotch/kernel"],
}, },
build: { build: {
rollupOptions: { rollupOptions: {
output: { output: {
manualChunks: { manualChunks: {
kernel: ['@hoppscotch/kernel'], kernel: ["@hoppscotch/kernel"],
ui: ['@hoppscotch/ui'], ui: ["@hoppscotch/ui"],
} },
} },
} },
}, },
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`

View file

@ -35,9 +35,9 @@
}, },
"homepage": "https://github.com/hoppscotch/hoppscotch#readme", "homepage": "https://github.com/hoppscotch/hoppscotch#readme",
"devDependencies": { "devDependencies": {
"@types/node": "22.9.3", "@types/node": "24.3.0",
"typescript": "5.8.3", "typescript": "5.9.2",
"vite": "5.4.11" "vite": "6.3.5"
}, },
"peerDependencies": { "peerDependencies": {
"@tauri-apps/api": "2.1.1" "@tauri-apps/api": "2.1.1"
@ -48,15 +48,15 @@
} }
}, },
"dependencies": { "dependencies": {
"axios": "1.8.2", "axios": "1.11.0",
"fp-ts": "2.16.9", "fp-ts": "2.16.11",
"aws4fetch": "1.0.20", "aws4fetch": "1.0.20",
"zod": "3.22.4", "zod": "3.25.32",
"superjson": "2.2.2", "superjson": "2.2.2",
"@tauri-apps/plugin-shell": "2.0.1", "@tauri-apps/plugin-shell": "2.0.1",
"@tauri-apps/plugin-dialog": "2.0.1", "@tauri-apps/plugin-dialog": "2.0.1",
"@tauri-apps/plugin-fs": "2.0.2", "@tauri-apps/plugin-fs": "2.0.2",
"@tauri-apps/plugin-store": "2.2.0", "@tauri-apps/plugin-store": "2.2.0",
"@hoppscotch/plugin-relay": "github:CuriousCorrelation/tauri-plugin-relay#4ed4fcafeb93856591e8a36522f6ec6e340e4dc5" "@hoppscotch/plugin-relay": "github:CuriousCorrelation/tauri-plugin-relay#ff18f776ddeb53dbbdeaf97e1fabc30bdc57c158"
} }
} }

View file

@ -8,7 +8,14 @@ export const implementation: VersionedAPI<IoV1> = {
version: { major: 1, minor: 0, patch: 0 }, version: { major: 1, minor: 0, patch: 0 },
api: { api: {
async saveFileWithDialog(opts: SaveFileWithDialogOptions) { async saveFileWithDialog(opts: SaveFileWithDialogOptions) {
const file = new Blob([opts.data], { type: opts.contentType }) // TODO: Revisit this because perhaps a better approach is
// ```ts
// const data: BlobPart = typeof opts.data === 'string'
// ? opts.data
// : new Uint8Array(opts.data);
// const file = new Blob([data], { type: opts.contentType })
// ```
const file = new Blob([opts.data as BlobPart], { type: opts.contentType })
const a = document.createElement("a") const a = document.createElement("a")
const url = URL.createObjectURL(file) const url = URL.createObjectURL(file)

View file

@ -45,7 +45,7 @@
"stream-browserify": "3.0.0", "stream-browserify": "3.0.0",
"util": "0.12.5", "util": "0.12.5",
"verzod": "0.4.0", "verzod": "0.4.0",
"vue": "3.5.18", "vue": "3.5.19",
"workbox-window": "7.3.0", "workbox-window": "7.3.0",
"zod": "3.25.32" "zod": "3.25.32"
}, },
@ -86,8 +86,8 @@
"vite-plugin-inspect": "11.3.2", "vite-plugin-inspect": "11.3.2",
"vite-plugin-pages": "0.33.1", "vite-plugin-pages": "0.33.1",
"vite-plugin-pages-sitemap": "1.7.1", "vite-plugin-pages-sitemap": "1.7.1",
"vite-plugin-pwa": "1.0.2", "vite-plugin-pwa": "1.0.3",
"vite-plugin-static-copy": "3.1.1", "vite-plugin-static-copy": "3.1.2",
"vite-plugin-vue-layouts": "0.11.0", "vite-plugin-vue-layouts": "0.11.0",
"vue-tsc": "2.1.6" "vue-tsc": "2.1.6"
} }

View file

@ -39,7 +39,7 @@
"ts-node-dev": "2.0.0", "ts-node-dev": "2.0.0",
"unplugin-icons": "22.2.0", "unplugin-icons": "22.2.0",
"unplugin-vue-components": "29.0.0", "unplugin-vue-components": "29.0.0",
"vue": "3.5.18", "vue": "3.5.19",
"vue-i18n": "11.1.11", "vue-i18n": "11.1.11",
"vue-router": "4.5.1", "vue-router": "4.5.1",
"vue-tippy": "6.7.1" "vue-tippy": "6.7.1"
@ -58,7 +58,7 @@
"@import-meta-env/unplugin": "0.6.2", "@import-meta-env/unplugin": "0.6.2",
"@types/lodash-es": "4.17.12", "@types/lodash-es": "4.17.12",
"@vitejs/plugin-vue": "5.1.4", "@vitejs/plugin-vue": "5.1.4",
"@vue/compiler-sfc": "3.5.18", "@vue/compiler-sfc": "3.5.19",
"autoprefixer": "10.4.21", "autoprefixer": "10.4.21",
"dotenv": "17.2.1", "dotenv": "17.2.1",
"graphql-tag": "2.12.6", "graphql-tag": "2.12.6",

File diff suppressed because it is too large Load diff