Compare commits

...

60 Commits

Author SHA1 Message Date
d25540283d Revert "Fix linux paths and types"
This reverts commit 78de5da743.
2024-04-02 05:26:04 -04:00
78de5da743 Fix linux paths and types 2024-04-02 05:02:32 -04:00
0a3c68f5c0 Merge branch 'main' into pierremtb/issue1349 2024-03-29 05:56:23 -04:00
b657eec45d Merge branch 'main' into pierremtb/issue1349 2024-03-29 05:48:21 -04:00
aabec688b3 Bump tauri to new beta 2024-03-29 05:43:20 -04:00
a78874d9a5 Force BUILD_RELEASE: true 2024-03-28 07:22:29 -04:00
ac933eb1d3 Merge branch 'main' into pierremtb/issue1349 2024-03-28 06:18:37 -04:00
5c19d897da Merge branch 'main' into pierremtb/issue1349 2024-03-27 07:48:17 -04:00
34f368e555 Merge branch 'main' into pierremtb/issue1349 2024-03-27 05:21:35 -04:00
d03a641d6f Merge branch 'main' into pierremtb/issue1349 2024-03-27 05:20:27 -04:00
d7e2abad20 Merge branch 'main' into pierremtb/issue1349 2024-03-25 07:56:51 -04:00
4440f18766 Fix fmt 2024-03-21 07:55:17 -04:00
81b237a864 Merge branch 'main' into pierremtb/issue1349 2024-03-21 07:51:04 -04:00
fb8f1ed7d7 Merge branch 'main' into pierremtb/issue1349 2024-03-11 09:40:08 +01:00
af5917f3d9 Migrate to tauri v2
Fixes #1349
2024-03-11 07:35:22 +01:00
3c03641a57 Clean up 2024-03-07 05:15:56 -05:00
f3af8ef0d9 Migrate to tauri v2
Fixes #1349
2024-03-06 07:11:39 -05:00
73a9f64de8 Clean up 2024-03-06 07:02:10 -05:00
6267d47a35 Empty commit to trigger the CI 2024-03-06 06:56:22 -05:00
2108b1d66a Merge branch 'main' into pierremtb/issue1349 2024-03-04 12:10:19 +00:00
099b009a1b tauri-driver no cap 2024-03-04 12:05:00 +00:00
7d964d9a08 Merge branch 'main' into pierremtb/issue1349 2024-03-02 15:10:50 -05:00
2f1b924dc6 Add allow-create perm 2024-03-02 14:56:21 -05:00
89485b9595 Merge branch 'main' into pierremtb/issue1349 2024-03-01 22:37:37 -05:00
7ac347d04c Merge branch 'main' into pierremtb/issue1349 2024-02-24 11:16:31 -05:00
131608ae24 Empty commit to trigger the CI 2024-02-24 11:12:32 -05:00
d5f9b32da6 Fix settings 2024-02-24 06:30:05 -05:00
b7c3d43e16 Empty commit to trigger the CI 2024-02-24 05:53:23 -05:00
3ab1ad6026 Manual tauri debug build 2024-02-24 05:46:00 -05:00
b043758cea Attemp at fixing --bundles none 2024-02-23 06:34:36 -05:00
a98e89f6da Typo 2024-02-23 06:22:59 -05:00
468ea740a0 No linux bundles 2024-02-23 06:17:45 -05:00
cd84975695 Reenable webtools on debug 2024-02-23 06:06:03 -05:00
2f65d60972 Enable updater only on release builds 2024-02-23 05:48:04 -05:00
60f4522458 WIP keys in debug 2024-02-23 05:37:59 -05:00
58e6d7c0dd Merge branch 'main' into pierremtb/issue1349 2024-02-23 05:30:48 -05:00
37071be6b3 WIP Ubuntu dep 2024-02-22 08:41:00 -05:00
1436977ffb WIP Ubuntu dep 2024-02-22 08:31:30 -05:00
c35f0e1f2a Attempt at fixing builds 2024-02-22 08:21:31 -05:00
29ac5c67b7 Disable devtools 2024-02-22 07:26:09 -05:00
7f03c33bfb Clean up 2024-02-22 05:39:48 -05:00
0772f986c9 Schemas 2024-02-22 05:01:25 -05:00
1821f660cc Merge branch 'main' into pierremtb/issue1349 2024-02-22 04:49:34 -05:00
3a28d097d4 Fix isTauri detection and updater bootup 2024-02-15 08:29:11 -05:00
1ffb6b0192 Fix types 2024-02-15 07:08:07 -05:00
4f2cf2954a Add Updater plugin 2024-02-15 05:24:09 -05:00
f99b55e416 cargo fmt 2024-02-15 05:13:20 -05:00
e226e4c05b More fixes, incl. conf files 2024-02-15 05:11:08 -05:00
05493cb7f4 Merge branch 'main' into pierremtb/issue1349 2024-02-14 07:52:58 -05:00
9db101dbf9 Fix dates 2024-02-14 06:18:24 -05:00
dd5c058e03 Bring back read_dir_recursive from v1 2024-02-14 05:55:55 -05:00
7f746aa06c Use 'unstable'; fix devtools callsite
The API changed a bit here, which forces us to use the unstable crate
feature. The call to open devtools is also new; it's now on the
webview not window.

Signed-off-by: Paul R. Tagliamonte <paul@kittycad.io>
2024-02-13 10:29:50 -05:00
53327c46c2 Clean up 2024-02-13 05:15:01 -05:00
f8224d6ba8 @pierremtb
Merge branch 'main' into pierremtb/issue1349
2024-02-13 05:08:54 -05:00
a91a4fcfe2 Clean up 2024-02-12 20:08:13 -05:00
7293e85e31 Got stream with default file 2024-02-12 08:32:02 -05:00
a769812135 Fix documentDir behavior 2024-02-08 07:22:20 -05:00
96f8b67dc2 Fix file creation 2024-02-07 08:35:46 -05:00
6deac3f388 Fix yarn builds with a couple of shortcuts 2024-02-07 07:06:26 -05:00
6b835d5149 Fix vite build (tauri build still broken) 2024-02-06 06:59:59 -05:00
37 changed files with 2342 additions and 1034 deletions

View File

@ -1,3 +1,3 @@
[codespell]
ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,absolutey
skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md
skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md,./src-tauri/gen/schemas

View File

@ -13,7 +13,8 @@ on:
# Will checkout the last commit from the default branch (main as of 2023-10-04)
env:
BUILD_RELEASE: ${{ github.event_name == 'release' || github.event_name == 'schedule' || github.event_name == 'pull_request' && contains(github.event.pull_request.title, 'Cut release v') }}
# BUILD_RELEASE: ${{ github.event_name == 'release' || github.event_name == 'schedule' || github.event_name == 'pull_request' && contains(github.event.pull_request.title, 'Cut release v') }}
BUILD_RELEASE: true
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@ -125,6 +126,9 @@ jobs:
fail-fast: false
matrix:
os: [macos-14, ubuntu-latest, windows-latest]
env:
TAURI_ARGS_MACOS: ${{ matrix.os == 'macos-14' && '--target universal-apple-darwin' || '' }}
TAURI_ARGS_UBUNTU: ${{ matrix.os == 'ubuntu-latest' && '--bundles' || '' }}
steps:
- uses: actions/checkout@v4
@ -144,10 +148,12 @@ jobs:
sudo apt-get update &&
sudo apt-get install -y
libgtk-3-dev
libgtksourceview-3.0-dev
webkit2gtk-4.0
libappindicator3-dev
libayatana-appindicator3-dev
libwebkit2gtk-4.0-dev
webkit2gtk-driver
libsoup-3.0-dev
libjavascriptcoregtk-4.1-dev
libwebkit2gtk-4.1-dev
xvfb
- name: Sync node version and setup cache
@ -219,28 +225,24 @@ jobs:
shell: cmd
- name: Build the app (debug)
uses: tauri-apps/tauri-action@v0
if: ${{ env.BUILD_RELEASE == 'false' }}
with:
includeRelease: false
includeDebug: true
args: ${{ matrix.os == 'macos-14' && '--target universal-apple-darwin' || '' }}
run: "yarn tauri build --debug ${{ env.TAURI_ARGS_MACOS }} ${{ env.TAURI_ARGS_UBUNTU }}"
- name: Build the app (release) and sign
uses: tauri-apps/tauri-action@v0
if: ${{ env.BUILD_RELEASE == 'true' }}
env:
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
TAURI_CONF_ARGS: "--config ${{ matrix.os == 'windows-latest' && 'src-tauri\\tauri.release.conf.json' || 'src-tauri/tauri.release.conf.json' }}"
TAURI_ARGS_RELEASE: "--config ${{ matrix.os == 'windows-latest' && 'src-tauri\\tauri.release.conf.json' || 'src-tauri/tauri.release.conf.json' }}"
with:
args: "${{ matrix.os == 'macos-14' && '--target universal-apple-darwin' || '' }} ${{ env.TAURI_CONF_ARGS }}"
args: "${{ env.TAURI_ARGS_MACOS }} ${{ env.TAURI_ARGS_UBUNTU }} ${{ env.TAURI_ARGS_RELEASE }}"
- uses: actions/upload-artifact@v3
if: matrix.os != 'ubuntu-latest'
@ -253,7 +255,7 @@ jobs:
- name: Run e2e tests (linux only)
if: matrix.os == 'ubuntu-latest'
run: |
cargo install tauri-driver@0.1.3
cargo install tauri-driver
source .env.${{ env.BUILD_RELEASE == 'true' && 'production' || 'development' }}
export VITE_KC_API_BASE_URL
xvfb-run yarn test:e2e:tauri

