generated from nhcarrigan/template
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
ee201d71c8
|
|||
|
d712bccb91
|
+1
-1
@@ -88,7 +88,7 @@
|
|||||||
"tailwindcss": "^4.1.18",
|
"tailwindcss": "^4.1.18",
|
||||||
"typescript": "~5.6.2",
|
"typescript": "~5.6.2",
|
||||||
"typescript-eslint": "^8.53.0",
|
"typescript-eslint": "^8.53.0",
|
||||||
"vite": "7.3.1",
|
"vite": "^6.0.3",
|
||||||
"vitest": "^4.0.17"
|
"vitest": "^4.0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+147
-147
@@ -128,16 +128,16 @@ importers:
|
|||||||
version: 9.39.2
|
version: 9.39.2
|
||||||
'@sveltejs/adapter-static':
|
'@sveltejs/adapter-static':
|
||||||
specifier: ^3.0.6
|
specifier: ^3.0.6
|
||||||
version: 3.0.10(@sveltejs/kit@2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))
|
version: 3.0.10(@sveltejs/kit@2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))
|
||||||
'@sveltejs/kit':
|
'@sveltejs/kit':
|
||||||
specifier: ^2.9.0
|
specifier: ^2.9.0
|
||||||
version: 2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
version: 2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
'@sveltejs/vite-plugin-svelte':
|
'@sveltejs/vite-plugin-svelte':
|
||||||
specifier: ^5.0.0
|
specifier: ^5.0.0
|
||||||
version: 5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
version: 5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
'@tailwindcss/vite':
|
'@tailwindcss/vite':
|
||||||
specifier: ^4.1.18
|
specifier: ^4.1.18
|
||||||
version: 4.1.18(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
version: 4.1.18(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
'@tauri-apps/cli':
|
'@tauri-apps/cli':
|
||||||
specifier: ^2
|
specifier: ^2
|
||||||
version: 2.9.6
|
version: 2.9.6
|
||||||
@@ -146,7 +146,7 @@ importers:
|
|||||||
version: 6.9.1
|
version: 6.9.1
|
||||||
'@testing-library/svelte':
|
'@testing-library/svelte':
|
||||||
specifier: ^5.3.1
|
specifier: ^5.3.1
|
||||||
version: 5.3.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2))
|
version: 5.3.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2))
|
||||||
'@vitest/coverage-v8':
|
'@vitest/coverage-v8':
|
||||||
specifier: ^4.0.18
|
specifier: ^4.0.18
|
||||||
version: 4.0.18(vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2))
|
version: 4.0.18(vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2))
|
||||||
@@ -187,8 +187,8 @@ importers:
|
|||||||
specifier: ^8.53.0
|
specifier: ^8.53.0
|
||||||
version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.6.3)
|
version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.6.3)
|
||||||
vite:
|
vite:
|
||||||
specifier: 7.3.1
|
specifier: ^6.0.3
|
||||||
version: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
version: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
vitest:
|
vitest:
|
||||||
specifier: ^4.0.17
|
specifier: ^4.0.17
|
||||||
version: 4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)
|
version: 4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)
|
||||||
@@ -355,158 +355,158 @@ packages:
|
|||||||
resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
|
resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
'@esbuild/aix-ppc64@0.27.2':
|
'@esbuild/aix-ppc64@0.25.12':
|
||||||
resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
|
resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [aix]
|
os: [aix]
|
||||||
|
|
||||||
'@esbuild/android-arm64@0.27.2':
|
'@esbuild/android-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
|
resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@esbuild/android-arm@0.27.2':
|
'@esbuild/android-arm@0.25.12':
|
||||||
resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
|
resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@esbuild/android-x64@0.27.2':
|
'@esbuild/android-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
|
resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@esbuild/darwin-arm64@0.27.2':
|
'@esbuild/darwin-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
|
resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@esbuild/darwin-x64@0.27.2':
|
'@esbuild/darwin-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
|
resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@esbuild/freebsd-arm64@0.27.2':
|
'@esbuild/freebsd-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
|
resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
'@esbuild/freebsd-x64@0.27.2':
|
'@esbuild/freebsd-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
|
resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
'@esbuild/linux-arm64@0.27.2':
|
'@esbuild/linux-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
|
resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-arm@0.27.2':
|
'@esbuild/linux-arm@0.25.12':
|
||||||
resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
|
resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-ia32@0.27.2':
|
'@esbuild/linux-ia32@0.25.12':
|
||||||
resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
|
resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-loong64@0.27.2':
|
'@esbuild/linux-loong64@0.25.12':
|
||||||
resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
|
resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [loong64]
|
cpu: [loong64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-mips64el@0.27.2':
|
'@esbuild/linux-mips64el@0.25.12':
|
||||||
resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
|
resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [mips64el]
|
cpu: [mips64el]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-ppc64@0.27.2':
|
'@esbuild/linux-ppc64@0.25.12':
|
||||||
resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
|
resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-riscv64@0.27.2':
|
'@esbuild/linux-riscv64@0.25.12':
|
||||||
resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
|
resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [riscv64]
|
cpu: [riscv64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-s390x@0.27.2':
|
'@esbuild/linux-s390x@0.25.12':
|
||||||
resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
|
resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-x64@0.27.2':
|
'@esbuild/linux-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
|
resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/netbsd-arm64@0.27.2':
|
'@esbuild/netbsd-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
|
resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [netbsd]
|
os: [netbsd]
|
||||||
|
|
||||||
'@esbuild/netbsd-x64@0.27.2':
|
'@esbuild/netbsd-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
|
resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [netbsd]
|
os: [netbsd]
|
||||||
|
|
||||||
'@esbuild/openbsd-arm64@0.27.2':
|
'@esbuild/openbsd-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
|
resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [openbsd]
|
os: [openbsd]
|
||||||
|
|
||||||
'@esbuild/openbsd-x64@0.27.2':
|
'@esbuild/openbsd-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
|
resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [openbsd]
|
os: [openbsd]
|
||||||
|
|
||||||
'@esbuild/openharmony-arm64@0.27.2':
|
'@esbuild/openharmony-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
|
resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [openharmony]
|
os: [openharmony]
|
||||||
|
|
||||||
'@esbuild/sunos-x64@0.27.2':
|
'@esbuild/sunos-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
|
resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [sunos]
|
os: [sunos]
|
||||||
|
|
||||||
'@esbuild/win32-arm64@0.27.2':
|
'@esbuild/win32-arm64@0.25.12':
|
||||||
resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
|
resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@esbuild/win32-ia32@0.27.2':
|
'@esbuild/win32-ia32@0.25.12':
|
||||||
resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
|
resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@esbuild/win32-x64@0.27.2':
|
'@esbuild/win32-x64@0.25.12':
|
||||||
resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
|
resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@@ -1325,8 +1325,8 @@ packages:
|
|||||||
es-module-lexer@1.7.0:
|
es-module-lexer@1.7.0:
|
||||||
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
|
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
|
||||||
|
|
||||||
esbuild@0.27.2:
|
esbuild@0.25.12:
|
||||||
resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
|
resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -1988,19 +1988,19 @@ packages:
|
|||||||
util-deprecate@1.0.2:
|
util-deprecate@1.0.2:
|
||||||
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
||||||
|
|
||||||
vite@7.3.1:
|
vite@6.4.1:
|
||||||
resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
|
resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@types/node': ^20.19.0 || >=22.12.0
|
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
|
||||||
jiti: '>=1.21.0'
|
jiti: '>=1.21.0'
|
||||||
less: ^4.0.0
|
less: '*'
|
||||||
lightningcss: ^1.21.0
|
lightningcss: ^1.21.0
|
||||||
sass: ^1.70.0
|
sass: '*'
|
||||||
sass-embedded: ^1.70.0
|
sass-embedded: '*'
|
||||||
stylus: '>=0.54.8'
|
stylus: '*'
|
||||||
sugarss: ^5.0.0
|
sugarss: '*'
|
||||||
terser: ^5.16.0
|
terser: ^5.16.0
|
||||||
tsx: ^4.8.1
|
tsx: ^4.8.1
|
||||||
yaml: ^2.4.2
|
yaml: ^2.4.2
|
||||||
@@ -2412,82 +2412,82 @@ snapshots:
|
|||||||
|
|
||||||
'@csstools/css-tokenizer@3.0.4': {}
|
'@csstools/css-tokenizer@3.0.4': {}
|
||||||
|
|
||||||
'@esbuild/aix-ppc64@0.27.2':
|
'@esbuild/aix-ppc64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-arm64@0.27.2':
|
'@esbuild/android-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-arm@0.27.2':
|
'@esbuild/android-arm@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-x64@0.27.2':
|
'@esbuild/android-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/darwin-arm64@0.27.2':
|
'@esbuild/darwin-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/darwin-x64@0.27.2':
|
'@esbuild/darwin-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/freebsd-arm64@0.27.2':
|
'@esbuild/freebsd-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/freebsd-x64@0.27.2':
|
'@esbuild/freebsd-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-arm64@0.27.2':
|
'@esbuild/linux-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-arm@0.27.2':
|
'@esbuild/linux-arm@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-ia32@0.27.2':
|
'@esbuild/linux-ia32@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-loong64@0.27.2':
|
'@esbuild/linux-loong64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-mips64el@0.27.2':
|
'@esbuild/linux-mips64el@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-ppc64@0.27.2':
|
'@esbuild/linux-ppc64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-riscv64@0.27.2':
|
'@esbuild/linux-riscv64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-s390x@0.27.2':
|
'@esbuild/linux-s390x@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-x64@0.27.2':
|
'@esbuild/linux-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/netbsd-arm64@0.27.2':
|
'@esbuild/netbsd-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/netbsd-x64@0.27.2':
|
'@esbuild/netbsd-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openbsd-arm64@0.27.2':
|
'@esbuild/openbsd-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openbsd-x64@0.27.2':
|
'@esbuild/openbsd-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openharmony-arm64@0.27.2':
|
'@esbuild/openharmony-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/sunos-x64@0.27.2':
|
'@esbuild/sunos-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-arm64@0.27.2':
|
'@esbuild/win32-arm64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-ia32@0.27.2':
|
'@esbuild/win32-ia32@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-x64@0.27.2':
|
'@esbuild/win32-x64@0.25.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))':
|
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))':
|
||||||
@@ -2746,15 +2746,15 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
acorn: 8.15.0
|
acorn: 8.15.0
|
||||||
|
|
||||||
'@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))':
|
'@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@sveltejs/kit': 2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
'@sveltejs/kit': 2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
|
|
||||||
'@sveltejs/kit@2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
'@sveltejs/kit@2.49.4(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@standard-schema/spec': 1.1.0
|
'@standard-schema/spec': 1.1.0
|
||||||
'@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0)
|
'@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0)
|
||||||
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
'@types/cookie': 0.6.0
|
'@types/cookie': 0.6.0
|
||||||
acorn: 8.15.0
|
acorn: 8.15.0
|
||||||
cookie: 0.6.0
|
cookie: 0.6.0
|
||||||
@@ -2767,29 +2767,29 @@ snapshots:
|
|||||||
set-cookie-parser: 2.7.2
|
set-cookie-parser: 2.7.2
|
||||||
sirv: 3.0.2
|
sirv: 3.0.2
|
||||||
svelte: 5.46.3
|
svelte: 5.46.3
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.6.3
|
typescript: 5.6.3
|
||||||
|
|
||||||
'@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
'@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
svelte: 5.46.3
|
svelte: 5.46.3
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
'@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
'@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
deepmerge: 4.3.1
|
deepmerge: 4.3.1
|
||||||
kleur: 4.1.5
|
kleur: 4.1.5
|
||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
svelte: 5.46.3
|
svelte: 5.46.3
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
vitefu: 1.1.1(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
vitefu: 1.1.1(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -2854,12 +2854,12 @@ snapshots:
|
|||||||
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
|
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
|
||||||
'@tailwindcss/oxide-win32-x64-msvc': 4.1.18
|
'@tailwindcss/oxide-win32-x64-msvc': 4.1.18
|
||||||
|
|
||||||
'@tailwindcss/vite@4.1.18(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
'@tailwindcss/vite@4.1.18(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tailwindcss/node': 4.1.18
|
'@tailwindcss/node': 4.1.18
|
||||||
'@tailwindcss/oxide': 4.1.18
|
'@tailwindcss/oxide': 4.1.18
|
||||||
tailwindcss: 4.1.18
|
tailwindcss: 4.1.18
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
|
|
||||||
'@tauri-apps/api@2.9.1': {}
|
'@tauri-apps/api@2.9.1': {}
|
||||||
|
|
||||||
@@ -2966,13 +2966,13 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
svelte: 5.46.3
|
svelte: 5.46.3
|
||||||
|
|
||||||
'@testing-library/svelte@5.3.1(svelte@5.46.3)(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2))':
|
'@testing-library/svelte@5.3.1(svelte@5.46.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@testing-library/dom': 10.4.1
|
'@testing-library/dom': 10.4.1
|
||||||
'@testing-library/svelte-core': 1.0.0(svelte@5.46.3)
|
'@testing-library/svelte-core': 1.0.0(svelte@5.46.3)
|
||||||
svelte: 5.46.3
|
svelte: 5.46.3
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
vitest: 4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)
|
vitest: 4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)
|
||||||
|
|
||||||
'@types/aria-query@5.0.4': {}
|
'@types/aria-query@5.0.4': {}
|
||||||
@@ -3104,13 +3104,13 @@ snapshots:
|
|||||||
chai: 6.2.2
|
chai: 6.2.2
|
||||||
tinyrainbow: 3.0.3
|
tinyrainbow: 3.0.3
|
||||||
|
|
||||||
'@vitest/mocker@4.0.17(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
'@vitest/mocker@4.0.17(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vitest/spy': 4.0.17
|
'@vitest/spy': 4.0.17
|
||||||
estree-walker: 3.0.3
|
estree-walker: 3.0.3
|
||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
|
|
||||||
'@vitest/pretty-format@4.0.17':
|
'@vitest/pretty-format@4.0.17':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3292,34 +3292,34 @@ snapshots:
|
|||||||
|
|
||||||
es-module-lexer@1.7.0: {}
|
es-module-lexer@1.7.0: {}
|
||||||
|
|
||||||
esbuild@0.27.2:
|
esbuild@0.25.12:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@esbuild/aix-ppc64': 0.27.2
|
'@esbuild/aix-ppc64': 0.25.12
|
||||||
'@esbuild/android-arm': 0.27.2
|
'@esbuild/android-arm': 0.25.12
|
||||||
'@esbuild/android-arm64': 0.27.2
|
'@esbuild/android-arm64': 0.25.12
|
||||||
'@esbuild/android-x64': 0.27.2
|
'@esbuild/android-x64': 0.25.12
|
||||||
'@esbuild/darwin-arm64': 0.27.2
|
'@esbuild/darwin-arm64': 0.25.12
|
||||||
'@esbuild/darwin-x64': 0.27.2
|
'@esbuild/darwin-x64': 0.25.12
|
||||||
'@esbuild/freebsd-arm64': 0.27.2
|
'@esbuild/freebsd-arm64': 0.25.12
|
||||||
'@esbuild/freebsd-x64': 0.27.2
|
'@esbuild/freebsd-x64': 0.25.12
|
||||||
'@esbuild/linux-arm': 0.27.2
|
'@esbuild/linux-arm': 0.25.12
|
||||||
'@esbuild/linux-arm64': 0.27.2
|
'@esbuild/linux-arm64': 0.25.12
|
||||||
'@esbuild/linux-ia32': 0.27.2
|
'@esbuild/linux-ia32': 0.25.12
|
||||||
'@esbuild/linux-loong64': 0.27.2
|
'@esbuild/linux-loong64': 0.25.12
|
||||||
'@esbuild/linux-mips64el': 0.27.2
|
'@esbuild/linux-mips64el': 0.25.12
|
||||||
'@esbuild/linux-ppc64': 0.27.2
|
'@esbuild/linux-ppc64': 0.25.12
|
||||||
'@esbuild/linux-riscv64': 0.27.2
|
'@esbuild/linux-riscv64': 0.25.12
|
||||||
'@esbuild/linux-s390x': 0.27.2
|
'@esbuild/linux-s390x': 0.25.12
|
||||||
'@esbuild/linux-x64': 0.27.2
|
'@esbuild/linux-x64': 0.25.12
|
||||||
'@esbuild/netbsd-arm64': 0.27.2
|
'@esbuild/netbsd-arm64': 0.25.12
|
||||||
'@esbuild/netbsd-x64': 0.27.2
|
'@esbuild/netbsd-x64': 0.25.12
|
||||||
'@esbuild/openbsd-arm64': 0.27.2
|
'@esbuild/openbsd-arm64': 0.25.12
|
||||||
'@esbuild/openbsd-x64': 0.27.2
|
'@esbuild/openbsd-x64': 0.25.12
|
||||||
'@esbuild/openharmony-arm64': 0.27.2
|
'@esbuild/openharmony-arm64': 0.25.12
|
||||||
'@esbuild/sunos-x64': 0.27.2
|
'@esbuild/sunos-x64': 0.25.12
|
||||||
'@esbuild/win32-arm64': 0.27.2
|
'@esbuild/win32-arm64': 0.25.12
|
||||||
'@esbuild/win32-ia32': 0.27.2
|
'@esbuild/win32-ia32': 0.25.12
|
||||||
'@esbuild/win32-x64': 0.27.2
|
'@esbuild/win32-x64': 0.25.12
|
||||||
|
|
||||||
escape-string-regexp@4.0.0: {}
|
escape-string-regexp@4.0.0: {}
|
||||||
|
|
||||||
@@ -3959,9 +3959,9 @@ snapshots:
|
|||||||
|
|
||||||
util-deprecate@1.0.2: {}
|
util-deprecate@1.0.2: {}
|
||||||
|
|
||||||
vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2):
|
vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.27.2
|
esbuild: 0.25.12
|
||||||
fdir: 6.5.0(picomatch@4.0.3)
|
fdir: 6.5.0(picomatch@4.0.3)
|
||||||
picomatch: 4.0.3
|
picomatch: 4.0.3
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
@@ -3972,14 +3972,14 @@ snapshots:
|
|||||||
jiti: 2.6.1
|
jiti: 2.6.1
|
||||||
lightningcss: 1.30.2
|
lightningcss: 1.30.2
|
||||||
|
|
||||||
vitefu@1.1.1(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2)):
|
vitefu@1.1.1(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)):
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
|
|
||||||
vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2):
|
vitest@4.0.17(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vitest/expect': 4.0.17
|
'@vitest/expect': 4.0.17
|
||||||
'@vitest/mocker': 4.0.17(vite@7.3.1(jiti@2.6.1)(lightningcss@1.30.2))
|
'@vitest/mocker': 4.0.17(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))
|
||||||
'@vitest/pretty-format': 4.0.17
|
'@vitest/pretty-format': 4.0.17
|
||||||
'@vitest/runner': 4.0.17
|
'@vitest/runner': 4.0.17
|
||||||
'@vitest/snapshot': 4.0.17
|
'@vitest/snapshot': 4.0.17
|
||||||
@@ -3996,7 +3996,7 @@ snapshots:
|
|||||||
tinyexec: 1.0.2
|
tinyexec: 1.0.2
|
||||||
tinyglobby: 0.2.15
|
tinyglobby: 0.2.15
|
||||||
tinyrainbow: 3.0.3
|
tinyrainbow: 3.0.3
|
||||||
vite: 7.3.1(jiti@2.6.1)(lightningcss@1.30.2)
|
vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2)
|
||||||
why-is-node-running: 2.3.0
|
why-is-node-running: 2.3.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
jsdom: 27.4.0
|
jsdom: 27.4.0
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use crate::bridge_manager::SharedBridgeManager;
|
|||||||
use crate::config::{ClaudeStartOptions, HikariConfig};
|
use crate::config::{ClaudeStartOptions, HikariConfig};
|
||||||
use crate::stats::UsageStats;
|
use crate::stats::UsageStats;
|
||||||
use crate::temp_manager::SharedTempFileManager;
|
use crate::temp_manager::SharedTempFileManager;
|
||||||
|
use crate::utils::normalize_path_separators;
|
||||||
|
|
||||||
const CONFIG_STORE_KEY: &str = "config";
|
const CONFIG_STORE_KEY: &str = "config";
|
||||||
|
|
||||||
@@ -126,7 +127,7 @@ pub async fn validate_directory(
|
|||||||
|
|
||||||
// Expand ~ to home directory
|
// Expand ~ to home directory
|
||||||
let expanded_path = if path.starts_with("~") {
|
let expanded_path = if path.starts_with("~") {
|
||||||
if let Some(home) = std::env::var_os("HOME") {
|
if let Some(home) = std::env::var_os("HOME").or_else(|| std::env::var_os("USERPROFILE")) {
|
||||||
let home_path = Path::new(&home);
|
let home_path = Path::new(&home);
|
||||||
if path == Path::new("~") {
|
if path == Path::new("~") {
|
||||||
home_path.to_path_buf()
|
home_path.to_path_buf()
|
||||||
@@ -162,10 +163,10 @@ pub async fn validate_directory(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the canonicalized (absolute) path
|
// Return the canonicalized (absolute) path with forward slashes
|
||||||
expanded_path
|
expanded_path
|
||||||
.canonicalize()
|
.canonicalize()
|
||||||
.map(|p| p.to_string_lossy().to_string())
|
.map(|p| normalize_path_separators(&p.to_string_lossy()))
|
||||||
.map_err(|e| format!("Failed to resolve path: {}", e))
|
.map_err(|e| format!("Failed to resolve path: {}", e))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,9 +206,10 @@ pub async fn list_skills() -> Result<Vec<String>, String> {
|
|||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
// Get the home directory
|
// Get the home directory - use HOME on Unix, USERPROFILE on Windows
|
||||||
let home =
|
let home = std::env::var_os("HOME")
|
||||||
std::env::var_os("HOME").ok_or_else(|| "Could not determine home directory".to_string())?;
|
.or_else(|| std::env::var_os("USERPROFILE"))
|
||||||
|
.ok_or_else(|| "Could not determine home directory".to_string())?;
|
||||||
|
|
||||||
let skills_dir = Path::new(&home).join(".claude").join("skills");
|
let skills_dir = Path::new(&home).join(".claude").join("skills");
|
||||||
|
|
||||||
@@ -437,9 +439,11 @@ pub async fn list_directory(path: String) -> Result<Vec<FileEntry>, String> {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let path_str = normalize_path_separators(&path.to_string_lossy());
|
||||||
|
|
||||||
file_entries.push(FileEntry {
|
file_entries.push(FileEntry {
|
||||||
name,
|
name,
|
||||||
path: path.to_string_lossy().to_string(),
|
path: path_str,
|
||||||
is_directory: path.is_dir(),
|
is_directory: path.is_dir(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -814,4 +818,25 @@ mod tests {
|
|||||||
assert!(json.contains("/tmp/test.txt"));
|
assert!(json.contains("/tmp/test.txt"));
|
||||||
assert!(json.contains("test.txt"));
|
assert!(json.contains("test.txt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_validate_directory_normalizes_backslashes() {
|
||||||
|
// This test ensures that paths with backslashes are normalized
|
||||||
|
// Create a temp directory for testing
|
||||||
|
let temp_dir = TempDir::new().unwrap();
|
||||||
|
|
||||||
|
// On Windows, the canonicalized path will have backslashes
|
||||||
|
// Our normalize_path_separators should convert them to forward slashes
|
||||||
|
let result = run_async(validate_directory(
|
||||||
|
temp_dir.path().to_string_lossy().to_string(),
|
||||||
|
None,
|
||||||
|
));
|
||||||
|
|
||||||
|
assert!(result.is_ok());
|
||||||
|
let normalized_path = result.unwrap();
|
||||||
|
|
||||||
|
// The result should never contain backslashes
|
||||||
|
assert!(!normalized_path.contains('\\'),
|
||||||
|
"Path should not contain backslashes: {}", normalized_path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ mod stats;
|
|||||||
mod temp_manager;
|
mod temp_manager;
|
||||||
mod tray;
|
mod tray;
|
||||||
mod types;
|
mod types;
|
||||||
|
mod utils;
|
||||||
mod vbs_notification;
|
mod vbs_notification;
|
||||||
mod windows_toast;
|
mod windows_toast;
|
||||||
mod wsl_bridge;
|
mod wsl_bridge;
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/// Utility functions for cross-platform compatibility
|
||||||
|
|
||||||
|
/// Normalize path separators to forward slashes for consistent handling across platforms
|
||||||
|
/// This always normalizes backslashes to forward slashes, regardless of platform,
|
||||||
|
/// because Windows paths may be passed to WSL which expects Unix-style paths
|
||||||
|
pub fn normalize_path_separators(path: &str) -> String {
|
||||||
|
path.replace('\\', "/")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
fn test_normalize_path_windows() {
|
||||||
|
assert_eq!(normalize_path_separators("C:\\Users\\test"), "C:/Users/test");
|
||||||
|
assert_eq!(normalize_path_separators("path\\to\\file"), "path/to/file");
|
||||||
|
assert_eq!(normalize_path_separators("already/forward"), "already/forward");
|
||||||
|
assert_eq!(normalize_path_separators("mixed\\path/file"), "mixed/path/file");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
fn test_normalize_path_unix() {
|
||||||
|
assert_eq!(normalize_path_separators("/home/user"), "/home/user");
|
||||||
|
assert_eq!(normalize_path_separators("path/to/file"), "path/to/file");
|
||||||
|
// Even on Unix, we normalize backslashes since paths may come from Windows
|
||||||
|
assert_eq!(normalize_path_separators("weird\\path"), "weird/path");
|
||||||
|
assert_eq!(normalize_path_separators("/home/user\\file"), "/home/user/file");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_normalize_wsl_paths() {
|
||||||
|
// Test the exact issue that was happening
|
||||||
|
assert_eq!(
|
||||||
|
normalize_path_separators("/home/naomi/code/naomi/portfolio\\.."),
|
||||||
|
"/home/naomi/code/naomi/portfolio/.."
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test mixed separators in WSL paths
|
||||||
|
assert_eq!(
|
||||||
|
normalize_path_separators("/mnt/c\\Users\\naomi\\Documents"),
|
||||||
|
"/mnt/c/Users/naomi/Documents"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test Windows paths that might be passed to WSL
|
||||||
|
assert_eq!(
|
||||||
|
normalize_path_separators("C:\\Users\\naomi\\.claude\\skills"),
|
||||||
|
"C:/Users/naomi/.claude/skills"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test that forward slashes remain unchanged
|
||||||
|
assert_eq!(
|
||||||
|
normalize_path_separators("/home/naomi/.claude/skills"),
|
||||||
|
"/home/naomi/.claude/skills"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test empty string
|
||||||
|
assert_eq!(normalize_path_separators(""), "");
|
||||||
|
|
||||||
|
// Test single backslash
|
||||||
|
assert_eq!(normalize_path_separators("\\"), "/");
|
||||||
|
|
||||||
|
// Test multiple consecutive backslashes
|
||||||
|
assert_eq!(
|
||||||
|
normalize_path_separators("path\\\\to\\\\file"),
|
||||||
|
"path//to//file"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ use crate::types::{
|
|||||||
PermissionPromptEvent, QuestionOption, SessionEvent, StateChangeEvent, UserQuestionEvent,
|
PermissionPromptEvent, QuestionOption, SessionEvent, StateChangeEvent, UserQuestionEvent,
|
||||||
WorkingDirectoryEvent,
|
WorkingDirectoryEvent,
|
||||||
};
|
};
|
||||||
|
use crate::utils::normalize_path_separators;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
|
|
||||||
const SEARCH_TOOLS: [&str; 5] = ["Read", "Glob", "Grep", "WebSearch", "WebFetch"];
|
const SEARCH_TOOLS: [&str; 5] = ["Read", "Glob", "Grep", "WebSearch", "WebFetch"];
|
||||||
@@ -136,7 +137,8 @@ impl WslBridge {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let working_dir = &options.working_dir;
|
let working_dir = &options.working_dir;
|
||||||
self.working_directory = working_dir.clone();
|
// Normalize path separators to forward slashes
|
||||||
|
self.working_directory = normalize_path_separators(working_dir);
|
||||||
|
|
||||||
emit_connection_status(
|
emit_connection_status(
|
||||||
&app,
|
&app,
|
||||||
@@ -183,7 +185,7 @@ impl WslBridge {
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
eprintln!("[DEBUG] Found claude at: {}", claude_path);
|
eprintln!("[DEBUG] Found claude at: {}", claude_path);
|
||||||
eprintln!("[DEBUG] Working dir: {}", working_dir);
|
eprintln!("[DEBUG] Working dir: {}", &self.working_directory);
|
||||||
|
|
||||||
let mut cmd = Command::new(&claude_path);
|
let mut cmd = Command::new(&claude_path);
|
||||||
cmd.args([
|
cmd.args([
|
||||||
@@ -225,7 +227,7 @@ impl WslBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.current_dir(working_dir);
|
cmd.current_dir(&self.working_directory);
|
||||||
|
|
||||||
// Set API key as environment variable if specified
|
// Set API key as environment variable if specified
|
||||||
if let Some(ref api_key) = options.api_key {
|
if let Some(ref api_key) = options.api_key {
|
||||||
@@ -241,7 +243,7 @@ impl WslBridge {
|
|||||||
let mut cmd = Command::new("wsl");
|
let mut cmd = Command::new("wsl");
|
||||||
|
|
||||||
// Build the claude command with all arguments
|
// Build the claude command with all arguments
|
||||||
let mut claude_cmd = format!("cd '{}' && ", working_dir);
|
let mut claude_cmd = format!("cd '{}' && ", &self.working_directory);
|
||||||
|
|
||||||
// Set API key as environment variable if specified
|
// Set API key as environment variable if specified
|
||||||
if let Some(ref api_key) = options.api_key {
|
if let Some(ref api_key) = options.api_key {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import type {
|
|||||||
} from "$lib/types/messages";
|
} from "$lib/types/messages";
|
||||||
import type { CharacterState } from "$lib/types/states";
|
import type { CharacterState } from "$lib/types/states";
|
||||||
import { cleanupConversationTracking } from "$lib/tauri";
|
import { cleanupConversationTracking } from "$lib/tauri";
|
||||||
|
import { normalizePath } from "$lib/utils/paths";
|
||||||
import { characterState } from "$lib/stores/character";
|
import { characterState } from "$lib/stores/character";
|
||||||
import { sessionsStore } from "$lib/stores/sessions";
|
import { sessionsStore } from "$lib/stores/sessions";
|
||||||
|
|
||||||
@@ -388,7 +389,7 @@ function createConversationsStore() {
|
|||||||
conversations.update((convs) => {
|
conversations.update((convs) => {
|
||||||
const conv = convs.get(activeId);
|
const conv = convs.get(activeId);
|
||||||
if (conv) {
|
if (conv) {
|
||||||
conv.workingDirectory = dir;
|
conv.workingDirectory = normalizePath(dir);
|
||||||
conv.lastActivityAt = new Date();
|
conv.lastActivityAt = new Date();
|
||||||
}
|
}
|
||||||
return convs;
|
return convs;
|
||||||
@@ -399,7 +400,7 @@ function createConversationsStore() {
|
|||||||
conversations.update((convs) => {
|
conversations.update((convs) => {
|
||||||
const conv = convs.get(conversationId);
|
const conv = convs.get(conversationId);
|
||||||
if (conv) {
|
if (conv) {
|
||||||
conv.workingDirectory = dir;
|
conv.workingDirectory = normalizePath(dir);
|
||||||
conv.lastActivityAt = new Date();
|
conv.lastActivityAt = new Date();
|
||||||
}
|
}
|
||||||
return convs;
|
return convs;
|
||||||
|
|||||||
+15
-11
@@ -1,6 +1,7 @@
|
|||||||
import { writable, derived, get } from "svelte/store";
|
import { writable, derived, get } from "svelte/store";
|
||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
import type { EditorState, EditorTab, FileEntry } from "$lib/types/editor";
|
import type { EditorState, EditorTab, FileEntry } from "$lib/types/editor";
|
||||||
|
import { normalizePath, joinPath, getParentPath, getFilename } from "$lib/utils/paths";
|
||||||
|
|
||||||
const defaultState: EditorState = {
|
const defaultState: EditorState = {
|
||||||
tabs: [],
|
tabs: [],
|
||||||
@@ -158,7 +159,7 @@ function createEditorStore() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const content = await invoke<string>("read_file_content", { path: filePath });
|
const content = await invoke<string>("read_file_content", { path: filePath });
|
||||||
const fileName = filePath.split(/[/\\]/).pop() || "untitled";
|
const fileName = getFilename(filePath) || "untitled";
|
||||||
const language = getLanguageFromPath(filePath);
|
const language = getLanguageFromPath(filePath);
|
||||||
const newTab: EditorTab = {
|
const newTab: EditorTab = {
|
||||||
id: generateTabId(),
|
id: generateTabId(),
|
||||||
@@ -247,7 +248,7 @@ function createEditorStore() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function createFile(parentPath: string, fileName: string): Promise<boolean> {
|
async function createFile(parentPath: string, fileName: string): Promise<boolean> {
|
||||||
const filePath = `${parentPath}/${fileName}`;
|
const filePath = joinPath(parentPath, fileName);
|
||||||
try {
|
try {
|
||||||
await invoke("create_file", { path: filePath });
|
await invoke("create_file", { path: filePath });
|
||||||
// Refresh the parent directory
|
// Refresh the parent directory
|
||||||
@@ -261,7 +262,7 @@ function createEditorStore() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function createDirectory(parentPath: string, dirName: string): Promise<boolean> {
|
async function createDirectory(parentPath: string, dirName: string): Promise<boolean> {
|
||||||
const dirPath = `${parentPath}/${dirName}`;
|
const dirPath = joinPath(parentPath, dirName);
|
||||||
try {
|
try {
|
||||||
await invoke("create_directory", { path: dirPath });
|
await invoke("create_directory", { path: dirPath });
|
||||||
// Refresh the parent directory
|
// Refresh the parent directory
|
||||||
@@ -284,7 +285,7 @@ function createEditorStore() {
|
|||||||
closeTab(openTab.id);
|
closeTab(openTab.id);
|
||||||
}
|
}
|
||||||
// Refresh the parent directory
|
// Refresh the parent directory
|
||||||
const parentPath = filePath.substring(0, filePath.lastIndexOf("/"));
|
const parentPath = getParentPath(filePath);
|
||||||
await refreshDirectory(parentPath);
|
await refreshDirectory(parentPath);
|
||||||
return true;
|
return true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -299,10 +300,11 @@ function createEditorStore() {
|
|||||||
await invoke("delete_directory", { path: dirPath });
|
await invoke("delete_directory", { path: dirPath });
|
||||||
// Close any tabs that are in this directory
|
// Close any tabs that are in this directory
|
||||||
const currentState = get(state);
|
const currentState = get(state);
|
||||||
const tabsToClose = currentState.tabs.filter((t) => t.filePath.startsWith(dirPath + "/"));
|
const normalizedDirPath = normalizePath(dirPath);
|
||||||
|
const tabsToClose = currentState.tabs.filter((t) => normalizePath(t.filePath).startsWith(normalizedDirPath + "/"));
|
||||||
tabsToClose.forEach((tab) => closeTab(tab.id));
|
tabsToClose.forEach((tab) => closeTab(tab.id));
|
||||||
// Refresh the parent directory
|
// Refresh the parent directory
|
||||||
const parentPath = dirPath.substring(0, dirPath.lastIndexOf("/"));
|
const parentPath = getParentPath(dirPath);
|
||||||
await refreshDirectory(parentPath);
|
await refreshDirectory(parentPath);
|
||||||
return true;
|
return true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -341,8 +343,8 @@ function createEditorStore() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function renamePath(oldPath: string, newName: string): Promise<boolean> {
|
async function renamePath(oldPath: string, newName: string): Promise<boolean> {
|
||||||
const parentPath = oldPath.substring(0, oldPath.lastIndexOf("/"));
|
const parentPath = getParentPath(oldPath);
|
||||||
const newPath = `${parentPath}/${newName}`;
|
const newPath = joinPath(parentPath, newName);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await invoke("rename_path", { oldPath, newPath });
|
await invoke("rename_path", { oldPath, newPath });
|
||||||
@@ -359,12 +361,14 @@ function createEditorStore() {
|
|||||||
fileName: newName,
|
fileName: newName,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (t.filePath.startsWith(oldPath + "/")) {
|
const normalizedOldPath = normalizePath(oldPath);
|
||||||
|
const normalizedFilePath = normalizePath(t.filePath);
|
||||||
|
if (normalizedFilePath.startsWith(normalizedOldPath + "/")) {
|
||||||
// File is inside a renamed directory
|
// File is inside a renamed directory
|
||||||
const relativePath = t.filePath.substring(oldPath.length);
|
const relativePath = normalizedFilePath.substring(normalizedOldPath.length);
|
||||||
return {
|
return {
|
||||||
...t,
|
...t,
|
||||||
filePath: newPath + relativePath,
|
filePath: normalizePath(newPath + relativePath),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return t;
|
return t;
|
||||||
|
|||||||
+6
-2
@@ -18,6 +18,7 @@ import {
|
|||||||
handleConnectionStatusChange,
|
handleConnectionStatusChange,
|
||||||
handleNewUserMessage,
|
handleNewUserMessage,
|
||||||
} from "$lib/notifications/rules";
|
} from "$lib/notifications/rules";
|
||||||
|
import { normalizePath } from "$lib/utils/paths";
|
||||||
|
|
||||||
interface StateChangePayload {
|
interface StateChangePayload {
|
||||||
state: CharacterState;
|
state: CharacterState;
|
||||||
@@ -290,12 +291,15 @@ export async function initializeTauriListeners() {
|
|||||||
const cwdUnlisten = await listen<WorkingDirectoryPayload>("claude:cwd", (event) => {
|
const cwdUnlisten = await listen<WorkingDirectoryPayload>("claude:cwd", (event) => {
|
||||||
const { directory, conversation_id } = event.payload;
|
const { directory, conversation_id } = event.payload;
|
||||||
|
|
||||||
|
// Normalize path separators to forward slashes
|
||||||
|
const normalizedDirectory = normalizePath(directory);
|
||||||
|
|
||||||
// Store working directory for the correct conversation
|
// Store working directory for the correct conversation
|
||||||
if (conversation_id) {
|
if (conversation_id) {
|
||||||
claudeStore.setWorkingDirectoryForConversation(conversation_id, directory);
|
claudeStore.setWorkingDirectoryForConversation(conversation_id, normalizedDirectory);
|
||||||
} else {
|
} else {
|
||||||
// Fallback to active conversation if no conversation_id
|
// Fallback to active conversation if no conversation_id
|
||||||
claudeStore.setWorkingDirectory(directory);
|
claudeStore.setWorkingDirectory(normalizedDirectory);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
unlisteners.push(cwdUnlisten);
|
unlisteners.push(cwdUnlisten);
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { normalizePath, joinPath, getParentPath, getFilename } from "./paths";
|
||||||
|
|
||||||
|
describe("paths utilities", () => {
|
||||||
|
describe("normalizePath", () => {
|
||||||
|
it("should normalize Windows paths", () => {
|
||||||
|
expect(normalizePath("C:\\Users\\test")).toBe("C:/Users/test");
|
||||||
|
expect(normalizePath("path\\to\\file")).toBe("path/to/file");
|
||||||
|
expect(normalizePath("C:\\Users\\test\\file.txt")).toBe("C:/Users/test/file.txt");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should leave Unix paths unchanged", () => {
|
||||||
|
expect(normalizePath("/home/user")).toBe("/home/user");
|
||||||
|
expect(normalizePath("path/to/file")).toBe("path/to/file");
|
||||||
|
expect(normalizePath("/usr/local/bin")).toBe("/usr/local/bin");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle mixed separators", () => {
|
||||||
|
expect(normalizePath("mixed\\path/file")).toBe("mixed/path/file");
|
||||||
|
expect(normalizePath("C:\\Users/test\\mixed/path")).toBe("C:/Users/test/mixed/path");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle empty strings", () => {
|
||||||
|
expect(normalizePath("")).toBe("");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("joinPath", () => {
|
||||||
|
it("should join path segments with forward slashes", () => {
|
||||||
|
expect(joinPath("parent", "child")).toBe("parent/child");
|
||||||
|
expect(joinPath("/home", "user", "documents")).toBe("/home/user/documents");
|
||||||
|
expect(joinPath("C:", "Users", "test")).toBe("C:/Users/test");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should filter out empty segments", () => {
|
||||||
|
expect(joinPath("parent", "", "child")).toBe("parent/child");
|
||||||
|
expect(joinPath("", "home", "")).toBe("home");
|
||||||
|
expect(joinPath("", "", "")).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should normalize mixed separators in segments", () => {
|
||||||
|
expect(joinPath("parent\\dir", "child")).toBe("parent/dir/child");
|
||||||
|
expect(joinPath("C:\\Users", "test\\file")).toBe("C:/Users/test/file");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("getParentPath", () => {
|
||||||
|
it("should get parent directory of Unix paths", () => {
|
||||||
|
expect(getParentPath("/home/user/file.txt")).toBe("/home/user");
|
||||||
|
expect(getParentPath("/home/user/")).toBe("/home");
|
||||||
|
expect(getParentPath("/home")).toBe("/");
|
||||||
|
expect(getParentPath("/")).toBe("/");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should get parent directory of Windows paths", () => {
|
||||||
|
expect(getParentPath("C:\\Users\\test\\file.txt")).toBe("C:/Users/test");
|
||||||
|
expect(getParentPath("C:\\Users\\test")).toBe("C:/Users");
|
||||||
|
expect(getParentPath("C:\\")).toBe("C:");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle relative paths", () => {
|
||||||
|
expect(getParentPath("parent/child/file.txt")).toBe("parent/child");
|
||||||
|
expect(getParentPath("file.txt")).toBe(".");
|
||||||
|
expect(getParentPath("")).toBe(".");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle paths with trailing slashes", () => {
|
||||||
|
expect(getParentPath("/home/user/")).toBe("/home");
|
||||||
|
expect(getParentPath("parent/child/")).toBe("parent");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("getFilename", () => {
|
||||||
|
it("should extract filename from Unix paths", () => {
|
||||||
|
expect(getFilename("/home/user/file.txt")).toBe("file.txt");
|
||||||
|
expect(getFilename("/usr/local/bin/node")).toBe("node");
|
||||||
|
expect(getFilename("/home/user/")).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should extract filename from Windows paths", () => {
|
||||||
|
expect(getFilename("C:\\Users\\test\\file.txt")).toBe("file.txt");
|
||||||
|
expect(getFilename("C:\\Program Files\\app.exe")).toBe("app.exe");
|
||||||
|
expect(getFilename("D:\\folder\\")).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle relative paths", () => {
|
||||||
|
expect(getFilename("parent/child/file.txt")).toBe("file.txt");
|
||||||
|
expect(getFilename("file.txt")).toBe("file.txt");
|
||||||
|
expect(getFilename("")).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle paths without filename", () => {
|
||||||
|
expect(getFilename("/home/user/")).toBe("");
|
||||||
|
expect(getFilename("folder/")).toBe("");
|
||||||
|
expect(getFilename("/")).toBe("");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
* Normalize path separators to forward slashes for consistent handling across platforms
|
||||||
|
*/
|
||||||
|
export function normalizePath(path: string): string {
|
||||||
|
// Replace all backslashes with forward slashes
|
||||||
|
return path.replace(/\\/g, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Join path segments with forward slashes
|
||||||
|
*/
|
||||||
|
export function joinPath(...segments: string[]): string {
|
||||||
|
// Filter out empty segments
|
||||||
|
const filtered = segments.filter((s) => s);
|
||||||
|
// Join with forward slash and normalize
|
||||||
|
return normalizePath(filtered.join("/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the parent directory of a path
|
||||||
|
*/
|
||||||
|
export function getParentPath(path: string): string {
|
||||||
|
let normalized = normalizePath(path);
|
||||||
|
|
||||||
|
// Remove trailing slash if present (unless it's the root)
|
||||||
|
if (normalized.endsWith("/") && normalized.length > 1) {
|
||||||
|
normalized = normalized.slice(0, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Windows drive roots (e.g., "C:" or "C:/")
|
||||||
|
if (/^[A-Za-z]:$/.test(normalized)) {
|
||||||
|
return normalized; // Drive root has no parent
|
||||||
|
}
|
||||||
|
|
||||||
|
const lastSlash = normalized.lastIndexOf("/");
|
||||||
|
if (lastSlash === -1) {
|
||||||
|
// No slash found - could be just a filename or Windows drive letter
|
||||||
|
if (/^[A-Za-z]:/.test(normalized)) {
|
||||||
|
// It's a Windows path like "C:file.txt" - parent is "C:"
|
||||||
|
return normalized.substring(0, 2);
|
||||||
|
}
|
||||||
|
return ".";
|
||||||
|
}
|
||||||
|
if (lastSlash === 0) {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if parent would be a Windows drive root
|
||||||
|
const parent = normalized.substring(0, lastSlash);
|
||||||
|
if (/^[A-Za-z]:$/.test(parent)) {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the filename from a path
|
||||||
|
*/
|
||||||
|
export function getFilename(path: string): string {
|
||||||
|
const normalized = normalizePath(path);
|
||||||
|
const lastSlash = normalized.lastIndexOf("/");
|
||||||
|
if (lastSlash === -1) {
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
return normalized.substring(lastSlash + 1);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user