feat(desktop): portable phase-1 foundational: infra & build (#5259)

This commit is contained in:
Shreyas 2025-07-24 15:45:48 +05:30 committed by GitHub
parent 876d0fd322
commit 899db05ab8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 1091 additions and 139 deletions

View file

@ -19,7 +19,7 @@
}, },
"exports": { "exports": {
".": { ".": {
"type": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"import": "./dist/hoppscotch-data.js", "import": "./dist/hoppscotch-data.js",
"require": "./dist/hoppscotch-data.cjs" "require": "./dist/hoppscotch-data.cjs"
} }

View file

@ -0,0 +1,67 @@
/* eslint-env node */
require("@rushstack/eslint-patch/modern-module-resolution")
module.exports = {
root: true,
env: {
browser: true,
node: true,
jest: true,
},
parserOptions: {
sourceType: "module",
requireConfigFile: false,
ecmaFeatures: {
jsx: false,
},
},
extends: [
"@vue/typescript/recommended",
"plugin:vue/vue3-recommended",
"plugin:prettier/recommended",
],
ignorePatterns: [
"static/**/*",
"./helpers/backend/graphql.ts",
"**/*.d.ts",
"types/**/*",
],
plugins: ["vue", "prettier"],
// add your custom rules here
rules: {
semi: [2, "never"],
"import/named": "off", // because, named import issue with typescript see: https://github.com/typescript-eslint/typescript-eslint/issues/154
"no-console": "off",
"no-debugger": process.env.HOPP_LINT_FOR_PROD === "true" ? "error" : "warn",
"prettier/prettier":
process.env.HOPP_LINT_FOR_PROD === "true" ? "error" : "warn",
"vue/multi-word-component-names": "off",
"vue/no-side-effects-in-computed-properties": "off",
"import/no-named-as-default": "off",
"import/no-named-as-default-member": "off",
"@typescript-eslint/no-unused-vars":
process.env.HOPP_LINT_FOR_PROD === "true" ? "error" : "warn",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-explicit-any": "off",
"import/default": "off",
"no-undef": "off",
// localStorage block
"no-restricted-globals": [
"error",
{
name: "localStorage",
message:
"Do not use 'localStorage' directly. Please use localpersistence.ts functions or stores",
},
],
// window.localStorage block
"no-restricted-syntax": [
"error",
{
selector: "CallExpression[callee.object.property.name='localStorage']",
message:
"Do not use 'localStorage' directly. Please use localpersistence.ts functions or stores",
},
],
},
}

View file

@ -8,32 +8,50 @@
"build": "vue-tsc --noEmit && vite build", "build": "vue-tsc --noEmit && vite build",
"preview": "vite preview", "preview": "vite preview",
"tauri": "tauri", "tauri": "tauri",
"dev:full": "(cd ../hoppscotch-selfhost-web && pnpm install && pnpm generate) && (cd crates/webapp-bundler && cargo build --release && cd target/release && ./webapp-bundler --input ../../../../../hoppscotch-selfhost-web/dist --output ../../../../bundle.zip --manifest ../../../../manifest.json) && (cd src-tauri && pnpm tauri dev)", "lint": "eslint src --ext .ts,.js,.vue --ignore-path .gitignore .",
"build:full": "(cd ../hoppscotch-selfhost-web && pnpm install && pnpm generate) && (cd crates/webapp-bundler && cargo build --release && cd target/release && ./webapp-bundler --input ../../../../../hoppscotch-selfhost-web/dist --output ../../../../bundle.zip --manifest ../../../../manifest.json) && (cd src-tauri && pnpm tauri build)" "lint:ts": "vue-tsc --noEmit",
"lintfix": "eslint --fix src --ext .ts,.js,.vue --ignore-path .gitignore .",
"prod-lint": "cross-env HOPP_LINT_FOR_PROD=true pnpm run lint",
"prepare-web": "(cd ../hoppscotch-selfhost-web && pnpm install && pnpm generate) && (cd crates/webapp-bundler && cargo build --release && cd target/release && ./webapp-bundler --input ../../../../../hoppscotch-selfhost-web/dist --output ../../../../bundle.zip --manifest ../../../../manifest.json)",
"dev:full": "pnpm tauri dev",
"build:full": "pnpm tauri build",
"dev:portable": "pnpm tauri dev -- --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.1.0",
"@fontsource-variable/material-symbols-rounded": "5.1.3", "@fontsource-variable/material-symbols-rounded": "5.1.3",
"@fontsource-variable/roboto-mono": "5.1.0", "@fontsource-variable/roboto-mono": "5.1.0",
"@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#1b52e49d881926135838cf6cfebdc1643a9bec31",
"@hoppscotch/ui": "0.2.1", "@hoppscotch/ui": "0.2.1",
"@tauri-apps/api": "2.1.1", "@tauri-apps/api": "2.1.1",
"@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": "11.1.0",
"fp-ts": "2.16.9", "fp-ts": "2.16.9",
"rxjs": "7.8.1",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-router": "4.4.5", "vue-router": "4.4.5",
"vue-tippy": "6.5.0" "vue-tippy": "6.5.0",
"zod": "3.23.8"
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/lucide": "1.2.10", "@iconify-json/lucide": "1.2.10",
"@rushstack/eslint-patch": "1.10.4",
"@tauri-apps/cli": "^2", "@tauri-apps/cli": "^2",
"@typescript-eslint/eslint-plugin": "8.9.0",
"@typescript-eslint/parser": "8.9.0",
"@vitejs/plugin-vue": "^5.0.5", "@vitejs/plugin-vue": "^5.0.5",
"@vue/eslint-config-typescript": "13.0.0",
"autoprefixer": "10.4.20", "autoprefixer": "10.4.20",
"eslint": "8.57.0",
"eslint-plugin-prettier": "5.2.1",
"eslint-plugin-vue": "9.29.0",
"postcss": "8.4.49", "postcss": "8.4.49",
"sass": "1.80.3", "sass": "1.80.3",
"tailwindcss": "3.4.14", "tailwindcss": "3.4.14",

File diff suppressed because it is too large Load diff

View file

@ -38,7 +38,20 @@ tokio = "1.43.0"
tauri-plugin-process = "2.2.0" tauri-plugin-process = "2.2.0"
file-rotate = "0.8.0" file-rotate = "0.8.0"
dirs = "6.0.0" dirs = "6.0.0"
thiserror = "2.0.12"
native-dialog = { version = "0.7.0" }
tauri-plugin-http = { version = "2.0.1", features = ["gzip"] }
tauri-plugin-opener = "2"
semver = "1.0"
[target.'cfg(windows)'.dependencies]
tempfile = { version = "3.13.0" }
winreg = { version = "0.52.0" }
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-updater = "2.3.1" tauri-plugin-updater = "2.3.1"
tauri-plugin-window-state = "2.2.1" tauri-plugin-window-state = "2.2.1"
[features]
default = []
portable = []

View file

@ -1,3 +1,20 @@
fn main() { fn main() {
#[cfg(all(feature = "portable", target_os = "windows"))]
{
println!("cargo:rerun-if-changed=tauri.portable.windows.conf.json");
println!("cargo:rustc-env=TAURI_CONFIG_FILE=tauri.portable.windows.conf.json");
}
#[cfg(all(feature = "portable", target_os = "macos"))]
{
println!("cargo:rerun-if-changed=tauri.portable.macos.conf.json");
println!("cargo:rustc-env=TAURI_CONFIG_FILE=tauri.portable.macos.conf.json");
}
#[cfg(not(feature = "portable"))]
{
println!("cargo:rerun-if-changed=tauri.conf.json");
}
tauri_build::build() tauri_build::build()
} }

View file

@ -14,7 +14,7 @@
{ {
"title": "main", "title": "main",
"width": 500, "width": 500,
"height": 600, "height": 700,
"decorations": false, "decorations": false,
"alwaysOnTop": true, "alwaysOnTop": true,
"resizable": false "resizable": false

View file

@ -0,0 +1,62 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Hoppscotch",
"version": "25.6.1",
"identifier": "io.hoppscotch.desktop",
"build": {
"beforeDevCommand": "pnpm dev",
"devUrl": "http://127.0.0.1:1420",
"beforeBuildCommand": "pnpm build",
"frontendDist": "../dist"
},
"app": {
"windows": [
{
"title": "main",
"width": 500,
"height": 700,
"decorations": false,
"alwaysOnTop": true,
"resizable": false
}
],
"security": {
"csp": {
"default-src": "blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' customprotocol: asset:",
"script-src": "* 'self' 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline'",
"connect-src": "ipc: http://ipc.localhost https://api.hoppscotch.io data: *",
"font-src": "https://fonts.gstatic.com data: 'self' *",
"img-src": "'self' asset: http://asset.localhost blob: data: customprotocol: *",
"style-src": "'unsafe-inline' 'self' https://fonts.googleapis.com data: asset: *",
"worker-src": "* 'self' data: 'unsafe-eval' blob:"
}
}
},
"bundle": {
"active": true,
"targets": "all",
"createUpdaterArtifacts": false,
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
},
"plugins": {
"deep-link": {
"desktop": {
"schemes": ["io.hoppscotch.desktop"]
}
},
"updater": {
"active": true,
"endpoints": [
"https://releases.hoppscotch.com/hoppscotch-selfhost-desktop.json"
],
"dialog": false,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDYwOURFNEY4RDRGMDQxNTgKUldSWVFmRFUrT1NkWUc1RDM0Z2ZjTHE2dG52Q3ZlYzg3ZXVpZU9KaENPWTBMd3MwY0hWa1lreDcK"
}
}
}

View file

@ -0,0 +1,60 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Hoppscotch",
"version": "25.6.1",
"identifier": "io.hoppscotch.desktop",
"build": {
"beforeDevCommand": "pnpm dev",
"devUrl": "http://127.0.0.1:1420",
"beforeBuildCommand": "pnpm build",
"frontendDist": "../dist"
},
"app": {
"windows": [
{
"title": "main",
"width": 500,
"height": 700,
"decorations": false,
"alwaysOnTop": true,
"resizable": false
}
],
"security": {
"csp": {
"default-src": "blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' customprotocol: asset:",
"script-src": "* 'self' 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline'",
"connect-src": "ipc: http://ipc.localhost https://api.hoppscotch.io data: *",
"font-src": "https://fonts.gstatic.com data: 'self' *",
"img-src": "'self' asset: http://asset.localhost blob: data: customprotocol: *",
"style-src": "'unsafe-inline' 'self' https://fonts.googleapis.com data: asset: *",
"worker-src": "* 'self' data: 'unsafe-eval' blob:"
}
}
},
"bundle": {
"active": false,
"targets": "all",
"windows": {
"webviewInstallMode": {
"type": "skip"
}
},
"createUpdaterArtifacts": false
},
"plugins": {
"deep-link": {
"desktop": {
"schemes": ["io.hoppscotch.desktop"]
}
},
"updater": {
"active": true,
"endpoints": [
"https://releases.hoppscotch.com/hoppscotch-selfhost-desktop.json"
],
"dialog": false,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDYwOURFNEY4RDRGMDQxNTgKUldSWVFmRFUrT1NkWUc1RDM0Z2ZjTHE2dG52Q3ZlYzg3ZXVpZU9KaENPWTBMd3MwY0hWa1lreDcK"
}
}
}

View file

@ -0,0 +1,13 @@
import { KernelAPI } from "@hoppscotch/kernel"
export { Io } from "./io"
export { Relay } from "./relay"
export { Store } from "./store"
export const getModule = <K extends keyof KernelAPI>(
name: K
): NonNullable<KernelAPI[K]> => {
const kernel = window.__KERNEL__
if (!kernel?.[name]) throw new Error(`Kernel ${String(name)} not initialized`)
return kernel[name]
}

View file

@ -0,0 +1,34 @@
import type {
SaveFileWithDialogOptions,
OpenExternalLinkOptions,
SaveFileResponse,
OpenExternalLinkResponse,
EventCallback,
UnlistenFn,
} from "@hoppscotch/kernel"
import { getModule } from "."
export const Io = (() => {
const module = () => getModule("io")
return {
saveFileWithDialog: (
opts: SaveFileWithDialogOptions
): Promise<SaveFileResponse> => module().saveFileWithDialog(opts),
openExternalLink: (
opts: OpenExternalLinkOptions
): Promise<OpenExternalLinkResponse> => module().openExternalLink(opts),
listen: <T>(
event: string,
handler: EventCallback<T>
): Promise<UnlistenFn> => module().listen(event, handler),
once: <T>(event: string, handler: EventCallback<T>): Promise<UnlistenFn> =>
module().once(event, handler),
emit: (event: string, payload?: unknown): Promise<void> =>
module().emit(event, payload),
} as const
})()

View file

@ -0,0 +1,26 @@
import type {
RelayRequest,
RelayRequestEvents,
RelayError,
RelayResponse,
RelayEventEmitter,
} from "@hoppscotch/kernel"
import * as E from "fp-ts/Either"
import { getModule } from "."
export const Relay = (() => {
const module = () => getModule("relay")
return {
capabilities: () => module().capabilities,
canHandle: (request: RelayRequest): E.Either<RelayError, true> =>
module().canHandle(request),
execute: (
request: RelayRequest
): {
cancel: () => Promise<void>
emitter: RelayEventEmitter<RelayRequestEvents>
response: Promise<E.Either<RelayError, RelayResponse>>
} => module().execute(request),
} as const
})()

View file

@ -0,0 +1,114 @@
import type {
StorageOptions,
StoreError,
StoreEvents,
StoreEventEmitter,
} from "@hoppscotch/kernel"
import * as E from "fp-ts/Either"
import { getModule } from "."
import { invoke } from "@tauri-apps/api/core"
import { join } from "@tauri-apps/api/path"
const STORE_PATH = "hoppscotch-unified.store"
export const getConfigDir = async (): Promise<string> => {
return invoke<string>("get_config_dir")
}
export const getBackupDir = async (): Promise<string> => {
return invoke<string>("get_backup_dir")
}
export const getLatestDir = async (): Promise<string> => {
return invoke<string>("get_latest_dir")
}
export const getStoreDir = async (): Promise<string> => {
return invoke<string>("get_store_dir")
}
export const getInstanceDir = async (): Promise<string> => {
return invoke<string>("get_instance_dir")
}
const getStorePath = async (): Promise<string> => {
try {
const instanceDir = await getInstanceDir()
return join(instanceDir, STORE_PATH)
} catch (error) {
console.error("Failed to get instance directory:", error)
return "hoppscotch-unified.store"
}
}
export const Store = (() => {
const module = () => getModule("store")
return {
capabilities: () => module().capabilities,
init: async () => {
const storePath = await getStorePath()
return module().init(storePath)
},
set: async (
namespace: string,
key: string,
value: unknown,
options?: StorageOptions
): Promise<E.Either<StoreError, void>> => {
const storePath = await getStorePath()
return module().set(storePath, namespace, key, value, options)
},
get: async <T>(
namespace: string,
key: string
): Promise<E.Either<StoreError, T | undefined>> => {
const storePath = await getStorePath()
return module().get<T>(storePath, namespace, key)
},
remove: async (
namespace: string,
key: string
): Promise<E.Either<StoreError, boolean>> => {
const storePath = await getStorePath()
return module().remove(storePath, namespace, key)
},
clear: async (namespace?: string): Promise<E.Either<StoreError, void>> => {
const storePath = await getStorePath()
return module().clear(storePath, namespace)
},
has: async (
namespace: string,
key: string
): Promise<E.Either<StoreError, boolean>> => {
const storePath = await getStorePath()
return module().has(storePath, namespace, key)
},
listNamespaces: async (): Promise<E.Either<StoreError, string[]>> => {
const storePath = await getStorePath()
return module().listNamespaces(storePath)
},
listKeys: async (
namespace: string
): Promise<E.Either<StoreError, string[]>> => {
const storePath = await getStorePath()
return module().listKeys(storePath, namespace)
},
watch: async (
namespace: string,
key: string
): Promise<StoreEventEmitter<StoreEvents>> => {
const storePath = await getStorePath()
return module().watch(storePath, namespace, key)
},
} as const
})()

View file

@ -0,0 +1,9 @@
import type { KernelAPI } from "@hoppscotch/kernel"
declare global {
interface Window {
__KERNEL__?: KernelAPI
}
}
export {}

View file

@ -21,16 +21,21 @@
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"paths": { "paths": {
"~/*": ["./src/*"], "~/*": ["./src/*"],
"@hoppscotch/common": ["../hoppscotch-common/src/index.ts"],
"@hoppscotch/common/*": ["../hoppscotch-common/src/*"],
"@composables/*": ["./src/composables/*"], "@composables/*": ["./src/composables/*"],
"@components/*": ["./src/components/*"], "@components/*": ["./src/components/*"],
"@helpers/*": ["./src/helpers/*"], "@helpers/*": ["./src/helpers/*"],
"@kernel/*": ["./src/kernel/*"],
"@modules/*": ["./src/modules/*"], "@modules/*": ["./src/modules/*"],
"@services/*": ["./src/services/*"],
"@workers/*": ["./src/workers/*"], "@workers/*": ["./src/workers/*"],
"@functional/*": ["./src/helpers/functional/*"] "@functional/*": ["./src/helpers/functional/*"]
}, },
"types": [ "types": [
"vite/client", "vite/client",
"unplugin-icons/types/vue" "unplugin-icons/types/vue",
"./src/types/kernel.d.ts"
] ]
}, },
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],