1
.gitignore vendored
View File

@ -51,5 +51,6 @@ e2e/playwright/export-snapshots/*
## generated files
src/**/*.typegen.ts
src-tauri/gen
src/wasm-lib/grackle/stdlib_cube_partial.json

View File

@ -15,7 +15,11 @@
"@open-rpc/client-js": "^1.8.1",
"@react-hook/resize-observer": "^1.2.6",
"@replit/codemirror-interact": "^6.3.0",
"@tauri-apps/api": "^1.5.3",
"@sentry/react": "^7.77.0",
"@tauri-apps/api": "^2.0.0-beta.6",
"@tauri-apps/plugin-dialog": "^2.0.0-beta.2",
"@tauri-apps/plugin-fs": "^2.0.0-beta.2",
"@tauri-apps/plugin-os": "^2.0.0-beta.2",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^14.5.2",
@ -46,7 +50,6 @@
"react-router-dom": "^6.22.3",
"sketch-helpers": "^0.0.4",
"swr": "^2.2.2",
"tauri-plugin-fs-extra-api": "https://github.com/tauri-apps/tauri-plugin-fs-extra#v1",
"three": "^0.160.0",
"toml": "^3.0.0",
"ts-node": "^10.9.2",
@ -84,7 +87,7 @@
"remove-importmeta": "sed -i 's/import.meta.url/window.location.origin/g' \"./src/wasm-lib/pkg/wasm_lib.js\"; sed -i '' 's/import.meta.url/window.location.origin/g' \"./src/wasm-lib/pkg/wasm_lib.js\" || echo \"sed for both mac and linux\"",
"wasm-prep": "rm -rf src/wasm-lib/pkg && mkdir src/wasm-lib/pkg && rm -rf src/wasm-lib/kcl/bindings",
"lint": "eslint --fix src",
"bump-jsons": "echo \"$(jq --arg v \"$VERSION\" '.version=$v' package.json --indent 2)\" > package.json && echo \"$(jq --arg v \"$VERSION\" '.package.version=$v' src-tauri/tauri.conf.json --indent 2)\" > src-tauri/tauri.conf.json",
"bump-jsons": "echo \"$(jq --arg v \"$VERSION\" '.version=$v' package.json --indent 2)\" > package.json && echo \"$(jq --arg v \"$VERSION\" '.version=$v' src-tauri/tauri.conf.json --indent 2)\" > src-tauri/tauri.conf.json",
"postinstall": "yarn xstate:typegen",
"xstate:typegen": "yarn xstate typegen \"src/**/*.ts?(x)\""
},
@ -110,7 +113,7 @@
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-env": "^7.23.3",
"@playwright/test": "^1.39.0",
"@tauri-apps/cli": "^1.5.11",
"@tauri-apps/cli": "^2.0.0-beta.11",
"@types/crypto-js": "^4.2.2",
"@types/debounce-promise": "^3.1.9",
"@types/pixelmatch": "^5.2.6",

2556
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -7,12 +7,12 @@ license = ""
repository = "https://github.com/KittyCAD/modeling-app"
default-run = "app"
edition = "2021"
rust-version = "1.60"
rust-version = "1.70"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
tauri-build = { version = "1.5.1", features = [] }
tauri-build = { version = "2.0.0-beta", features = [] }
[dependencies]
anyhow = "1"
@ -20,8 +20,13 @@ kittycad = "0.2.63"
oauth2 = "4.4.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tauri = { version = "1.6.1", features = [ "os-all", "dialog-all", "fs-all", "http-request", "path-all", "shell-open", "shell-open-api", "devtools"] }
tauri-plugin-fs-extra = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri = { version = "2.0.0-beta", features = [ "devtools", "unstable"] }
tauri-plugin-dialog = { version = "2.0.0-beta.0" }
tauri-plugin-fs = { version = "2.0.0-beta.0" }
tauri-plugin-http = { version = "2.0.0-beta.0" }
tauri-plugin-os = { version = "2.0.0-beta.0" }
tauri-plugin-shell = { version = "2.0.0-beta.0" }
tauri-plugin-updater = { version = "2.0.0-beta.0" }
tokio = { version = "1.36.0", features = ["time"] }
toml = "0.8.2"

View File

@ -0,0 +1,82 @@
{
"identifier": "migrated",
"description": "permissions that were migrated from v1",
"context": "local",
"windows": [
"main"
],
"permissions": [
"path:default",
"event:default",
"window:default",
"app:default",
"resources:default",
"menu:default",
"tray:default",
"fs:allow-create",
"fs:allow-read-file",
"fs:allow-read-text-file",
"fs:allow-write-file",
"fs:allow-write-text-file",
"fs:allow-read-dir",
"fs:allow-copy-file",
"fs:allow-mkdir",
"fs:allow-remove",
"fs:allow-remove",
"fs:allow-rename",
"fs:allow-exists",
"fs:allow-stat",
{
"identifier": "fs:scope",
"allow": [
{
"path": "$HOME/**/*"
},
{
"path": "$APPCONFIG"
},
{
"path": "$APPCONFIG/**/*"
},
{
"path": "$DOCUMENT"
},
{
"path": "$DOCUMENT/**/*"
}
]
},
"shell:allow-open",
"dialog:allow-open",
"dialog:allow-save",
"dialog:allow-message",
"dialog:allow-ask",
"dialog:allow-confirm",
{
"identifier": "http:default",
"allow": [
"https://dev.kittycad.io/*",
"https://dev.zoo.dev/*",
"https://kittycad.io/*",
"https://zoo.dev/*",
"https://api.dev.kittycad.io/*",
"https://api.dev.zoo.dev/*"
]
},
"os:allow-platform",
"os:allow-version",
"os:allow-os-type",
"os:allow-family",
"os:allow-arch",
"os:allow-exe-extension",
"os:allow-locale",
"os:allow-hostname"
],
"platforms": [
"linux",
"macOS",
"windows",
"android",
"iOS"
]
}

View File

