diff --git a/package-lock.json b/package-lock.json index a690360..89d6826 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,28 @@ { "name": "rise", - "version": "0.0.1", + "version": "0.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rise", - "version": "0.0.1", + "version": "0.0.4", "license": "MIT", "dependencies": { - "@tauri-apps/api": "^1.5.3", + "@tauri-apps/api": "^2.9.0", + "@tauri-apps/plugin-dialog": "^2.4.2", + "cookie": "^1.1.1", "lucide-svelte": "^0.525.0", - "prismjs": "^1.29.0", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0", "xterm-addon-web-links": "^0.9.0" }, "devDependencies": { "@sveltejs/adapter-static": "^3.0.6", - "@sveltejs/kit": "^2.9.0", + "@sveltejs/kit": "^2.49.2", "@sveltejs/vite-plugin-svelte": "^5.0.0", - "@tauri-apps/cli": "^1.5.9", + "@tauri-apps/cli": "^2.9.2", + "@types/node": "^24.10.2", "sass-embedded": "^1.89.2", "svelte": "^5.0.0", "svelte-check": "^4.0.0", @@ -812,6 +814,13 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@sveltejs/acorn-typescript": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", @@ -822,9 +831,9 @@ } }, "node_modules/@sveltejs/adapter-static": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz", - "integrity": "sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", "dev": true, "license": "MIT", "peerDependencies": { @@ -832,25 +841,25 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.22.2.tgz", - "integrity": "sha512-2MvEpSYabUrsJAoq5qCOBGAlkICjfjunrnLcx3YAk2XV7TvAIhomlKsAgR4H/4uns5rAfYmj7Wet5KRtc8dPIg==", + "version": "2.49.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.49.2.tgz", + "integrity": "sha512-Vp3zX/qlwerQmHMP6x0Ry1oY7eKKRcOWGc2P59srOp4zcqyn+etJyQpELgOi4+ZSUgteX8Y387NuwruLgGXLUQ==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", - "devalue": "^5.1.0", + "devalue": "^5.3.2", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0", - "vitefu": "^1.0.6" + "sirv": "^3.0.0" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -859,9 +868,25 @@ "node": ">=18.13" }, "peerDependencies": { + "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@sveltejs/kit/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, "node_modules/@sveltejs/vite-plugin-svelte": { @@ -905,29 +930,21 @@ } }, "node_modules/@tauri-apps/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz", - "integrity": "sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.1.tgz", + "integrity": "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==", "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">= 14.6.0", - "npm": ">= 6.6.0", - "yarn": ">= 1.19.1" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/tauri" } }, "node_modules/@tauri-apps/cli": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.3.tgz", - "integrity": "sha512-q46umd6QLRKDd4Gg6WyZBGa2fWvk0pbeUA5vFomm4uOs1/17LIciHv2iQ4UD+2Yv5H7AO8YiE1t50V0POiEGEw==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.9.5.tgz", + "integrity": "sha512-z88tX6O6kwTgMjYozhNGbehzQyBazgXejyH784CwSfBOWm06xFcogd0PY/jhcPsqzJF9kLRIkmlQy+cqdrioOQ==", "dev": true, "license": "Apache-2.0 OR MIT", - "dependencies": { - "semver": ">=7.5.2" - }, "bin": { "tauri": "tauri.js" }, @@ -939,27 +956,28 @@ "url": "https://opencollective.com/tauri" }, "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.6.3", - "@tauri-apps/cli-darwin-x64": "1.6.3", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.3", - "@tauri-apps/cli-linux-arm64-gnu": "1.6.3", - "@tauri-apps/cli-linux-arm64-musl": "1.6.3", - "@tauri-apps/cli-linux-x64-gnu": "1.6.3", - "@tauri-apps/cli-linux-x64-musl": "1.6.3", - "@tauri-apps/cli-win32-arm64-msvc": "1.6.3", - "@tauri-apps/cli-win32-ia32-msvc": "1.6.3", - "@tauri-apps/cli-win32-x64-msvc": "1.6.3" + "@tauri-apps/cli-darwin-arm64": "2.9.5", + "@tauri-apps/cli-darwin-x64": "2.9.5", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.9.5", + "@tauri-apps/cli-linux-arm64-gnu": "2.9.5", + "@tauri-apps/cli-linux-arm64-musl": "2.9.5", + "@tauri-apps/cli-linux-riscv64-gnu": "2.9.5", + "@tauri-apps/cli-linux-x64-gnu": "2.9.5", + "@tauri-apps/cli-linux-x64-musl": "2.9.5", + "@tauri-apps/cli-win32-arm64-msvc": "2.9.5", + "@tauri-apps/cli-win32-ia32-msvc": "2.9.5", + "@tauri-apps/cli-win32-x64-msvc": "2.9.5" } }, "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.3.tgz", - "integrity": "sha512-fQN6IYSL8bG4NvkdKE4sAGF4dF/QqqQq4hOAU+t8ksOzHJr0hUlJYfncFeJYutr/MMkdF7hYKadSb0j5EE9r0A==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.9.5.tgz", + "integrity": "sha512-P5XDyCwq3VbWGAplyfP/bgmuUITVDcypxgZUyX45SM7HbU1Nrkk0cNK1HCOkuNBAVVbWen2GUNWah/AiupHHXg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "darwin" @@ -969,14 +987,14 @@ } }, "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.3.tgz", - "integrity": "sha512-1yTXZzLajKAYINJOJhZfmMhCzweHSgKQ3bEgJSn6t+1vFkOgY8Yx4oFgWcybrrWI5J1ZLZAl47+LPOY81dLcyA==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.9.5.tgz", + "integrity": "sha512-JC9UfQ2ZKavx60dnNxsWztRF3oUH3dgPwN1WJ3/5RUy2aNwD/vXqvJAfNFZ4GWeQpoQ+PqJxduev0U4OMQonnA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "darwin" @@ -986,14 +1004,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.3.tgz", - "integrity": "sha512-CjTEr9r9xgjcvos09AQw8QMRPuH152B1jvlZt4PfAsyJNPFigzuwed5/SF7XAd8bFikA7zArP4UT12RdBxrx7w==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.9.5.tgz", + "integrity": "sha512-iCQm2Uvx8AheghfG/QUv1y8Ga9yquJt6xJwH1uF0x5KfmJmwBi8pHBvB924dDi59PS84qTdIBeJejQT00QX3Iw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1003,14 +1021,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.3.tgz", - "integrity": "sha512-G9EUUS4M8M/Jz1UKZqvJmQQCKOzgTb8/0jZKvfBuGfh5AjFBu8LHvlFpwkKVm1l4951Xg4ulUp6P9Q7WRJ9XSA==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.9.5.tgz", + "integrity": "sha512-b6AW8Gr5nQOQIYH0TsUev7rEThGHIvsx192eElOmOz/dh33J4pninHK32laMj2hzHMJ27qmDq5vANL+wrFo9sg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1020,14 +1038,31 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.3.tgz", - "integrity": "sha512-MuBTHJyNpZRbPVG8IZBN8+Zs7aKqwD22tkWVBcL1yOGL4zNNTJlkfL+zs5qxRnHlUsn6YAlbW/5HKocfpxVwBw==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.9.5.tgz", + "integrity": "sha512-/gRBMnphS9E8riZ0LIbBhZ9Oy16A2rx/g3DGR0DcDBvUtkLfbL0lMu4s+sY85nkn9An15+cZ1ZK6d7AIqWahLA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.9.5.tgz", + "integrity": "sha512-NOzjPF9YIBodjdkFcJmqINT0k3YDoR5ANM/jg6Z6s3Zmk8ScN6inI60jTxcfgfWyITiKsPy7GJyYou3Cm2XNzw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1037,14 +1072,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.3.tgz", - "integrity": "sha512-Uvi7M+NK3tAjCZEY1WGel+dFlzJmqcvu3KND+nqa22762NFmOuBIZ4KJR/IQHfpEYqKFNUhJfCGnpUDfiC3Oxg==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.9.5.tgz", + "integrity": "sha512-SfGbwgvTphM5y+J91NyU/psleMUlyyPkZyDCFg8WU1HX8DpKUT3Vwhb/W1xpUBGb56tJgGCO46FCVkr8w4Areg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1054,14 +1089,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.3.tgz", - "integrity": "sha512-rc6B342C0ra8VezB/OJom9j/N+9oW4VRA4qMxS2f4bHY2B/z3J9NPOe6GOILeg4v/CV62ojkLsC3/K/CeF3fqQ==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.9.5.tgz", + "integrity": "sha512-ZfeoiASAOGDzyvN+TDAg8A1pCeS082h4uc0vZKvtWUN+9QBIMfz0yJwltAv+SN/afap6NS6DVkbPV3UVuI9V5A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1071,14 +1106,14 @@ } }, "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.3.tgz", - "integrity": "sha512-cSH2qOBYuYC4UVIFtrc1YsGfc5tfYrotoHrpTvRjUGu0VywvmyNk82+ZsHEnWZ2UHmu3l3lXIGRqSWveLln0xg==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.9.5.tgz", + "integrity": "sha512-ulg7irow+ekjaK4inFHVq7m1KQebDSYNb17DFKV+h+x7qnLZymz2gHK7df2u4YyEjqvzwRd3AJpU3HNxRurSFQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -1088,14 +1123,14 @@ } }, "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.3.tgz", - "integrity": "sha512-T8V6SJQqE4PSWmYBl0ChQVmS6AR2hXFHURH2DwAhgSGSQ6uBXgwlYFcfIeQpBQA727K2Eq8X2hGfvmoySyHMRw==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.9.5.tgz", + "integrity": "sha512-6lF0k/Qduhn1Z3IOXlp2ts8jNOMIX4cK4Fbk3axGeX7LMcVVbOSEAFwbTqS8BKZDFac0WRS8N1C96+Ms5LOS1Q==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -1105,14 +1140,14 @@ } }, "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.3.tgz", - "integrity": "sha512-HUkWZ+lYHI/Gjkh2QjHD/OBDpqLVmvjZGpLK9losur1Eg974Jip6k+vsoTUxQBCBDfj30eDBct9E1FvXOspWeg==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.5.tgz", + "integrity": "sha512-Vg50U74x1A4b2iBVtDcAVPbI1XVuzSmwlduuBM1VewxtRaVj5GDzWnYtBcnuIk+VGzNApRDfDhraAXGaW2a/Gw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -1121,6 +1156,15 @@ "node": ">= 10" } }, + "node_modules/@tauri-apps/plugin-dialog": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.4.2.tgz", + "integrity": "sha512-lNIn5CZuw8WZOn8zHzmFmDSzg5zfohWoa3mdULP0YFh/VogVdMVWZPcWSHlydsiJhRQYaTNSYKN7RmZKE2lCYQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -1134,6 +1178,16 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/node": { + "version": "24.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", + "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -1204,13 +1258,16 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/debug": { @@ -1242,9 +1299,9 @@ } }, "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.0.tgz", + "integrity": "sha512-BaD1s81TFFqbD6Uknni42TrolvEWA1Ih5L+OiHWmi4OYMJVwAYPGtha61I9KxTf52OvVHozHyjPu8zljqdF3uA==", "dev": true, "license": "MIT" }, @@ -1490,15 +1547,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -1889,19 +1937,6 @@ "node": ">=14.0.0" } }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -2070,6 +2105,13 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", @@ -2078,9 +2120,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 4fa598f..5bb86b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rise", - "version": "0.0.3", + "version": "0.0.4", "description": "", "type": "module", "scripts": { @@ -15,6 +15,7 @@ "dependencies": { "@tauri-apps/api": "^2.9.0", "@tauri-apps/plugin-dialog": "^2.4.2", + "cookie": "^1.1.1", "lucide-svelte": "^0.525.0", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0", @@ -22,9 +23,10 @@ }, "devDependencies": { "@sveltejs/adapter-static": "^3.0.6", - "@sveltejs/kit": "^2.9.0", + "@sveltejs/kit": "^2.49.2", "@sveltejs/vite-plugin-svelte": "^5.0.0", "@tauri-apps/cli": "^2.9.2", + "@types/node": "^24.10.2", "sass-embedded": "^1.89.2", "svelte": "^5.0.0", "svelte-check": "^4.0.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d63e67e..1976650 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2957,7 +2957,7 @@ dependencies = [ [[package]] name = "rise" -version = "0.0.3" +version = "0.0.4" dependencies = [ "anyhow", "cocoa", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index c559c49..bd431db 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rise" -version = "0.0.3" +version = "0.0.4" description = "RISE IDE build for success" authors = ["you"] edition = "2021" diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index caa5c17..ac07e87 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -9,6 +9,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Mutex; use streaming_iterator::StreamingIterator; use crate::highlight::{escape_html, calculate_edit, highlight_ast}; +use serde_json; #[derive(Clone, Debug)] struct EditEntry { @@ -23,6 +24,72 @@ pub struct EditorBuffer { lazy_static! { pub static ref EDITOR_BUFFERS: Mutex> = Mutex::new(HashMap::new()); + pub static ref CONFIG_FILE: String = Path::new("/Users/ddorabble/RISE").to_string_lossy().into_owned(); +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct AppConfig { + recent_projects: Vec, + theme: String, +} + +impl Default for AppConfig { + fn default() -> Self { + AppConfig { recent_projects: Vec::new(), theme: "default".to_string() } + } +} + +fn load_config() -> AppConfig { + let path = Path::new(&*CONFIG_FILE); + if !path.exists() { + // create with defaults + fs::create_dir(path).expect("Failed to create config directory"); + let cfg = AppConfig::default(); + let _ = save_config(&cfg); + return cfg; + } + let content = fs::read_to_string(path.join("config.json")).unwrap_or_else(|_| String::new()); + if content.trim().is_empty() { + let cfg = AppConfig::default(); + let _ = save_config(&cfg); + return cfg; + } + match serde_json::from_str::(&content) { + Ok(mut cfg) => { + // Backfill defaults if fields are missing + if cfg.theme.is_empty() { cfg.theme = "default".to_string(); } + if cfg.recent_projects.len() > 10 { cfg.recent_projects.truncate(10); } + cfg + } + Err(_) => { + // If existing file is not valid JSON (from previous versions), reset to defaults + let cfg = AppConfig::default(); + let _ = save_config(&cfg); + cfg + } + } +} + +fn save_config(cfg: &AppConfig) -> Result<(), String> { + let json = serde_json::to_string_pretty(cfg).map_err(|e| format!("Failed to serialize config: {}", e))?; + fs::write(Path::new(&*CONFIG_FILE).join("config.json"), json).map_err(|e| format!("Failed to write config file: {}", e)) +} + +fn update_recent_project(project_path: &str) -> Result<(), String> { + let mut cfg = load_config(); + // remove existing occurrences + cfg.recent_projects.retain(|p| p != project_path); + // insert at front + cfg.recent_projects.insert(0, project_path.to_string()); + // cap at 10 + if cfg.recent_projects.len() > 10 { cfg.recent_projects.truncate(10); } + save_config(&cfg) +} + +#[tauri::command] +pub fn get_recent_projects() -> Result, String> { + let cfg = load_config(); + Ok(cfg.recent_projects) } #[derive(Serialize, Deserialize)] @@ -67,6 +134,8 @@ pub async fn create_project(path: Option, project_name: Option) let readme_path = project_path.join("README.md"); let readme_content = format!("# {} Project\n\nThis project was created with RISE.\n", folder_name); fs::write(&readme_path, readme_content).map_err(|e| format!("Failed to create README.md file: {}", e))?; + // Ensure config exists and update recent projects list + update_recent_project(project_path.to_str().unwrap_or_default())?; project_path.to_str().map(|s| s.to_string()).ok_or_else(|| "Failed to convert project path to string".to_string()) }, None => Err("No path provided".to_string()) @@ -76,7 +145,11 @@ pub async fn create_project(path: Option, project_name: Option) #[tauri::command] pub async fn open_project(path: Option) -> Result { match path { - Some(p) => Ok(p), + Some(p) => { + // Ensure config exists and update the recent projects list + update_recent_project(&p)?; + Ok(p) + }, None => Err("No path provided".to_string()) } } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e99990b..737ee23 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -9,6 +9,7 @@ use cocoa::appkit::{NSWindowStyleMask, NSWindowTitleVisibility}; use cocoa::base::YES; pub use commands::{ + get_recent_projects, create_project, execute_command, execute_command_with_shell, @@ -39,6 +40,7 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_fs::init()) .invoke_handler(tauri::generate_handler![ + get_recent_projects, open_project, create_project, read_file, diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 20cd491..0a9d3f4 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -19,7 +19,7 @@ }, "productName": "RISE", "mainBinaryName": "RISE", - "version": "0.0.3", + "version": "0.0.4", "identifier": "com.rise.app", "plugins": {}, "app": { diff --git a/src/lib/stores/fileStore.ts b/src/lib/stores/fileStore.ts index 8da4611..7254d61 100644 --- a/src/lib/stores/fileStore.ts +++ b/src/lib/stores/fileStore.ts @@ -1,6 +1,7 @@ import { writable } from 'svelte/store'; import type { FileEntry } from '$lib/utils/types'; import { invoke } from '@tauri-apps/api/core'; +import { basename, dirname } from '@tauri-apps/api/path'; // Initialize the store with default values export const fileStore = writable<{ @@ -16,7 +17,7 @@ export const fileStore = writable<{ function makeRoot(projectPath: string, children: FileEntry[] = []): FileEntry { return { path: projectPath, - name: projectPath.split('/').pop() || projectPath, + name: projectPath, is_dir: true, expanded: true, children, @@ -77,7 +78,11 @@ export async function refreshPathInStore(path: string) { let dirPath = path; const targetNode = findNode(tree, path); if (targetNode && !targetNode.is_dir) { - dirPath = path.split('/').slice(0, -1).join('/') || currentProjectPath; + try { + dirPath = await dirname(path); + } catch { + dirPath = currentProjectPath as string; + } } // For project root, ensure we reload children directly under root diff --git a/src/lib/utils/fileLoader.ts b/src/lib/utils/fileLoader.ts index 8fd109d..55c57e9 100644 --- a/src/lib/utils/fileLoader.ts +++ b/src/lib/utils/fileLoader.ts @@ -1,5 +1,6 @@ import { invoke } from "@tauri-apps/api/core"; import type { FileEntry } from "./types"; +import { basename, dirname } from "@tauri-apps/api/path"; // Pure helper to load directory contents and normalize fields without holding module state export async function loadFiles(path: string, level: number = 0): Promise { @@ -8,7 +9,8 @@ export async function loadFiles(path: string, level: number = 0): Promise import { invoke } from "@tauri-apps/api/core"; import { open } from "@tauri-apps/plugin-dialog" + import {onMount} from "svelte"; let showProjectNameDialog = false; let projectName = "rise-project"; @@ -8,6 +9,14 @@ let projectNameInput: HTMLInputElement; let sanitizedName = ""; let showSanitizeWarning = false; + let recentProjects: string[] = []; + + async function loadRecentProjects() { + recentProjects = await invoke("get_recent_projects"); + console.log(recentProjects); + } + + onMount(loadRecentProjects); async function openProject(event: Event) { event.preventDefault(); @@ -109,12 +118,16 @@
  • + {#if recentProjects.length > 0}

    Recent Projects

      - + {#each recentProjects as recentProject} +
    • + {/each}
    + {/if} {#if showProjectNameDialog} diff --git a/src/routes/editor/+page.svelte b/src/routes/editor/+page.svelte index 8185793..146d357 100644 --- a/src/routes/editor/+page.svelte +++ b/src/routes/editor/+page.svelte @@ -20,6 +20,7 @@ PlaySquare, Settings } from "lucide-svelte"; + import { basename } from "@tauri-apps/api/path"; const SETTINGS: string[] = [ "Theme", @@ -27,12 +28,10 @@ "View Mode" ]; - const PROJECTS: string[] = [ - "DDD", - "LOL" - ] + let PROJECTS: string[] = [] let projectPath: string | null = null; + let projectName: string | null = null; let currentPath: string | null = null; let files: FileEntry[] = []; let allFiles: FileEntry[] = []; @@ -110,9 +109,10 @@ projectPath = localStorage.getItem('projectPath'); if (projectPath) { currentPath = projectPath; + projectName = await basename(projectPath); const rootEntry: FileEntry = { path: projectPath, - name: `${projectPath.split('/').pop()}`, + name: projectName || projectPath, is_dir: true, expanded: true, children: [], @@ -140,6 +140,8 @@ host = info.host; home = info.home; + PROJECTS = await invoke('get_recent_projects'); + // Editor component now handles keydown/focus; keep click/keyup here only for FileMenu interactions window.addEventListener('keyup', handleInputEvent); window.addEventListener('click', handleInputEvent); @@ -258,7 +260,7 @@ y = 30; actions = PROJECTS; }}> - {projectPath ? projectPath.split('/').pop() : 'Untitled'} + {projectName ?? 'Untitled'}
    diff --git a/src/routes/editor/components/FileMenu.svelte b/src/routes/editor/components/FileMenu.svelte index d1c7134..ccfd47e 100644 --- a/src/routes/editor/components/FileMenu.svelte +++ b/src/routes/editor/components/FileMenu.svelte @@ -1,5 +1,6 @@