diff --git a/package.json b/package.json index 9e3856cdb..145b727ef 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,10 @@ "@react-hook/resize-observer": "^1.2.6", "@replit/codemirror-interact": "^6.3.0", "@sentry/react": "^7.77.0", - "@tauri-apps/api": "^1.5.1", + "@tauri-apps/api": "^2.0.0-beta.0", + "@tauri-apps/plugin-dialog": "^2.0.0-beta.0", + "@tauri-apps/plugin-fs": "^2.0.0-beta.0", + "@tauri-apps/plugin-os": "^2.0.0-beta.0", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.5.1", @@ -106,7 +109,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.6", + "@tauri-apps/cli": "^2.0.0-beta.1", "@types/crypto-js": "^4.1.1", "@types/debounce-promise": "^3.1.8", "@types/isomorphic-fetch": "^0.0.36", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index add2b7d57..366155679 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -12,7 +12,7 @@ rust-version = "1.60" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.5.0", features = [] } +tauri-build = { version = "2.0.0-beta", features = [] } [dependencies] anyhow = "1" @@ -20,8 +20,8 @@ kittycad = "0.2.42" oauth2 = "4.4.2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -tauri = { version = "1.5.3", 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"] } +tauri-plugin-fs = "2" tokio = { version = "1.34.0", features = ["time"] } toml = "0.8.2" @@ -33,3 +33,6 @@ tauri-driver = "0.1.3" # If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. # DO NOT REMOVE!! custom-protocol = ["tauri/custom-protocol"] + +[lib] +crate-type = ["staticlib", "cdylib", "rlib"] diff --git a/src-tauri/capabilities/migrated.json b/src-tauri/capabilities/migrated.json new file mode 100644 index 000000000..73379ffee --- /dev/null +++ b/src-tauri/capabilities/migrated.json @@ -0,0 +1,62 @@ +{ + "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-read-file", + "fs:allow-write-file", + "fs:allow-read-dir", + "fs:allow-copy-file", + "fs:allow-mkdir", + "fs:allow-remove", + "fs:allow-remove", + "fs:allow-rename", + "fs:allow-exists", + { + "identifier": "fs:scope", + "allow": [ + "$HOME/**/*", + "$APPDATA/**/*" + ] + }, + "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://kittycad.io/*", + "https://api.dev.kittycad.io/*" + ] + }, + "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" + ] +} \ No newline at end of file diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index c2f521662..f84cdb1f5 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,84 +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.14.0" - }, - "tauri": { - "allowlist": { - "all": false, - "dialog": { - "all": true, - "ask": true, - "confirm": true, - "message": true, - "open": true, - "save": true - }, - "fs": { - "scope": [ - "$HOME/**/*", - "$APPDATA/**/*" - ], - "all": true - }, - "http": { - "request": true, - "scope": [ - "https://dev.kittycad.io/*", - "https://kittycad.io/*", - "https://api.dev.kittycad.io/*" - ] - }, - "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": "io.kittycad.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, @@ -88,5 +13,48 @@ "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": "io.kittycad.modeling-app", + "plugins": { + "shell": { + "open": true + }, + "updater": {} + }, + "productName": "zoo-modeling-app", + "version": "0.14.0" +} \ No newline at end of file diff --git a/src/Router.tsx b/src/Router.tsx index 633427681..225081253 100644 --- a/src/Router.tsx +++ b/src/Router.tsx @@ -22,7 +22,7 @@ import SignIn from './routes/SignIn' import { Auth } from './Auth' import { isTauri } from './lib/isTauri' import Home from './routes/Home' -import { FileEntry, readDir, readTextFile } from '@tauri-apps/api/fs' +import { FileEntry, readDir, readTextFile } from '@tauri-apps/plugin-fs' import makeUrlPathRelative from './lib/makeUrlPathRelative' import { initializeProjectDirectory, @@ -192,20 +192,20 @@ const router = createBrowserRouter( const projectAndFile = decodedId.replace(defaultDir + sep, '') const firstSlashIndex = projectAndFile.indexOf(sep) const projectName = projectAndFile.slice(0, firstSlashIndex) - const projectPath = defaultDir + sep + projectName + const projectPath = defaultDir + sep() + projectName const currentFileName = projectAndFile.slice(firstSlashIndex + 1) if (firstSlashIndex === -1 || !currentFileName) return redirect( `${paths.FILE}/${encodeURIComponent( - `${params.id}${sep}${PROJECT_ENTRYPOINT}` + `${params.id}${sep()}${PROJECT_ENTRYPOINT}` )}` ) // Note that PROJECT_ENTRYPOINT is hardcoded until we support multiple files const code = await readTextFile(decodedId) const entrypointMetadata = await metadata( - projectPath + sep + PROJECT_ENTRYPOINT + projectPath + sep() + PROJECT_ENTRYPOINT ) const children = await readDir(projectPath, { recursive: true }) kclManager.setCodeAndExecute(code, false) @@ -277,7 +277,7 @@ const router = createBrowserRouter( const projects = await Promise.all( projectsNoMeta.map(async (p: FileEntry) => ({ entrypointMetadata: await metadata( - p.path + sep + PROJECT_ENTRYPOINT + p.path + sep() + PROJECT_ENTRYPOINT ), ...p, })) diff --git a/src/components/FileMachineProvider.tsx b/src/components/FileMachineProvider.tsx index bdb48a21c..1c4473939 100644 --- a/src/components/FileMachineProvider.tsx +++ b/src/components/FileMachineProvider.tsx @@ -14,12 +14,11 @@ import { import { useCommandsContext } from 'hooks/useCommandsContext' import { DEFAULT_FILE_NAME, fileMachine } from 'machines/fileMachine' import { - createDir, - removeDir, - removeFile, - renameFile, + mkdir, + remove, + rename, writeFile, -} from '@tauri-apps/api/fs' +} from '@tauri-apps/plugin-fs' import { FILE_EXT, readProject } from 'lib/tauriFS' import { isTauri } from 'lib/isTauri' import { sep } from '@tauri-apps/api/path' @@ -57,7 +56,7 @@ export const FileMachineProvider = ({ commandBarSend({ type: 'Close' }) navigate( `${paths.FILE}/${encodeURIComponent( - context.selectedDirectory + sep + event.data.name + context.selectedDirectory + sep() + event.data.name )}` ) } @@ -83,11 +82,11 @@ 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(context.selectedDirectory.path + sep() + name) } else { await writeFile( context.selectedDirectory.path + - sep + + sep() + name + (name.endsWith(FILE_EXT) ? '' : FILE_EXT), '' @@ -103,13 +102,13 @@ export const FileMachineProvider = ({ const { oldName, newName, isDir } = event.data let name = newName ? newName : DEFAULT_FILE_NAME - await renameFile( - context.selectedDirectory.path + sep + oldName, + await rename( + context.selectedDirectory.path + sep() + oldName, context.selectedDirectory.path + - sep + + sep() + name + (name.endsWith(FILE_EXT) || isDir ? '' : FILE_EXT) - ) + , {}) return ( oldName !== name && `Successfully renamed "${oldName}" to "${name}"` ) @@ -121,11 +120,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) ) } diff --git a/src/components/FileTree.tsx b/src/components/FileTree.tsx index 80a1cd46d..2042e32f9 100644 --- a/src/components/FileTree.tsx +++ b/src/components/FileTree.tsx @@ -1,7 +1,7 @@ import { IndexLoaderData, paths } from 'Router' import { ActionButton } from './ActionButton' import Tooltip from './Tooltip' -import { FileEntry } from '@tauri-apps/api/fs' +import { FileEntry } from '@tauri-apps/plugin-fs' import { Dispatch, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' import { Dialog, Disclosure } from '@headlessui/react' diff --git a/src/hooks/usePlatform.ts b/src/hooks/usePlatform.ts index c3601d816..c4983d69a 100644 --- a/src/hooks/usePlatform.ts +++ b/src/hooks/usePlatform.ts @@ -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' diff --git a/src/lang/KclSinglton.tsx b/src/lang/KclSinglton.tsx index a229cbdd9..188501cd6 100644 --- a/src/lang/KclSinglton.tsx +++ b/src/lang/KclSinglton.tsx @@ -20,7 +20,7 @@ import { getNodeFromPath } from './queryAst' import { IndexLoaderData } from 'Router' import { Params, useLoaderData } 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' import { useParams } from 'react-router-dom' diff --git a/src/lib/exportSave.ts b/src/lib/exportSave.ts index 035c2a091..f9c0ac660 100644 --- a/src/lib/exportSave.ts +++ b/src/lib/exportSave.ts @@ -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' // Saves files locally from an export call. export async function exportSave(data: ArrayBuffer) { @@ -25,7 +25,7 @@ export async function exportSave(data: ArrayBuffer) { } // Write the file. - await writeBinaryFile(filePath, file.contents) + await writeFile(filePath, file.contents) } else { // Download the file to the user's computer. // Now we need to download the files to the user's downloads folder. diff --git a/src/lib/tauriFS.test.ts b/src/lib/tauriFS.test.ts index ca31a6369..c99dae84c 100644 --- a/src/lib/tauriFS.test.ts +++ b/src/lib/tauriFS.test.ts @@ -1,4 +1,4 @@ -import { FileEntry } from '@tauri-apps/api/fs' +import { FileEntry } from '@tauri-apps/plugin-fs' import { MAX_PADDING, deepFileFilter, diff --git a/src/lib/tauriFS.ts b/src/lib/tauriFS.ts index 85dda7133..3cb8fdb8c 100644 --- a/src/lib/tauriFS.ts +++ b/src/lib/tauriFS.ts @@ -1,10 +1,9 @@ import { - FileEntry, - createDir, + mkdir, exists, readDir, writeTextFile, -} from '@tauri-apps/api/fs' +} from '@tauri-apps/plugin-fs' import { documentDir, homeDir, sep } from '@tauri-apps/api/path' import { isTauri } from './isTauri' import { ProjectWithEntryPointMetadata } from '../Router' @@ -28,7 +27,7 @@ export async function initializeProjectDirectory(directory: string) { if (directory) { const dirExists = await exists(directory) if (!dirExists) { - await createDir(directory, { recursive: true }) + await mkdir(directory, { recursive: true }) } return directory } @@ -46,13 +45,13 @@ export async function initializeProjectDirectory(directory: string) { const defaultDirExists = await exists(INITIAL_DEFAULT_DIR) if (!defaultDirExists) { - await createDir(INITIAL_DEFAULT_DIR, { recursive: true }) + await mkdir(INITIAL_DEFAULT_DIR, { recursive: true }) } return INITIAL_DEFAULT_DIR } -export function isProjectDirectory(fileOrDir: Partial) { +export function isProjectDirectory(fileOrDir: Partial) { return ( fileOrDir.children?.length && fileOrDir.children.some((child) => child.name === PROJECT_ENTRYPOINT) @@ -70,7 +69,7 @@ export async function getProjectsInDir(projectDir: string) { const projectsWithMetadata = await Promise.all( readProjects.map(async (p) => ({ - entrypointMetadata: await metadata(p.path + sep + PROJECT_ENTRYPOINT), + entrypointMetadata: await metadata(p.path + sep() + PROJECT_ENTRYPOINT), ...p, })) ) @@ -78,17 +77,17 @@ export async function getProjectsInDir(projectDir: string) { return projectsWithMetadata } -export const isHidden = (fileOrDir: FileEntry) => +export const isHidden = (fileOrDir: any) => !!fileOrDir.name?.startsWith('.') -export const isDir = (fileOrDir: FileEntry) => +export const isDir = (fileOrDir: any) => 'children' in fileOrDir && fileOrDir.children !== undefined export function deepFileFilter( - entries: FileEntry[], - filterFn: (f: FileEntry) => boolean -): FileEntry[] { - const filteredEntries: FileEntry[] = [] + entries: any[], + filterFn: (f: any) => boolean +): any[] { + const filteredEntries: any[] = [] for (const fileOrDir of entries) { if ('children' in fileOrDir && fileOrDir.children !== undefined) { const filteredChildren = deepFileFilter(fileOrDir.children, filterFn) @@ -106,10 +105,10 @@ export function deepFileFilter( } export function deepFileFilterFlat( - entries: FileEntry[], - filterFn: (f: FileEntry) => boolean -): FileEntry[] { - const filteredEntries: FileEntry[] = [] + entries: any[], + filterFn: (f: any) => boolean +): any[] { + const filteredEntries: any[] = [] for (const fileOrDir of entries) { if ('children' in fileOrDir && fileOrDir.children !== undefined) { const filteredChildren = deepFileFilterFlat(fileOrDir.children, filterFn) @@ -140,7 +139,7 @@ export async function readProject(projectDir: string) { // Given a read project, return the number of .kcl files, // both in the root directory and in sub-directories, // and folders that contain at least one .kcl file -export function getPartsCount(project: FileEntry[]) { +export function getPartsCount(project: any[]) { const flatProject = deepFileFilterFlat(project, isRelevantFileOrDir) const kclFileCount = flatProject.filter((f) => @@ -158,7 +157,7 @@ export function getPartsCount(project: FileEntry[]) { // i.e. not a hidden file or directory, and is a relevant file type // or contains at least one relevant file (even if it's nested) // or is a completely empty directory -export function isRelevantFileOrDir(fileOrDir: FileEntry) { +export function isRelevantFileOrDir(fileOrDir: any) { let isRelevantDir = false if ('children' in fileOrDir && fileOrDir.children !== undefined) { isRelevantDir = @@ -178,7 +177,7 @@ export function isRelevantFileOrDir(fileOrDir: FileEntry) { // Deeply sort the files and directories in a project like VS Code does: // The main.kcl file is always first, then files, then directories // Files and directories are sorted alphabetically -export function sortProject(project: FileEntry[]): FileEntry[] { +export function sortProject(project: any[]): any[] { const sortedProject = project.sort((a, b) => { if (a.name === PROJECT_ENTRYPOINT) { return -1 @@ -195,7 +194,7 @@ export function sortProject(project: FileEntry[]): FileEntry[] { } }) - return sortedProject.map((fileOrDir: FileEntry) => { + return sortedProject.map((fileOrDir: any) => { if ('children' in fileOrDir && fileOrDir.children !== undefined) { return { ...fileOrDir, @@ -219,13 +218,13 @@ 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(path + sep() + PROJECT_ENTRYPOINT, initCode).catch( (err) => { console.error('Error creating new file:', err) throw err @@ -235,13 +234,13 @@ export async function createNewProject( const m = await metadata(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: path + sep() + PROJECT_ENTRYPOINT, children: [], }, ], @@ -258,7 +257,7 @@ function interpolateProjectName(projectName: string) { } // Returns the next available index for a project name -export function getNextProjectIndex(projectName: string, files: FileEntry[]) { +export function getNextProjectIndex(projectName: string, files: any[]) { const regex = interpolateProjectName(projectName) const matches = files.map((file) => file.name?.match(regex)) const indices = matches diff --git a/src/machines/authMachine.ts b/src/machines/authMachine.ts index 97b3a8627..427b1eb8a 100644 --- a/src/machines/authMachine.ts +++ b/src/machines/authMachine.ts @@ -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 = diff --git a/src/machines/fileMachine.ts b/src/machines/fileMachine.ts index c32201517..eecc2f496 100644 --- a/src/machines/fileMachine.ts +++ b/src/machines/fileMachine.ts @@ -1,6 +1,6 @@ import { assign, createMachine } from 'xstate' import { ProjectWithEntryPointMetadata } from 'Router' -import { FileEntry } from '@tauri-apps/api/fs' +import { FileEntry } from '@tauri-apps/plugin-fs' export const FILE_PERSIST_KEY = 'Last opened KCL files' export const DEFAULT_FILE_NAME = 'Untitled' diff --git a/src/routes/Home.tsx b/src/routes/Home.tsx index ddba514dd..aff8360ea 100644 --- a/src/routes/Home.tsx +++ b/src/routes/Home.tsx @@ -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, @@ -67,7 +67,7 @@ const Home = () => { commandBarSend({ type: 'Close' }) navigate( `${paths.FILE}/${encodeURIComponent( - context.defaultDirectory + sep + event.data.name + context.defaultDirectory + sep() + event.data.name )}` ) } @@ -100,7 +100,7 @@ const Home = () => { name = interpolateProjectNameWithIndex(name, nextIndex) } - await createNewProject(context.defaultDirectory + sep + name) + await createNewProject(context.defaultDirectory + sep() + name) if (shouldUpdateDefaultProjectName) { sendToSettings({ @@ -122,9 +122,10 @@ const Home = () => { name = interpolateProjectNameWithIndex(name, nextIndex) } - await renameFile( - context.defaultDirectory + sep + oldName, - context.defaultDirectory + sep + name + await rename( + context.defaultDirectory + sep() + oldName, + context.defaultDirectory + sep() + name, + {} ) return `Successfully renamed "${oldName}" to "${name}"` }, @@ -132,7 +133,7 @@ const Home = () => { context: ContextFrom, event: EventFrom ) => { - await removeDir(context.defaultDirectory + sep + event.data.name, { + await remove(context.defaultDirectory + sep() + event.data.name, { recursive: true, }) return `Successfully deleted "${event.data.name}"` diff --git a/src/routes/Onboarding/Introduction.tsx b/src/routes/Onboarding/Introduction.tsx index 33a60c450..dd9baf3f1 100644 --- a/src/routes/Onboarding/Introduction.tsx +++ b/src/routes/Onboarding/Introduction.tsx @@ -44,12 +44,12 @@ function OnboardingWithNewFile() { nextIndex ) const newFile = await createNewProject( - defaultDirectory + sep + name, + defaultDirectory + sep() + name, bracket ) navigate( `${paths.FILE}/${encodeURIComponent( - newFile.path + sep + PROJECT_ENTRYPOINT + newFile.path + sep() + PROJECT_ENTRYPOINT )}${paths.ONBOARDING.INDEX}` ) } diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 9f524858f..14a8809d0 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -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 { BaseUnit, DEFAULT_PROJECT_NAME, @@ -94,7 +94,7 @@ export const Settings = () => { nextIndex ) const newFile = await createNewProject( - defaultDirectory + sep + name, + defaultDirectory + sep() + name, bracket ) navigate(`${paths.FILE}/${encodeURIComponent(newFile.path)}`) diff --git a/src/routes/SignIn.tsx b/src/routes/SignIn.tsx index 2bc2baf4e..e37c34157 100644 --- a/src/routes/SignIn.tsx +++ b/src/routes/SignIn.tsx @@ -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 '../Router' diff --git a/yarn.lock b/yarn.lock index 1837bafa5..c3dc06731 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1951,76 +1951,97 @@ resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.4.0.tgz#b4013ca3d17b853f7df29fe14079ebb4d52dbffa" integrity sha512-Jd6HPoTM1PZSFIzq7FB8VmMu3qSSyo/3lSwLpoapW+lQ41CL5Dow2KryLg+gyazA/58DRWI9vu/XpEeHK4uMdw== -"@tauri-apps/api@^1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.5.1.tgz#9074476c4323f71351db624e9711c99277cdfb99" - integrity sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA== +"@tauri-apps/api@2.0.0-beta.0", "@tauri-apps/api@^2.0.0-beta.0": + version "2.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.0.0-beta.0.tgz#36b10e6f459fd125530ac083262a355b84ce9b95" + integrity sha512-WLoh/Vk8cgY7XrJV7Vpb6PssReBZWQCATfYBb1aCRDk+sp0NyPwumx6fZ2ECAKzAcs3OeanluwZcajruIW4CPQ== -"@tauri-apps/cli-darwin-arm64@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.6.tgz#0d68eaf6fa1b35197a9d4991ac5377e6085a569a" - integrity sha512-NNvG3XLtciCMsBahbDNUEvq184VZmOveTGOuy0So2R33b/6FDkuWaSgWZsR1mISpOuP034htQYW0VITCLelfqg== +"@tauri-apps/cli-darwin-arm64@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0-beta.1.tgz#ad90a2b82dc0b3f2e08b4bcff2d95797120fc9ea" + integrity sha512-d71utEr9H3fXAI6nKPaPuINpnvMQn+UIscOTzTMcrmIDqptOO0ix8z6C3HSvNxV0OjtlxzNJGWwOb24U0OYrgw== -"@tauri-apps/cli-darwin-x64@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.6.tgz#a48e1f66b12c33cf6c9c216865f2e9a3ff18a923" - integrity sha512-nkiqmtUQw3N1j4WoVjv81q6zWuZFhBLya/RNGUL94oafORloOZoSY0uTZJAoeieb3Y1YK0rCHSDl02MyV2Fi4A== +"@tauri-apps/cli-darwin-x64@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.0.0-beta.1.tgz#8212d9d2c0d4492f23e4562588c2b1113cb6cd50" + integrity sha512-bzsWZjQt5NG1uhbDTGw8Hmvm+J1d+9J7HXMMMwQc4E3kBns95sr4bIoXvgIq3cZYS4uyZOvdhEdjkSGg1c65Lg== -"@tauri-apps/cli-linux-arm-gnueabihf@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.6.tgz#385cd8054be7722cc07acc2d6d86f8e20c6265ef" - integrity sha512-z6SPx+axZexmWXTIVPNs4Tg7FtvdJl9EKxYN6JPjOmDZcqA13iyqWBQal2DA/GMZ1Xqo3vyJf6EoEaKaliymPQ== +"@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.0.0-beta.1.tgz#9713c073b473a9dee8c4b4951e5aa6e0e87febf5" + integrity sha512-FMnZpk4a5D9QgZKkT00P3f4CHEZFpn/b+pWfZJ7vxCdir+Cc1eKOHiqhvmMBEeLlYlQFBaYeAK0EaZWnN82ZJA== -"@tauri-apps/cli-linux-arm64-gnu@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.6.tgz#bd3f8f61637a1073909cb2d663aa0c6e8e036337" - integrity sha512-QuQjMQmpsCbzBrmtQiG4uhnfAbdFx3nzm+9LtqjuZlurc12+Mj5MTgqQ3AOwQedH3f7C+KlvbqD2AdXpwTg7VA== +"@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.0.0-beta.1.tgz#81d83894c3d08c52698da700f127d9d35dc2128a" + integrity sha512-0kE65P+6ppeAOFsJV6av5VhkjDv1dcHkObErpjJHpwYowuC3aqaCCnH3biR9gNvcoVUXsCwmMA/BkxUpq9W9/g== -"@tauri-apps/cli-linux-arm64-musl@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.6.tgz#77fb4a804b77447bffba725a4b8b62df45f9ff97" - integrity sha512-8j5dH3odweFeom7bRGlfzDApWVOT4jIq8/214Wl+JeiNVehouIBo9lZGeghZBH3XKFRwEvU23i7sRVjuh2s8mg== +"@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0-beta.1.tgz#5239d2dc67e1dafac6a9deb64054028e099957e7" + integrity sha512-Wsj1eSrrAVeuFQWJq1gVIA78I8JM50fEsxbrMAOf89ZXpCYxJTNCJkyRQyLB+yHhv9nmhA3a1Mmr5ubhRETy1Q== -"@tauri-apps/cli-linux-x64-gnu@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.6.tgz#e70a6c9dd243c2a3fa1fec69de9ebc9abf4dc795" - integrity sha512-gbFHYHfdEGW0ffk8SigDsoXks6USpilF6wR0nqB/JbWzbzFR/sBuLVNQlJl1RKNakyJHu+lsFxGy0fcTdoX8xA== +"@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.0.0-beta.1.tgz#639c801e431816f1548c5a6a0e63b8449cc80db4" + integrity sha512-LkzLJWg+ud2gWuq8yAWJ3Sahrp79Vbd2Cotbm/RbfMi7RbRV8TQYj4zfUhyFJVnk4nF89kTnwfNxLdTw67CAOw== -"@tauri-apps/cli-linux-x64-musl@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.6.tgz#f25dad778b2da6ab7b2b81f81c0805026d742c33" - integrity sha512-9v688ogoLkeFYQNgqiSErfhTreLUd8B3prIBSYUt+x4+5Kcw91zWvIh+VSxL1n3KCGGsM7cuXhkGPaxwlEh1ug== +"@tauri-apps/cli-linux-x64-musl@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0-beta.1.tgz#d0e07f10ab9de95d117acce1d9787eb6a625013a" + integrity sha512-Ro3PuLSNEZAw9/Rc2CP3k9P7LaUQ2TOFXJeW6G4aCXrd0MlJwlGhhjdZuLbmgzD1rda4dSpZGJPhbYvu8YD7eQ== -"@tauri-apps/cli-win32-arm64-msvc@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.6.tgz#47d0f359e04d93c1fd0b527e18a56606f3df9bed" - integrity sha512-DRNDXFNZb6y5IZrw+lhTTA9l4wbzO4TNRBAlHAiXUrH+pRFZ/ZJtv5WEuAj9ocVSahVw2NaK5Yaold4NPAxHog== +"@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.0.0-beta.1.tgz#9b7e964413031cab6bc938468983e4bb80b44d38" + integrity sha512-SWNF+5B+lBbW/Kq1wTMVG9x97PqJUOo8eWAr/nlMm3J0lYbTWAa8/ScibaPjq82HiPhv8WCJXlcO6FEqWCoJ2A== -"@tauri-apps/cli-win32-ia32-msvc@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.6.tgz#54c7ec152065e8167068411b82748a25a483d948" - integrity sha512-oUYKNR/IZjF4fsOzRpw0xesl2lOjhsQEyWlgbpT25T83EU113Xgck9UjtI7xemNI/OPCv1tPiaM1e7/ABdg5iA== +"@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.0.0-beta.1.tgz#7c390f30135e9c26b6685296bb7890447a92a5f7" + integrity sha512-NvfP16fSlfq6GLHJH+gAxEsJn+Jvz3HoxMTLxAg7Ra0ycMODFu4xbNn6Hp7Djn297qTHHLYDva4Np6Whw5DUlQ== -"@tauri-apps/cli-win32-x64-msvc@1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.6.tgz#963280a4f7001c27d4e4745f302728297c007deb" - integrity sha512-RmEf1os9C8//uq2hbjXi7Vgz9ne7798ZxqemAZdUwo1pv3oLVZSz1/IvZmUHPdy2e6zSeySqWu1D0Y3QRNN+dg== +"@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.0.0-beta.1.tgz#a82890bcd8b15feded016a2bfa51a1d199dc17f5" + integrity sha512-9TKbDQyVHW0p1a7aXQEKg+MhCyFMpzD26puLKOxbTPiTcRUR4lUFq5Bhf1VR5ihoqnZNhJEtuR1mA16ZrIkuKQ== -"@tauri-apps/cli@^1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.5.6.tgz#5011c9dd3a36dc89073fed7d4cb429d38b37862b" - integrity sha512-k4Y19oVCnt7WZb2TnDzLqfs7o98Jq0tUoVMv+JQSzuRDJqaVu2xMBZ8dYplEn+EccdR5SOMyzaLBJWu38TVK1A== +"@tauri-apps/cli@^2.0.0-beta.1": + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.0.0-beta.1.tgz#d9e42dd2d2f9319dffcceacb82d18e19b4acf840" + integrity sha512-u3AcZPdHsg9qT3e9PSD0H2IVZetQvWuBOyF81CN7/sY+AJGOli7i2d38Bj4wJs50tuMotoseiMcxuyxTlAdBnw== optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "1.5.6" - "@tauri-apps/cli-darwin-x64" "1.5.6" - "@tauri-apps/cli-linux-arm-gnueabihf" "1.5.6" - "@tauri-apps/cli-linux-arm64-gnu" "1.5.6" - "@tauri-apps/cli-linux-arm64-musl" "1.5.6" - "@tauri-apps/cli-linux-x64-gnu" "1.5.6" - "@tauri-apps/cli-linux-x64-musl" "1.5.6" - "@tauri-apps/cli-win32-arm64-msvc" "1.5.6" - "@tauri-apps/cli-win32-ia32-msvc" "1.5.6" - "@tauri-apps/cli-win32-x64-msvc" "1.5.6" + "@tauri-apps/cli-darwin-arm64" "2.0.0-beta.1" + "@tauri-apps/cli-darwin-x64" "2.0.0-beta.1" + "@tauri-apps/cli-linux-arm-gnueabihf" "2.0.0-beta.1" + "@tauri-apps/cli-linux-arm64-gnu" "2.0.0-beta.1" + "@tauri-apps/cli-linux-arm64-musl" "2.0.0-beta.1" + "@tauri-apps/cli-linux-x64-gnu" "2.0.0-beta.1" + "@tauri-apps/cli-linux-x64-musl" "2.0.0-beta.1" + "@tauri-apps/cli-win32-arm64-msvc" "2.0.0-beta.1" + "@tauri-apps/cli-win32-ia32-msvc" "2.0.0-beta.1" + "@tauri-apps/cli-win32-x64-msvc" "2.0.0-beta.1" + +"@tauri-apps/plugin-dialog@^2.0.0-beta.0": + version "2.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-dialog/-/plugin-dialog-2.0.0-beta.0.tgz#07ba51779342300228f1a5eb946306f5069a4f00" + integrity sha512-cNxiBwGB6Xgnwy5GyAabwPyvm1iaC7MmrgzcUwB1JaydLjp/Yu3Z0TmkmmEClFrrvIQA+sMcq0C8wwv6i4aedw== + dependencies: + "@tauri-apps/api" "2.0.0-beta.0" + +"@tauri-apps/plugin-fs@^2.0.0-beta.0": + version "2.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-fs/-/plugin-fs-2.0.0-beta.0.tgz#bab917941a8197af3f25a18f38595c39e9cdfe85" + integrity sha512-oFAA8T5wyg5dmsF/WmjjtUMEnJtzu+p2ElsK2FdwLVSB2AdAdud5izZhd1o63HFjR6waiIYebSI+llzJG7b5MQ== + dependencies: + "@tauri-apps/api" "2.0.0-beta.0" + +"@tauri-apps/plugin-os@^2.0.0-beta.0": + version "2.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-os/-/plugin-os-2.0.0-beta.0.tgz#1745e26b327420d08f21ecf0b1c300170b18965f" + integrity sha512-2a6yxfKS3RxPCAn6jIfbUJN0lVo8skth5kInnvmaE4IVmy7bNSRDtpYzKWMq4JzU48Ra3IEB4YJjYQx71+IIHA== + dependencies: + "@tauri-apps/api" "2.0.0-beta.0" "@testing-library/dom@^9.0.0": version "9.3.3"