@ -4,11 +4,15 @@
use std::env;
use std::fs;
use std::io::Read;
use std::path::Path;
use std::path::PathBuf;
use anyhow::Result;
use oauth2::TokenResponse;
use serde::Serialize;
use std::process::Command;
use tauri::{InvokeError, Manager};
use tauri::ipc::InvokeError;
use tauri_plugin_shell::ShellExt;
const DEFAULT_HOST: &str = "https://api.kittycad.io";
/// This command returns the a json string parse from a toml file at the path.
@ -24,6 +28,56 @@ fn read_toml(path: &str) -> Result<String, InvokeError> {
Ok(value)
}
/// From https://github.com/tauri-apps/tauri/blob/1.x/core/tauri/src/api/dir.rs#L51
/// Removed from tauri v2
#[derive(Debug, Serialize)]
pub struct DiskEntry {
/// The path to the entry.
pub path: PathBuf,
/// The name of the entry (file name with extension or directory name).
pub name: Option<String>,
/// The children of this entry if it's a directory.
#[serde(skip_serializing_if = "Option::is_none")]
pub children: Option<Vec<DiskEntry>>,
}
/// From https://github.com/tauri-apps/tauri/blob/1.x/core/tauri/src/api/dir.rs#L51
/// Removed from tauri v2
fn is_dir<P: AsRef<Path>>(path: P) -> Result<bool> {
std::fs::metadata(path)
.map(|md| md.is_dir())
.map_err(Into::into)
}
/// From https://github.com/tauri-apps/tauri/blob/1.x/core/tauri/src/api/dir.rs#L51
/// Removed from tauri v2
#[tauri::command]
fn read_dir_recursive(path: &str) -> Result<Vec<DiskEntry>, InvokeError> {
let mut files_and_dirs: Vec<DiskEntry> = vec![];
// let path = path.as_ref();
for entry in fs::read_dir(path).map_err(|e| InvokeError::from_anyhow(e.into()))? {
let path = entry
.map_err(|e| InvokeError::from_anyhow(e.into()))?
.path();
if let Ok(flag) = is_dir(&path) {
files_and_dirs.push(DiskEntry {
path: path.clone(),
children: if flag {
Some(read_dir_recursive(path.to_str().expect("No path"))?)
} else {
None
},
name: path
.file_name()
.map(|name| name.to_string_lossy())
.map(|name| name.to_string()),
});
}
}
Ok(files_and_dirs)
}
/// This command returns a string that is the contents of a file at the path.
#[tauri::command]
fn read_txt_file(path: &str) -> Result<String, InvokeError> {
@ -85,7 +139,8 @@ async fn login(app: tauri::AppHandle, host: &str) -> Result<String, InvokeError>
fs::write("/tmp/kittycad_user_code", details.user_code().secret())
.expect("Unable to write /tmp/kittycad_user_code file");
} else {
tauri::api::shell::open(&app.shell_scope(), auth_uri.secret(), None)
app.shell()
.open(auth_uri.secret(), None)
.map_err(|e| InvokeError::from_anyhow(e.into()))?;
}
@ -165,12 +220,15 @@ fn show_in_folder(path: String) {
fn main() {
tauri::Builder::default()
.setup(|_app| {
#[cfg(debug_assertions)] // only include this code on debug builds
#[cfg(debug_assertions)]
{
let window = _app.get_window("main").unwrap();
// comment out the below if you don't devtools to open everytime.
// it's useful because otherwise devtools shuts everytime rust code changes.
window.open_devtools();
use tauri::Manager;
_app.get_webview("main").unwrap().open_devtools();
}
#[cfg(not(debug_assertions))]
{
_app.handle()
.plugin(tauri_plugin_updater::Builder::new().build())?;
}
Ok(())
})
@ -179,9 +237,14 @@ fn main() {
login,
read_toml,
read_txt_file,
read_dir_recursive,
show_in_folder,
])
.plugin(tauri_plugin_fs_extra::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_fs::init())
.plugin(tauri_plugin_http::init())
.plugin(tauri_plugin_os::init())
.plugin(tauri_plugin_shell::init())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

View File

@ -1,90 +1,9 @@
{
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"build": {
"beforeDevCommand": "yarn start",
"devPath": "http://localhost:3000",
"distDir": "../build"
},
"package": {
"productName": "zoo-modeling-app",
"version": "0.17.1"
},
"tauri": {
"allowlist": {
"all": false,
"dialog": {
"all": true,
"ask": true,
"confirm": true,
"message": true,
"open": true,
"save": true
},
"fs": {
"scope": [
"$HOME/**/*",
"$APPCONFIG",
"$APPCONFIG/**/*",
"$DOCUMENT",
"$DOCUMENT/**/*"
],
"all": true
},
"http": {
"request": true,
"scope": [
"https://dev.kittycad.io/*",
"https://dev.zoo.dev/*",
"https://kittycad.io/*",
"https://zoo.dev/*",
"https://api.dev.kittycad.io/*",
"https://api.dev.zoo.dev/*"
]
},
"os": {
"all": true
},
"shell": {
"open": true
},
"path": {
"all": true
}
},
"bundle": {
"active": true,
"category": "DeveloperTool",
"copyright": "",
"deb": {
"depends": []
},
"externalBin": [],
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"identifier": "dev.zoo.modeling-app",
"longDescription": "",
"macOS": {
"entitlements": null,
"exceptionDomain": "",
"frameworks": [],
"providerShortName": null,
"signingIdentity": null
},
"resources": [],
"shortDescription": "",
"targets": "all"
},
"app": {
"security": {
"csp": null
},
"updater": {
"active": false
},
"windows": [
{
"fullscreen": false,
@ -94,5 +13,47 @@
"width": 1800
}
]
}
},
"build": {
"beforeDevCommand": "yarn start",
"devUrl": "http://localhost:3000",
"frontendDist": "../build"
},
"bundle": {
"active": true,
"category": "DeveloperTool",
"copyright": "",
"externalBin": [],
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"linux": {
"deb": {
"depends": []
}
},
"longDescription": "",
"macOS": {
"entitlements": null,
"exceptionDomain": "",
"frameworks": [],
"providerShortName": null,
"signingIdentity": null
},
"resources": [],
"shortDescription": "",
"targets": "all"
},
"identifier": "dev.zoo.modeling-app",
"plugins": {
"shell": {
"open": true
}
},
"productName": "zoo-modeling-app",
"version": "0.17.1"
}

View File

@ -1,6 +1,4 @@
{
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"package": {
"productName": "Zoo Modeling App"
}
"productName": "Zoo Modeling App"
}

View File

@ -1,6 +1,6 @@
{
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"tauri": {
"plugins": {
"updater": {
"active": true,
"endpoints": [

View File

@ -1,6 +1,4 @@
{
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"package": {
"productName": "Zoo Modeling App"
}
"productName": "Zoo Modeling App"
}

View File

@ -240,7 +240,7 @@ export const Toolbar = () => {
onClick={() => commandBarSend({ type: 'Open' })}
className="rounded-r-full pr-4 self-stretch border-energy-10 hover:border-energy-10 dark:border-chalkboard-80 bg-energy-10/50 hover:bg-energy-10 dark:bg-chalkboard-80 dark:text-energy-10"
>
{platform === 'darwin' ? '⌘K' : 'Ctrl+/'}
{platform === 'macos' ? '⌘K' : 'Ctrl+/'}
</ActionButton>
</div>
)

View File

@ -54,7 +54,7 @@ export const AppHeader = ({
>
Command Palette{' '}
<kbd className="bg-energy-10/50 dark:bg-chalkboard-100 dark:text-energy-10 inline-block px-1 py-0.5 border-energy-10 dark:border-chalkboard-90">
{platform === 'darwin' ? '⌘K' : 'Ctrl+/'}
{platform === 'macos' ? '⌘K' : 'Ctrl+/'}
</kbd>
</ActionButton>
)}

View File

@ -14,16 +14,10 @@ import {
} from 'xstate'
import { useCommandsContext } from 'hooks/useCommandsContext'
import { DEFAULT_FILE_NAME, fileMachine } from 'machines/fileMachine'
import {
createDir,
removeDir,
removeFile,
renameFile,
writeFile,
} from '@tauri-apps/api/fs'
import { mkdir, remove, rename, create } from '@tauri-apps/plugin-fs'
import { FILE_EXT, readProject } from 'lib/tauriFS'
import { isTauri } from 'lib/isTauri'
import { sep } from '@tauri-apps/api/path'
import { join, sep } from '@tauri-apps/api/path'
type MachineContext<T extends AnyStateMachine> = {
state: StateFrom<T>
@ -55,7 +49,7 @@ export const FileMachineProvider = ({
commandBarSend({ type: 'Close' })
navigate(
`${paths.FILE}/${encodeURIComponent(
context.selectedDirectory + sep + event.data.name
context.selectedDirectory + sep() + event.data.name
)}`
)
}
@ -78,14 +72,13 @@ export const FileMachineProvider = ({
let name = event.data.name.trim() || DEFAULT_FILE_NAME
if (event.data.makeDir) {
await createDir(context.selectedDirectory.path + sep + name)
await mkdir(await join(context.selectedDirectory.path, name))
} else {
await writeFile(
await create(
context.selectedDirectory.path +
sep +
sep() +
name +
(name.endsWith(FILE_EXT) ? '' : FILE_EXT),
''
(name.endsWith(FILE_EXT) ? '' : FILE_EXT)
)
}
@ -98,12 +91,11 @@ export const FileMachineProvider = ({
const { oldName, newName, isDir } = event.data
let name = newName ? newName : DEFAULT_FILE_NAME
await renameFile(
context.selectedDirectory.path + sep + oldName,
context.selectedDirectory.path +
sep +
name +
(name.endsWith(FILE_EXT) || isDir ? '' : FILE_EXT)
await rename(
await join(context.selectedDirectory.path, oldName),
(await join(context.selectedDirectory.path, name)) +
(name.endsWith(FILE_EXT) || isDir ? '' : FILE_EXT),
{}
)
return (
oldName !== name && `Successfully renamed "${oldName}" to "${name}"`
@ -116,11 +108,11 @@ export const FileMachineProvider = ({
const isDir = !!event.data.children
if (isDir) {
await removeDir(event.data.path, {
await remove(event.data.path, {
recursive: true,
}).catch((e) => console.error('Error deleting directory', e))
} else {
await removeFile(event.data.path).catch((e) =>
await remove(event.data.path).catch((e) =>
console.error('Error deleting file', e)
)
}

View File

@ -1,8 +1,7 @@
import { type IndexLoaderData } from 'lib/types'
import type { FileEntry, IndexLoaderData } from 'lib/types'
import { paths } from 'lib/paths'
import { ActionButton } from './ActionButton'
import Tooltip from './Tooltip'
import { FileEntry } from '@tauri-apps/api/fs'
import { Dispatch, useEffect, useRef, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { Dialog, Disclosure } from '@headlessui/react'

View File

@ -120,7 +120,10 @@ function ProjectCard({
}`}
</span>
<span className="text-chalkboard-60 text-xs">
Edited {getDisplayedTime(project.entrypointMetadata.modifiedAt)}
Edited{' '}
{project.entrypointMetadata.mtime
? getDisplayedTime(project.entrypointMetadata.mtime)
: 'never'}
</span>
<div className="absolute z-10 bottom-2 right-2 flex gap-1 items-center opacity-0 group-hover:opacity-100 group-focus-within:opacity-100">
<ActionButton

View File

@ -17,23 +17,24 @@ const projectWellFormed = {
},
],
entrypointMetadata: {
accessedAt: now,
atime: now,
blksize: 32,
blocks: 32,
createdAt: now,
birthtime: now,
dev: 1,
gid: 1,
ino: 1,
isDir: false,
isDirectory: false,
isFile: true,
isSymlink: false,
mode: 1,
modifiedAt: now,
mtime: now,
nlink: 1,
permissions: { readonly: false, mode: 1 },
readonly: false,
rdev: 1,
size: 32,
uid: 1,
fileAttributes: null,
},
} satisfies ProjectWithEntryPointMetadata

View File

@ -80,7 +80,7 @@ function ProjectMenuPopover({
<div className="flex flex-col items-start py-0.5">
<span className="hidden text-sm text-chalkboard-110 dark:text-chalkboard-20 whitespace-nowrap lg:block">
{isTauri() && file?.name
? file.name.slice(file.name.lastIndexOf(sep) + 1)
? file.name.slice(file.name.lastIndexOf(sep()) + 1)
: APP_NAME}
</span>
{isTauri() && project?.name && (
@ -131,7 +131,7 @@ function ProjectMenuPopover({
data-testid="createdAt"
>
Created{' '}
{project.entrypointMetadata.createdAt.toLocaleDateString()}
{project.entrypointMetadata.birthtime?.toLocaleDateString()}
</p>
)}
</div>

View File

@ -1,4 +1,4 @@
import { Platform, platform } from '@tauri-apps/api/os'
import { Platform, platform } from '@tauri-apps/plugin-os'
import { isTauri } from 'lib/isTauri'
import { useEffect, useState } from 'react'
@ -14,9 +14,9 @@ export default function usePlatform() {
void getPlatform()
} else {
if (navigator.userAgent.indexOf('Mac') !== -1) {
setPlatformName('darwin')
setPlatformName('macos')
} else if (navigator.userAgent.indexOf('Win') !== -1) {
setPlatformName('win32')
setPlatformName('windows')
} else if (navigator.userAgent.indexOf('Linux') !== -1) {
setPlatformName('linux')
}

View File

@ -20,7 +20,7 @@ import { bracket } from 'lib/exampleKcl'
import { getNodeFromPath } from './queryAst'
import { Params } from 'react-router-dom'
import { isTauri } from 'lib/isTauri'
import { writeTextFile } from '@tauri-apps/api/fs'
import { writeTextFile } from '@tauri-apps/plugin-fs'
import { toast } from 'react-hot-toast'
const PERSIST_CODE_TOKEN = 'persistCode'

View File

@ -1,10 +1,8 @@
import {
readDir,
readBinaryFile,
exists as tauriExists,
} from '@tauri-apps/api/fs'
import { readFile, exists as tauriExists } from '@tauri-apps/plugin-fs'
import { isTauri } from 'lib/isTauri'
import { join } from '@tauri-apps/api/path'
import { invoke } from '@tauri-apps/api/core'
import { FileEntry } from 'lib/types'
/// FileSystemManager is a class that provides a way to read files from the local file system.
/// It assumes that you are in a project since it is solely used by the std lib
@ -37,7 +35,7 @@ class FileSystemManager {
throw new Error(`Error reading file: ${error}`)
})
.then((file) => {
return readBinaryFile(file)
return readFile(file)
})
}
@ -71,7 +69,9 @@ class FileSystemManager {
throw new Error(`Error joining dir: ${error}`)
})
.then((p) => {
readDir(p, { recursive: true })
invoke<FileEntry[]>('read_dir_recursive', {
path: p,
})
.catch((error) => {
throw new Error(`Error reading dir: ${error}`)
})

View File

@ -1,8 +1,8 @@
import { isTauri } from './isTauri'
import { deserialize_files } from '../wasm-lib/pkg/wasm_lib'
import { browserSaveFile } from './browserSaveFile'
import { save } from '@tauri-apps/api/dialog'
import { writeBinaryFile } from '@tauri-apps/api/fs'
import { save } from '@tauri-apps/plugin-dialog'
import { writeFile } from '@tauri-apps/plugin-fs'
import JSZip from 'jszip'
@ -26,7 +26,8 @@ const save_ = async (file: ModelingAppFile) => {
}
// Write the file.
await writeBinaryFile(filePath, file.contents)
// TODO: check if this is still value with the uint8 instance
await writeFile(filePath, new Uint8Array(file.contents))
} else {
// Download the file to the user's computer.
// Now we need to download the files to the user's downloads folder.

View File

@ -1,6 +1,6 @@
export function isTauri(): boolean {
if (globalThis.window && typeof globalThis.window !== 'undefined') {
return '__TAURI__' in globalThis.window
return '__TAURI_INTERNALS__' in globalThis.window
}
return false
}

View File

@ -1,5 +1,5 @@
import { ActionFunction, LoaderFunction, redirect } from 'react-router-dom'
import { HomeLoaderData, IndexLoaderData } from './types'
import { FileEntry, HomeLoaderData, IndexLoaderData } from './types'
import { isTauri } from './isTauri'
import { paths } from './paths'
import { BROWSER_FILE_NAME } from 'Router'
@ -12,11 +12,11 @@ import {
PROJECT_ENTRYPOINT,
} from './tauriFS'
import makeUrlPathRelative from './makeUrlPathRelative'
import { sep } from '@tauri-apps/api/path'
import { readDir, readTextFile } from '@tauri-apps/api/fs'
import { metadata } from 'tauri-plugin-fs-extra-api'
import { join, sep } from '@tauri-apps/api/path'
import { readDir, readTextFile, stat } from '@tauri-apps/plugin-fs'
import { kclManager } from 'lib/singletons'
import { fileSystemManager } from 'lang/std/fileSystemManager'
import { invoke } from '@tauri-apps/api/core'
// The root loader simply resolves the settings and any errors that
// occurred during the settings load
@ -56,26 +56,28 @@ export const fileLoader: LoaderFunction = async ({
if (params.id && params.id !== BROWSER_FILE_NAME) {
const decodedId = decodeURIComponent(params.id)
const projectAndFile = decodedId.replace(defaultDir + sep, '')
const firstSlashIndex = projectAndFile.indexOf(sep)
const projectAndFile = decodedId.replace(defaultDir + sep(), '')
const firstSlashIndex = projectAndFile.indexOf(sep())
const projectName = projectAndFile.slice(0, firstSlashIndex)
const projectPath = defaultDir + sep + projectName
const projectPath = await join(defaultDir, projectName)
const currentFileName = projectAndFile.slice(firstSlashIndex + 1)
if (firstSlashIndex === -1 || !currentFileName)
return redirect(
`${paths.FILE}/${encodeURIComponent(
`${params.id}${sep}${PROJECT_ENTRYPOINT}`
await join(params.id, PROJECT_ENTRYPOINT)
)}`
)
// TODO: PROJECT_ENTRYPOINT is hardcoded
// until we support setting a project's entrypoint file
const code = await readTextFile(decodedId)
const entrypointMetadata = await metadata(
projectPath + sep + PROJECT_ENTRYPOINT
const entrypointMetadata = await stat(
await join(projectPath, PROJECT_ENTRYPOINT)
)
const children = await readDir(projectPath, { recursive: true })
const children = await invoke<FileEntry[]>('read_dir_recursive', {
path: projectPath,
})
kclManager.setCodeAndExecute(code, false)
// Set the file system manager to the project path

View File

@ -43,12 +43,12 @@ export function getSortFunction(sortBy: string) {
a: ProjectWithEntryPointMetadata,
b: ProjectWithEntryPointMetadata
) => {
if (a.entrypointMetadata?.modifiedAt && b.entrypointMetadata?.modifiedAt) {
if (a.entrypointMetadata?.mtime && b.entrypointMetadata?.mtime) {
return !sortBy || sortBy.includes('desc')
? b.entrypointMetadata.modifiedAt.getTime() -
a.entrypointMetadata.modifiedAt.getTime()
: a.entrypointMetadata.modifiedAt.getTime() -
b.entrypointMetadata.modifiedAt.getTime()
? b.entrypointMetadata.mtime.getTime() -
a.entrypointMetadata.mtime.getTime()
: a.entrypointMetadata.mtime.getTime() -
b.entrypointMetadata.mtime.getTime()
}
return 0
}

View File

@ -1,4 +1,3 @@
import { FileEntry } from '@tauri-apps/api/fs'
import {
MAX_PADDING,
deepFileFilter,
@ -7,6 +6,7 @@ import {
interpolateProjectNameWithIndex,
isRelevantFileOrDir,
} from './tauriFS'
import type { FileEntry } from './types'
describe('Test project name utility functions', () => {
it('interpolates a project name without an index', () => {

View File

@ -1,15 +1,21 @@
import {
FileEntry,
createDir,
mkdir,
exists,
readDir,
readTextFile,
writeTextFile,
} from '@tauri-apps/api/fs'
import { appConfigDir, documentDir, homeDir, sep } from '@tauri-apps/api/path'
stat,
} from '@tauri-apps/plugin-fs'
import { invoke } from '@tauri-apps/api/core'
import {
appConfigDir,
documentDir,
homeDir,
join,
sep,
} from '@tauri-apps/api/path'
import { isTauri } from './isTauri'
import { type ProjectWithEntryPointMetadata } from 'lib/types'
import { metadata } from 'tauri-plugin-fs-extra-api'
import type { FileEntry, ProjectWithEntryPointMetadata } from 'lib/types'
import { settingsMachine } from 'machines/settingsMachine'
import { ContextFrom } from 'xstate'
import { SETTINGS_FILE_NAME } from 'lib/constants'
@ -104,7 +110,7 @@ async function testAndCreateDir(
if (dirExists instanceof Error) {
returnValue.error = dirExists
} else if (dirExists === false) {
const newDirCreated = await createDir(directory, { recursive: true }).catch(
const newDirCreated = await mkdir(directory, { recursive: true }).catch(
(e) => {
console.error(
`Error creating directory ${directory}. Original error:`,
@ -137,14 +143,12 @@ export function isProjectDirectory(fileOrDir: Partial<FileEntry>) {
// and return the valid projects
export async function getProjectsInDir(projectDir: string) {
const readProjects = (
await readDir(projectDir, {
recursive: true,
})
await invoke<FileEntry[]>('read_dir_recursive', { path: projectDir })
).filter(isProjectDirectory)
const projectsWithMetadata = await Promise.all(
readProjects.map(async (p) => ({
entrypointMetadata: await metadata(p.path + sep + PROJECT_ENTRYPOINT),
entrypointMetadata: await stat(await join(p.path, PROJECT_ENTRYPOINT)),
...p,
}))
)
@ -204,8 +208,8 @@ export function deepFileFilterFlat(
// Read the contents of a project directory
// and return all relevant files and sub-directories recursively
export async function readProject(projectDir: string) {
const readFiles = await readDir(projectDir, {
recursive: true,
const readFiles = await invoke<FileEntry[]>('read_dir_recursive', {
path: projectDir,
})
return deepFileFilter(readFiles, isRelevantFileOrDir)
@ -293,29 +297,29 @@ export async function createNewProject(
const dirExists = await exists(path)
if (!dirExists) {
await createDir(path, { recursive: true }).catch((err) => {
await mkdir(path, { recursive: true }).catch((err) => {
console.error('Error creating new directory:', err)
throw err
})
}
await writeTextFile(path + sep + PROJECT_ENTRYPOINT, initCode).catch(
await writeTextFile(await join(path, PROJECT_ENTRYPOINT), initCode).catch(
(err) => {
console.error('Error creating new file:', err)
throw err
}
)
const m = await metadata(path)
const m = await stat(path)
return {
name: path.slice(path.lastIndexOf(sep) + 1),
name: path.slice(path.lastIndexOf(sep()) + 1),
path: path,
entrypointMetadata: m,
children: [
{
name: PROJECT_ENTRYPOINT,
path: path + sep + PROJECT_ENTRYPOINT,
path: await join(path, PROJECT_ENTRYPOINT),
children: [],
},
],
@ -396,7 +400,7 @@ export async function readSettingsFile(): Promise<ContextFrom<
const path = dir + SETTINGS_FILE_NAME
const dirExists = await exists(dir)
if (!dirExists) {
await createDir(dir, { recursive: true })
await mkdir(dir, { recursive: true })
}
const settingsExist = dirExists ? await exists(path) : false

View File

@ -1,5 +1,4 @@
import { type Metadata } from 'tauri-plugin-fs-extra-api'
import { type FileEntry } from '@tauri-apps/api/fs'
import { type FileInfo } from '@tauri-apps/plugin-fs'
export type IndexLoaderData = {
code: string | null
@ -8,8 +7,21 @@ export type IndexLoaderData = {
}
export type ProjectWithEntryPointMetadata = FileEntry & {
entrypointMetadata: Metadata
entrypointMetadata: FileInfo
}
export type HomeLoaderData = {
projects: ProjectWithEntryPointMetadata[]
}
// From https://github.com/tauri-apps/tauri/blob/1.x/tooling/api/src/fs.ts#L159
// Removed from tauri v2
export interface FileEntry {
path: string
/**
* Name of the directory/file
* can be null if the path terminates with `..`
*/
name?: string
/** Children of this entry if it's a directory; null otherwise */
children?: FileEntry[]
}

View File

@ -2,7 +2,7 @@ import { createMachine, assign } from 'xstate'
import { Models } from '@kittycad/lib'
import withBaseURL from '../lib/withBaseURL'
import { isTauri } from 'lib/isTauri'
import { invoke } from '@tauri-apps/api'
import { invoke } from '@tauri-apps/api/core'
import { VITE_KC_API_BASE_URL } from 'env'
const SKIP_AUTH =

View File

@ -1,6 +1,5 @@
import { assign, createMachine } from 'xstate'
import { type ProjectWithEntryPointMetadata } from 'lib/types'
import { FileEntry } from '@tauri-apps/api/fs'
import type { FileEntry, ProjectWithEntryPointMetadata } from 'lib/types'
export const FILE_PERSIST_KEY = 'Last opened KCL files'
export const DEFAULT_FILE_NAME = 'Untitled'

View File

@ -1,5 +1,5 @@
import { FormEvent, useEffect } from 'react'
import { removeDir, renameFile } from '@tauri-apps/api/fs'
import { remove, rename } from '@tauri-apps/plugin-fs'
import {
createNewProject,
getNextProjectIndex,
@ -32,7 +32,7 @@ import useStateMachineCommands from '../hooks/useStateMachineCommands'
import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext'
import { useCommandsContext } from 'hooks/useCommandsContext'
import { DEFAULT_PROJECT_NAME } from 'lib/constants'
import { sep } from '@tauri-apps/api/path'
import { join, sep } from '@tauri-apps/api/path'
import { homeCommandBarConfig } from 'lib/commandBarConfigs/homeCommandConfig'
import { useHotkeys } from 'react-hotkeys-hook'
import { isTauri } from 'lib/isTauri'
@ -80,7 +80,7 @@ const Home = () => {
event: EventFrom<typeof homeMachine>
) => {
if (event.data && 'name' in event.data) {
let projectPath = context.defaultDirectory + sep + event.data.name
let projectPath = context.defaultDirectory + sep() + event.data.name
onProjectOpen(
{
name: event.data.name,
@ -120,7 +120,7 @@ const Home = () => {
name = interpolateProjectNameWithIndex(name, nextIndex)
}
await createNewProject(context.defaultDirectory + sep + name)
await createNewProject(await join(context.defaultDirectory, name))
if (shouldUpdateDefaultProjectName) {
sendToSettings({
@ -142,9 +142,10 @@ const Home = () => {
name = interpolateProjectNameWithIndex(name, nextIndex)
}
await renameFile(
context.defaultDirectory + sep + oldName,
context.defaultDirectory + sep + name
await rename(
await join(context.defaultDirectory, oldName),
await join(context.defaultDirectory, name),
{}
)
return `Successfully renamed "${oldName}" to "${name}"`
},
@ -152,7 +153,7 @@ const Home = () => {
context: ContextFrom<typeof homeMachine>,
event: EventFrom<typeof homeMachine, 'Delete project'>
) => {
await removeDir(context.defaultDirectory + sep + event.data.name, {
await remove(await join(context.defaultDirectory, event.data.name), {
recursive: true,
})
return `Successfully deleted "${event.data.name}"`

View File

@ -22,7 +22,7 @@ export default function CmdK() {
<h2 className="text-2xl font-bold">Command Bar</h2>
<p className="my-4">
Press{' '}
{platformName === 'darwin' ? (
{platformName === 'macos' ? (
<>
<kbd className={kbdClasses}>K</kbd>
</>

View File

@ -20,7 +20,7 @@ import { useNavigate } from 'react-router-dom'
import { paths } from 'lib/paths'
import { useEffect } from 'react'
import { kclManager } from 'lib/singletons'
import { sep } from '@tauri-apps/api/path'
import { join, sep } from '@tauri-apps/api/path'
import { APP_NAME } from 'lib/constants'
function OnboardingWithNewFile() {
@ -44,12 +44,12 @@ function OnboardingWithNewFile() {
nextIndex
)
const newFile = await createNewProject(
defaultDirectory + sep + name,
await join(defaultDirectory, name),
bracket
)
navigate(
`${paths.FILE}/${encodeURIComponent(
newFile.path + sep + PROJECT_ENTRYPOINT
await join(newFile.path, PROJECT_ENTRYPOINT)
)}${paths.ONBOARDING.INDEX}`
)
}

View File

@ -1,7 +1,7 @@
import { faArrowRotateBack, faXmark } from '@fortawesome/free-solid-svg-icons'
import { ActionButton } from '../components/ActionButton'
import { AppHeader } from '../components/AppHeader'
import { open } from '@tauri-apps/api/dialog'
import { open } from '@tauri-apps/plugin-dialog'
import { DEFAULT_PROJECT_NAME, SETTINGS_PERSIST_KEY } from 'lib/constants'
import {
type BaseUnit,
@ -31,11 +31,11 @@ import {
} from 'lib/tauriFS'
import { initialSettings } from 'lib/settings/initialSettings'
import { ONBOARDING_PROJECT_NAME } from './Onboarding'
import { sep } from '@tauri-apps/api/path'
import { join } from '@tauri-apps/api/path'
import { bracket } from 'lib/exampleKcl'
import { isTauri } from 'lib/isTauri'
import { invoke } from '@tauri-apps/api'
import toast from 'react-hot-toast'
import { invoke } from '@tauri-apps/api/core'
export const Settings = () => {
const APP_VERSION = import.meta.env.PACKAGE_VERSION || 'unknown'
@ -105,7 +105,7 @@ export const Settings = () => {
nextIndex
)
const newFile = await createNewProject(
defaultDirectory + sep + name,
await join(defaultDirectory, name),
bracket
)
navigate(`${paths.FILE}/${encodeURIComponent(newFile.path)}`)
@ -179,7 +179,7 @@ export const Settings = () => {
</li>
</ul>
</SettingsSection>
{(window as any).__TAURI__ && (
{isTauri() && (
<>
<SettingsSection
title="Default Directory"

View File

@ -1,6 +1,6 @@
import { ActionButton } from '../components/ActionButton'
import { isTauri } from '../lib/isTauri'
import { invoke } from '@tauri-apps/api/tauri'
import { invoke } from '@tauri-apps/api/core'
import { VITE_KC_SITE_BASE_URL, VITE_KC_API_BASE_URL } from '../env'
import { Themes, getSystemTheme } from '../lib/theme'
import { paths } from 'lib/paths'

233
yarn.lock
View File

@ -2031,6 +2031,88 @@
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz#31b9c510d8cada9683549e1dbb4284cca5001faf"
integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==
"@sentry-internal/feedback@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.104.0.tgz#a2abcfcba3ecd2e6798078bc54841c0146e72b85"
integrity sha512-+OWqm+X9ZfEQQmxVoZsc9lpzd85pabAT+bEj57StRMTnfdRbD9TippS20nCD9N2Ql5v2/41NfiPONMejGbnOwg==
dependencies:
"@sentry/core" "7.104.0"
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
"@sentry-internal/replay-canvas@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.104.0.tgz#08fa83c150a1e512f138013fc293bf63955ac1a1"
integrity sha512-gfdnkFIpxAveKNghkvRCqv+hSiBkxYVoyFZLTvUPuM9Cmvmket1/PpnuWMC2jNtCEewG3gxkPDd4EaT9oa1HZQ==
dependencies:
"@sentry/core" "7.104.0"
"@sentry/replay" "7.104.0"
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
"@sentry-internal/tracing@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.104.0.tgz#f5ec0194b7954a92c8e53247bb9b7183bec79abf"
integrity sha512-2z7OijM1J5ndJUiJJElC3iH9qb/Eb8eYm2v8oJhM8WVdc5uCKfrQuYHNgGOnmY2FOCfEUlTmMQGpDw7DJ67L5w==
dependencies:
"@sentry/core" "7.104.0"
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
"@sentry/browser@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.104.0.tgz#8d67bd90645099ad9ed4620df166cfbe6dd53e91"
integrity sha512-HsqO+mr1SowGoP0VbuWrQ2DZT0t5PLomy7LEYa6+4lbOemnY+5YV2NSwBTKbjYysvKipSwaRtPhXrsXsMaz8Bg==
dependencies:
"@sentry-internal/feedback" "7.104.0"
"@sentry-internal/replay-canvas" "7.104.0"
"@sentry-internal/tracing" "7.104.0"
"@sentry/core" "7.104.0"
"@sentry/replay" "7.104.0"
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
"@sentry/core@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.104.0.tgz#2c6ce6eb6a84b8015bffb25e906407ec1d81a224"
integrity sha512-XPndD6IGQGd07/EntvYVzOWQUo/Gd7L3DwYFeEKeBv6ByWjbBNmVZFRhU0GPPsCHKyW9yMU9OO9diLSS4ijsRg==
dependencies:
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
"@sentry/react@^7.77.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.104.0.tgz#cb5370eb0bb2b65b1a4665fe11d9e160a66f648d"
integrity sha512-JdPzX/rJ4sSr/pVFOKwVrUhr8McCn38w5Q+/wdCabO8fdUkoBe4P05LRCH4Rng0uOk8MeEQ+EvfMVB79DmxIgQ==
dependencies:
"@sentry/browser" "7.104.0"
"@sentry/core" "7.104.0"
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
hoist-non-react-statics "^3.3.2"
"@sentry/replay@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.104.0.tgz#de570a5a8cc59671b0e56944d6978809d896f07f"
integrity sha512-HmWBr/u+SNeULxCxM8lJb2iqhjizeLGJtuKSShPEguEXIUT4kzdoqLh6wn7BAjiKzhmyjrnBcosR5LUqJtGYZQ==
dependencies:
"@sentry-internal/tracing" "7.104.0"
"@sentry/core" "7.104.0"
"@sentry/types" "7.104.0"
"@sentry/utils" "7.104.0"
"@sentry/types@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.104.0.tgz#f4458ede188b422827de71e605e7c1faf940103e"
integrity sha512-5bs0xe0+GZR4QBm9Nrqw59o0sv3kBtCosrZDVxBru/dQbrfnB+/kVorvuM0rV3+coNITTKcKDegSZmK1d2uOGQ==
"@sentry/utils@7.104.0":
version "7.104.0"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.104.0.tgz#2dec1a3cf2c0bc17e1c14cffab056d5bff15f197"
integrity sha512-ZVg+xZirI9DlOi0NegNVocswdh/8p6QkzlQzDQY2LP2CC6JQdmwi64o0S4rPH4YIHNKQJTpIjduoxeKgd1EO5g==
dependencies:
"@sentry/types" "7.104.0"
"@sideway/address@^4.1.3":
version "4.1.4"
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
@ -2077,76 +2159,102 @@
resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz#874d36135e4badce2719e7bdc556ce240cbaff14"
integrity sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ==
"@tauri-apps/api@1.5.3", "@tauri-apps/api@^1.5.3":
version "1.5.3"
resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.5.3.tgz#f7b362b1f30aadb0a8bbeb7ae111755c0ed33d73"
integrity sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==
"@tauri-apps/api@2.0.0-beta.4":
version "2.0.0-beta.4"
resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.0.0-beta.4.tgz#7688950f6e03f38b3bac73585f8f4cdd61be6aa6"
integrity sha512-Nxtj28NYUo5iwYkpYslxmOPkdI2WkELU2e3UH9nbJm9Ydki2CQwJVGQxx4EANtdZcMNsEsUzRqaDTvEUYH1l6w==
"@tauri-apps/cli-darwin-arm64@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.11.tgz#a831f98f685148e46e8050dbdddbf4bcdda9ddc6"
integrity sha512-2NLSglDb5VfvTbMtmOKWyD+oaL/e8Z/ZZGovHtUFyUSFRabdXc6cZOlcD1BhFvYkHqm+TqGaz5qtPR5UbqDs8A==
"@tauri-apps/api@^2.0.0-beta.6":
version "2.0.0-beta.6"
resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.0.0-beta.6.tgz#7ff0092b868db3627ccfe78b2648bdc67a9ca3e9"
integrity sha512-ay3kAXYQoqC3rX4Vr3y6uGwrBhRPM7UQqZ9wr1VYzN6lkcMIcu7+UBvytmcfXDlVctqFoMQJafn6+dK/Oqh8+Q==
"@tauri-apps/cli-darwin-x64@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.11.tgz#0afae17fe1e84b9699a6b9824cd83b60c6ebfa59"
integrity sha512-/RQllHiJRH2fJOCudtZlaUIjofkHzP3zZgxi71ZUm7Fy80smU5TDfwpwOvB0wSVh0g/ciDjMArCSTo0MRvL+ag==
"@tauri-apps/cli-darwin-arm64@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0-beta.11.tgz#79b7038215b3c3a4d49d691bf0b23f335189f3dd"
integrity sha512-gry05NbWnTSDVJjlHb0JOh/QikG+c/O8/QSolz0scO4i+Y0ke5QhpmtXCQVS9REoxX2ncei0/MpqL7tZHaPSyw==
"@tauri-apps/cli-linux-arm-gnueabihf@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.11.tgz#c46166d7f6c1022105a13d530b1d1336f628981f"
integrity sha512-IlBuBPKmMm+a5LLUEK6a21UGr9ZYd6zKuKLq6IGM4tVweQa8Sf2kP2Nqs74dMGIUrLmMs0vuqdURpykQg+z4NQ==
"@tauri-apps/cli-darwin-x64@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.0.0-beta.11.tgz#dcef7c3f26c05033b2c7e76732df2062d75a0271"
integrity sha512-3nQTiLAeJBjPHTobVpF+dDxtqrK5Euzaj2ZdOcs5wZLOFzKcV3HXPwBO7n40ACL71g7RREzuvCx92yGC/txdfw==
"@tauri-apps/cli-linux-arm64-gnu@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.11.tgz#fd5c539a03371e0ab6cd00563dced1610ceb8943"
integrity sha512-w+k1bNHCU/GbmXshtAhyTwqosThUDmCEFLU4Zkin1vl2fuAtQry2RN7thfcJFepblUGL/J7yh3Q/0+BCjtspKQ==
"@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.0.0-beta.11.tgz#f1b936d988899e3cbd4cf91fe770e151d539ac89"
integrity sha512-Ucbr/ErIRfk5GDUb4hQVic/0ss+5KO1wLq3Dp6QR/h/ms4kS3ihMJiIFCIzGhsavNhPRDk2dDi35M9BNgiUW0Q==
"@tauri-apps/cli-linux-arm64-musl@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.11.tgz#bf7f940c3aca981d7c240857a86568d5b6e8310f"
integrity sha512-PN6/dl+OfYQ/qrAy4HRAfksJ2AyWQYn2IA/2Wwpaa7SDRz2+hzwTQkvajuvy0sQ5L2WCG7ymFYRYMbpC6Hk9Pg==
"@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.0.0-beta.11.tgz#a6491e7b8d53749cb6168a29a930f2926fd7d014"
integrity sha512-wSWu+paay91d6/FPb8tS/UOtyei0dX98edYVO0GXd4KePsvu9ZkzXr1HAOeY0UG+P0Z7SIrSw9TnDc2HnGyRmg==
"@tauri-apps/cli-linux-x64-gnu@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.11.tgz#17323105e3863a3f36d51771e642e489037ba59b"
integrity sha512-MTVXLi89Nj7Apcvjezw92m7ZqIDKT5SFKZtVPCg6RoLUBTzko/BQoXYIRWmdoz2pgkHDUHgO2OMJ8oKzzddXbw==
"@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0-beta.11.tgz#ab697c0f15bb030ffdca6f79f70cdbf1a2ab3bb1"
integrity sha512-9P4UDsYbriXcPhfeOd0e4xmjd2XN1nkxnJlRPBc9tlLEHnzuXnYGQ/sFtUII4CkSnqeU7qPm44txxWoV44/T4A==
"@tauri-apps/cli-linux-x64-musl@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.11.tgz#83e22026771ec8ab094922ab114a7385532aa16c"
integrity sha512-kwzAjqFpz7rvTs7WGZLy/a5nS5t15QKr3E9FG95MNF0exTl3d29YoAUAe1Mn0mOSrTJ9Z+vYYAcI/QdcsGBP+w==
"@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.0.0-beta.11.tgz#ba50d710a1f46f992e4e9eba20fdea8e5bdecfcc"
integrity sha512-gYH8ear0rCOIi4oSCxRLClDmGs3HwvH3fr0go0Hi5ang/xu8CbwjgaQVOWW1nEpY7uckhKt4vSmO5p6iFEY01w==
"@tauri-apps/cli-win32-arm64-msvc@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.11.tgz#817874d230fdb09e7211013006a9a22f66ace573"
integrity sha512-L+5NZ/rHrSUrMxjj6YpFYCXp6wHnq8c8SfDTBOX8dO8x+5283/vftb4vvuGIsLS4UwUFXFnLt3XQr44n84E67Q==
"@tauri-apps/cli-linux-x64-musl@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0-beta.11.tgz#f56a22a51596b4b141938073405a76dbd42097a4"
integrity sha512-bxLzF7SW7j8C/Qc5P8AR+rEtJWoHc00V9FZuT259tOo6LHJsSUUFCk4kA/Y7mt2/9SzVXNbo4qu0NngSQsYncg==
"@tauri-apps/cli-win32-ia32-msvc@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.11.tgz#dee1a00eb9e216415d9d6ab9386c35849613c560"
integrity sha512-oVlD9IVewrY0lZzTdb71kNXkjdgMqFq+ohb67YsJb4Rf7o8A9DTlFds1XLCe3joqLMm4M+gvBKD7YnGIdxQ9vA==
"@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.0.0-beta.11.tgz#68ab15ea754a605602f78cc9eba853a0d02987da"
integrity sha512-/o3jtkt0IT0aV074bmbUoCTa3eGj0OyZjnxs00MN5FkfvXvSXwA4FZroAdlme6linLm7vh+UtusorMRBXChG2A==
"@tauri-apps/cli-win32-x64-msvc@1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.11.tgz#c003ce00b36d056a8b08e0ecf4633c2bba00c497"
integrity sha512-1CexcqUFCis5ypUIMOKllxUBrna09McbftWENgvVXMfA+SP+yPDPAVb8fIvUcdTIwR/yHJwcIucmTB4anww4vg==
"@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.0.0-beta.11.tgz#9ab00aea0390c4a858f0c4eb4e5c2758814ea2cc"
integrity sha512-LQvFnrIrvmSXbbisWXjXXx2y7UtHcuH0PC6c8wgEFaFS3eYRvsnckICk+Rbn8Ulnyj6lPAiB0N7QhJxmtDzdaw==
"@tauri-apps/cli@^1.5.11":
version "1.5.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.5.11.tgz#02beb559b3b55836c90a1ba9121b3fc50e3760cd"
integrity sha512-B475D7phZrq5sZ3kDABH4g2mEoUIHtnIO+r4ZGAAfsjMbZCwXxR/jlMGTEL+VO3YzjpF7gQe38IzB4vLBbVppw==
"@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.0.0-beta.11.tgz#1622f0fbb6710af73bdfccda7d3e472923cbf198"
integrity sha512-uJcQjR8tn44UlJXt+iGjIQLXp4ggug0KuwcYPXwD+ww3jV8RhHaPH2tPQ78ybgSJTIOsW41I9mE36Zcrso3oaQ==
"@tauri-apps/cli@^2.0.0-beta.11":
version "2.0.0-beta.11"
resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.0.0-beta.11.tgz#b9e6cf5bc0cc07dd5763eaf2f298dd6209155bb1"
integrity sha512-Q9mfn6v3XjnbNZpZl2IucU5F5EXW4i7vaN8Enm4kybIBk0tBqXbbc9p71CFJohe2lyvI0twHy7CcfhHNZnGrDw==
optionalDependencies:
"@tauri-apps/cli-darwin-arm64" "1.5.11"
"@tauri-apps/cli-darwin-x64" "1.5.11"
"@tauri-apps/cli-linux-arm-gnueabihf" "1.5.11"
"@tauri-apps/cli-linux-arm64-gnu" "1.5.11"
"@tauri-apps/cli-linux-arm64-musl" "1.5.11"
"@tauri-apps/cli-linux-x64-gnu" "1.5.11"
"@tauri-apps/cli-linux-x64-musl" "1.5.11"
"@tauri-apps/cli-win32-arm64-msvc" "1.5.11"
"@tauri-apps/cli-win32-ia32-msvc" "1.5.11"
"@tauri-apps/cli-win32-x64-msvc" "1.5.11"
"@tauri-apps/cli-darwin-arm64" "2.0.0-beta.11"
"@tauri-apps/cli-darwin-x64" "2.0.0-beta.11"
"@tauri-apps/cli-linux-arm-gnueabihf" "2.0.0-beta.11"
"@tauri-apps/cli-linux-arm64-gnu" "2.0.0-beta.11"
"@tauri-apps/cli-linux-arm64-musl" "2.0.0-beta.11"
"@tauri-apps/cli-linux-x64-gnu" "2.0.0-beta.11"
"@tauri-apps/cli-linux-x64-musl" "2.0.0-beta.11"
"@tauri-apps/cli-win32-arm64-msvc" "2.0.0-beta.11"
"@tauri-apps/cli-win32-ia32-msvc" "2.0.0-beta.11"
"@tauri-apps/cli-win32-x64-msvc" "2.0.0-beta.11"
"@tauri-apps/plugin-dialog@^2.0.0-beta.2":
version "2.0.0-beta.2"
resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-dialog/-/plugin-dialog-2.0.0-beta.2.tgz#64028104c51f018acfce96221a41f6389b9707b5"
integrity sha512-WugTn/8d5jYA0GL1JRIJgA1OSxG0h2V4PSZZzehgA3v7rPlIU6w9s2+dSRqj55aMj6hm3Az9YbQqC18nuaHkpw==
dependencies:
"@tauri-apps/api" "2.0.0-beta.4"
"@tauri-apps/plugin-fs@^2.0.0-beta.2":
version "2.0.0-beta.2"
resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-fs/-/plugin-fs-2.0.0-beta.2.tgz#b2dfcd72422f778e4c32edcfad24c1e96299c760"
integrity sha512-jqeRBrm0h9QUoep5OzHx5R0vgFCYVAmZIy45jJpR7hHvnEgUwDU8JLUUVPvWniq6tUtxjwr1V/a0Hm9pE9V+NQ==
dependencies:
"@tauri-apps/api" "2.0.0-beta.4"
"@tauri-apps/plugin-os@^2.0.0-beta.2":
version "2.0.0-beta.2"
resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-os/-/plugin-os-2.0.0-beta.2.tgz#e3490c7874a2c6e5a3e5dca3b61839d8960baf9b"
integrity sha512-rhJ/sEYvEAeMUQt6UiFODi5dT6F/ciNZYBQrbFTwhIqwQ2fp87dmzsscMy7FQ9LOor8AW+kL1KWoadfgzA/mSA==
dependencies:
"@tauri-apps/api" "2.0.0-beta.4"
"@testing-library/dom@^9.0.0":
version "9.3.3"
@ -5508,7 +5616,7 @@ he@1.2.0, he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hoist-non-react-statics@^3.3.0:
hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@ -8325,13 +8433,6 @@ tar@^6.1.11:
mkdirp "^1.0.3"
yallist "^4.0.0"
"tauri-plugin-fs-extra-api@https://github.com/tauri-apps/tauri-plugin-fs-extra#v1":
version "0.0.0"
uid b0a4a479cabb00bb7a689756f742ef89da4f2601
resolved "https://github.com/tauri-apps/tauri-plugin-fs-extra#b0a4a479cabb00bb7a689756f742ef89da4f2601"
dependencies:
"@tauri-apps/api" "1.5.3"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"