View file

@ -1,9 +1,9 @@
import { defineConfig } from "vite" import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue" import vue from "@vitejs/plugin-vue"
import Icons from 'unplugin-icons/vite' import Icons from "unplugin-icons/vite"
import IconResolver from 'unplugin-icons/resolver' import IconResolver from "unplugin-icons/resolver"
import Components from 'unplugin-vue-components/vite' import Components from "unplugin-vue-components/vite"
import path from 'path' import path from "path"
// @ts-expect-error process is a nodejs global // @ts-expect-error process is a nodejs global
const host = process.env.TAURI_DEV_HOST const host = process.env.TAURI_DEV_HOST
@ -12,28 +12,28 @@ export default defineConfig(async () => ({
plugins: [ plugins: [
vue(), vue(),
Components({ Components({
dts: './src/components.d.ts', dts: "./src/components.d.ts",
resolvers: [ resolvers: [
IconResolver({ IconResolver({
prefix: 'icon', prefix: "icon",
}), }),
(compName: string) => { (compName: string) => {
if (compName.startsWith('Hopp')) if (compName.startsWith("Hopp"))
return { name: compName, from: '@hoppscotch/ui' } return { name: compName, from: "@hoppscotch/ui" }
return undefined return undefined
}, },
], ],
types: [ types: [
{ {
from: 'vue-tippy', from: "vue-tippy",
names: ['Tippy'], names: ["Tippy"],
}, },
], ],
include: [/\.vue$/, /\.vue\?vue/], include: [/\.vue$/, /\.vue\?vue/],
dirs: ['src/components'], dirs: ["src/components"],
}), }),
Icons({ Icons({
compiler: 'vue3', compiler: "vue3",
}), }),
], ],
@ -41,6 +41,7 @@ export default defineConfig(async () => ({
alias: { alias: {
"~": path.resolve(__dirname, "src"), "~": path.resolve(__dirname, "src"),
"~/": path.resolve(__dirname, "src/"), "~/": path.resolve(__dirname, "src/"),
"@hoppscotch/common": "@hoppscotch/common/src",
}, },
dedupe: ["vue"], dedupe: ["vue"],
}, },
@ -65,13 +66,13 @@ export default defineConfig(async () => ({
server: { server: {
port: 1420, port: 1420,
strictPort: true, strictPort: true,
host: '127.0.0.1', host: "127.0.0.1",
hmr: host hmr: host
? { ? {
protocol: "ws", protocol: "ws",
host, host,
port: 1421, port: 1421,
} }
: undefined, : undefined,
watch: { watch: {
ignored: ["**/src-tauri/**"], ignored: ["**/src-tauri/**"],

View file

@ -19,7 +19,7 @@
}, },
"exports": { "exports": {
".": { ".": {
"type": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"import": "./dist/hoppscotch-kernel.js", "import": "./dist/hoppscotch-kernel.js",
"require": "./dist/hoppscotch-kernel.cjs" "require": "./dist/hoppscotch-kernel.cjs"
} }

View file

@ -994,6 +994,9 @@ importers:
'@fontsource-variable/roboto-mono': '@fontsource-variable/roboto-mono':
specifier: 5.1.0 specifier: 5.1.0
version: 5.1.0 version: 5.1.0
'@hoppscotch/common':
specifier: workspace:^
version: link:../hoppscotch-common
'@hoppscotch/kernel': '@hoppscotch/kernel':
specifier: workspace:^ specifier: workspace:^
version: link:../hoppscotch-kernel version: link:../hoppscotch-kernel
@ -1002,10 +1005,13 @@ importers:
version: '@CuriousCorrelation/plugin-appload@https://codeload.github.com/CuriousCorrelation/tauri-plugin-appload/tar.gz/1b52e49d881926135838cf6cfebdc1643a9bec31' version: '@CuriousCorrelation/plugin-appload@https://codeload.github.com/CuriousCorrelation/tauri-plugin-appload/tar.gz/1b52e49d881926135838cf6cfebdc1643a9bec31'
'@hoppscotch/ui': '@hoppscotch/ui':
specifier: 0.2.1 specifier: 0.2.1
version: 0.2.1(eslint@9.27.0(jiti@2.4.2))(terser@5.39.2)(typescript@5.8.3)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3)) version: 0.2.1(eslint@8.57.0)(terser@5.39.2)(typescript@5.8.3)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))
'@tauri-apps/api': '@tauri-apps/api':
specifier: 2.1.1 specifier: 2.1.1
version: 2.1.1 version: 2.1.1
'@tauri-apps/plugin-fs':
specifier: 2.0.2
version: 2.0.2
'@tauri-apps/plugin-process': '@tauri-apps/plugin-process':
specifier: 2.2.0 specifier: 2.2.0
version: 2.2.0 version: 2.2.0
@ -1024,6 +1030,9 @@ importers:
fp-ts: fp-ts:
specifier: 2.16.9 specifier: 2.16.9
version: 2.16.9 version: 2.16.9
rxjs:
specifier: 7.8.1
version: 7.8.1
vue: vue:
specifier: 3.5.12 specifier: 3.5.12
version: 3.5.12(typescript@5.8.3) version: 3.5.12(typescript@5.8.3)
@ -1033,19 +1042,43 @@ importers:
vue-tippy: vue-tippy:
specifier: 6.5.0 specifier: 6.5.0
version: 6.5.0(vue@3.5.12(typescript@5.8.3)) version: 6.5.0(vue@3.5.12(typescript@5.8.3))
zod:
specifier: 3.23.8
version: 3.23.8
devDependencies: devDependencies:
'@iconify-json/lucide': '@iconify-json/lucide':
specifier: 1.2.10 specifier: 1.2.10
version: 1.2.10 version: 1.2.10
'@rushstack/eslint-patch':
specifier: 1.10.4
version: 1.10.4
'@tauri-apps/cli': '@tauri-apps/cli':
specifier: ^2 specifier: ^2
version: 2.0.4 version: 2.0.4
'@typescript-eslint/eslint-plugin':
specifier: 8.9.0
version: 8.9.0(@typescript-eslint/parser@8.9.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)
'@typescript-eslint/parser':
specifier: 8.9.0
version: 8.9.0(eslint@8.57.0)(typescript@5.8.3)
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^5.0.5 specifier: ^5.0.5
version: 5.1.4(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3)) version: 5.1.4(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))
'@vue/eslint-config-typescript':
specifier: 13.0.0
version: 13.0.0(eslint-plugin-vue@9.29.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.8.3)
autoprefixer: autoprefixer:
specifier: 10.4.20 specifier: 10.4.20
version: 10.4.20(postcss@8.4.49) version: 10.4.20(postcss@8.4.49)
eslint:
specifier: 8.57.0
version: 8.57.0
eslint-plugin-prettier:
specifier: 5.2.1
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@8.57.0))(eslint@8.57.0)(prettier@3.5.3)
eslint-plugin-vue:
specifier: 9.29.0
version: 9.29.0(eslint@8.57.0)
postcss: postcss:
specifier: 8.4.49 specifier: 8.4.49
version: 8.4.49 version: 8.4.49
@ -13043,12 +13076,6 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true hasBin: true
ts-api-utils@1.3.0:
resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
engines: {node: '>=16'}
peerDependencies:
typescript: '>=4.2.0'
ts-api-utils@1.4.3: ts-api-utils@1.4.3:
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
engines: {node: '>=16'} engines: {node: '>=16'}
@ -14511,6 +14538,9 @@ packages:
zod@3.22.4: zod@3.22.4:
resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
zod@3.25.32: zod@3.25.32:
resolution: {integrity: sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==} resolution: {integrity: sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==}
@ -18493,6 +18523,30 @@ snapshots:
stringify-object: 3.3.0 stringify-object: 3.3.0
yargs: 17.7.2 yargs: 17.7.2
'@hoppscotch/ui@0.2.1(eslint@8.57.0)(terser@5.39.2)(typescript@5.8.3)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))':
dependencies:
'@boringer-avatars/vue3': 0.2.1(vue@3.5.12(typescript@5.8.3))
'@fontsource-variable/inter': 5.1.0
'@fontsource-variable/material-symbols-rounded': 5.1.3
'@fontsource-variable/roboto-mono': 5.1.0
'@hoppscotch/vue-sonner': 1.2.3
'@hoppscotch/vue-toasted': 0.1.0(vue@3.5.12(typescript@5.8.3))
'@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))
'@vueuse/core': 8.9.4(vue@3.5.12(typescript@5.8.3))
fp-ts: 2.16.9
lodash-es: 4.17.21
path: 0.12.7
vite-plugin-eslint: 1.8.1(eslint@8.57.0)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))
vue: 3.5.12(typescript@5.8.3)
vue-promise-modals: 0.1.0(typescript@5.8.3)
vuedraggable-es: 4.1.1(vue@3.5.12(typescript@5.8.3))
transitivePeerDependencies:
- '@vue/composition-api'
- eslint
- terser
- typescript
- vite
'@hoppscotch/ui@0.2.1(eslint@8.57.0)(terser@5.39.2)(typescript@5.8.3)(vite@5.4.9(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))': '@hoppscotch/ui@0.2.1(eslint@8.57.0)(terser@5.39.2)(typescript@5.8.3)(vite@5.4.9(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))':
dependencies: dependencies:
'@boringer-avatars/vue3': 0.2.1(vue@3.5.12(typescript@5.8.3)) '@boringer-avatars/vue3': 0.2.1(vue@3.5.12(typescript@5.8.3))
@ -18517,30 +18571,6 @@ snapshots:
- typescript - typescript
- vite - vite
'@hoppscotch/ui@0.2.1(eslint@9.27.0(jiti@2.4.2))(terser@5.39.2)(typescript@5.8.3)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))':
dependencies:
'@boringer-avatars/vue3': 0.2.1(vue@3.5.12(typescript@5.8.3))
'@fontsource-variable/inter': 5.1.0
'@fontsource-variable/material-symbols-rounded': 5.1.3
'@fontsource-variable/roboto-mono': 5.1.0
'@hoppscotch/vue-sonner': 1.2.3
'@hoppscotch/vue-toasted': 0.1.0(vue@3.5.12(typescript@5.8.3))
'@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))
'@vueuse/core': 8.9.4(vue@3.5.12(typescript@5.8.3))
fp-ts: 2.16.9
lodash-es: 4.17.21
path: 0.12.7
vite-plugin-eslint: 1.8.1(eslint@9.27.0(jiti@2.4.2))(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))
vue: 3.5.12(typescript@5.8.3)
vue-promise-modals: 0.1.0(typescript@5.8.3)
vuedraggable-es: 4.1.1(vue@3.5.12(typescript@5.8.3))
transitivePeerDependencies:
- '@vue/composition-api'
- eslint
- terser
- typescript
- vite
'@hoppscotch/ui@0.2.1(eslint@9.27.0(jiti@2.4.2))(terser@5.39.2)(typescript@5.8.3)(vite@5.4.9(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))': '@hoppscotch/ui@0.2.1(eslint@9.27.0(jiti@2.4.2))(terser@5.39.2)(typescript@5.8.3)(vite@5.4.9(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2))(vue@3.5.12(typescript@5.8.3))':
dependencies: dependencies:
'@boringer-avatars/vue3': 0.2.1(vue@3.5.12(typescript@5.8.3)) '@boringer-avatars/vue3': 0.2.1(vue@3.5.12(typescript@5.8.3))
@ -20567,7 +20597,7 @@ snapshots:
'@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)': '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.11.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.9.0(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.9.0(eslint@8.57.0)(typescript@5.8.3)
'@typescript-eslint/scope-manager': 8.9.0 '@typescript-eslint/scope-manager': 8.9.0
'@typescript-eslint/type-utils': 8.9.0(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/type-utils': 8.9.0(eslint@8.57.0)(typescript@5.8.3)
@ -20577,7 +20607,7 @@ snapshots:
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 1.3.0(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.8.3)
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
@ -20626,7 +20656,7 @@ snapshots:
'@typescript-eslint/types': 8.9.0 '@typescript-eslint/types': 8.9.0
'@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.9.0 '@typescript-eslint/visitor-keys': 8.9.0
debug: 4.3.7 debug: 4.4.1
eslint: 8.57.0 eslint: 8.57.0
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.8.3
@ -20698,7 +20728,7 @@ snapshots:
'@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.8.3)
'@typescript-eslint/utils': 8.9.0(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.9.0(eslint@8.57.0)(typescript@5.8.3)
debug: 4.4.1 debug: 4.4.1
ts-api-utils: 1.3.0(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.8.3)
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
@ -20780,7 +20810,7 @@ snapshots:
fast-glob: 3.3.3 fast-glob: 3.3.3
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.2 semver: 7.6.3
ts-api-utils: 1.4.3(typescript@5.8.3) ts-api-utils: 1.4.3(typescript@5.8.3)
optionalDependencies: optionalDependencies:
typescript: 5.8.3 typescript: 5.8.3
@ -21532,10 +21562,6 @@ snapshots:
mime-types: 3.0.1 mime-types: 3.0.1
negotiator: 1.0.0 negotiator: 1.0.0
acorn-jsx@5.3.2(acorn@8.12.1):
dependencies:
acorn: 8.12.1
acorn-jsx@5.3.2(acorn@8.14.1): acorn-jsx@5.3.2(acorn@8.14.1):
dependencies: dependencies:
acorn: 8.14.1 acorn: 8.14.1
@ -23634,7 +23660,7 @@ snapshots:
eslint-plugin-vue@9.29.0(eslint@8.57.0): eslint-plugin-vue@9.29.0(eslint@8.57.0):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0)
eslint: 8.57.0 eslint: 8.57.0
globals: 13.24.0 globals: 13.24.0
natural-compare: 1.4.0 natural-compare: 1.4.0
@ -23800,8 +23826,8 @@ snapshots:
espree@9.6.1: espree@9.6.1:
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.14.1
acorn-jsx: 5.3.2(acorn@8.12.1) acorn-jsx: 5.3.2(acorn@8.14.1)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
esprima-extract-comments@1.1.0: esprima-extract-comments@1.1.0:
@ -29412,10 +29438,6 @@ snapshots:
tree-kill@1.2.2: {} tree-kill@1.2.2: {}
ts-api-utils@1.3.0(typescript@5.8.3):
dependencies:
typescript: 5.8.3
ts-api-utils@1.4.3(typescript@5.8.3): ts-api-utils@1.4.3(typescript@5.8.3):
dependencies: dependencies:
typescript: 5.8.3 typescript: 5.8.3
@ -30114,6 +30136,14 @@ snapshots:
typescript: 5.8.3 typescript: 5.8.3
vue-tsc: 1.8.24(typescript@5.8.3) vue-tsc: 1.8.24(typescript@5.8.3)
vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2)):
dependencies:
'@rollup/pluginutils': 4.2.1
'@types/eslint': 8.56.10
eslint: 8.57.0
rollup: 2.79.2
vite: 5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2)
vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.4.9(@types/node@22.15.19)(sass@1.79.5)(terser@5.39.2)): vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.4.9(@types/node@22.15.19)(sass@1.79.5)(terser@5.39.2)):
dependencies: dependencies:
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
@ -30130,14 +30160,6 @@ snapshots:
rollup: 2.79.2 rollup: 2.79.2
vite: 5.4.9(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2) vite: 5.4.9(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2)
vite-plugin-eslint@1.8.1(eslint@9.27.0(jiti@2.4.2))(vite@5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2)):
dependencies:
'@rollup/pluginutils': 4.2.1
'@types/eslint': 8.56.10
eslint: 9.27.0(jiti@2.4.2)
rollup: 2.79.2
vite: 5.4.11(@types/node@22.15.19)(sass@1.80.3)(terser@5.39.2)
vite-plugin-eslint@1.8.1(eslint@9.27.0(jiti@2.4.2))(vite@5.4.11(@types/node@22.7.6)(sass@1.80.3)(terser@5.39.2)): vite-plugin-eslint@1.8.1(eslint@9.27.0(jiti@2.4.2))(vite@5.4.11(@types/node@22.7.6)(sass@1.80.3)(terser@5.39.2)):
dependencies: dependencies:
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
@ -31269,4 +31291,6 @@ snapshots:
zod@3.22.4: {} zod@3.22.4: {}
zod@3.23.8: {}
zod@3.25.32: {} zod@3.25.32: {}