Fix vite build (tauri build still broken)
This commit is contained in:
		@ -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",
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										62
									
								
								src-tauri/capabilities/migrated.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src-tauri/capabilities/migrated.json
									
									
									
									
									
										Normal file
									
								
							@ -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"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@ -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"
 | 
			
		||||
}
 | 
			
		||||
@ -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,
 | 
			
		||||
          }))
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
          )
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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'
 | 
			
		||||
 | 
			
		||||
@ -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'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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.
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
import { FileEntry } from '@tauri-apps/api/fs'
 | 
			
		||||
import { FileEntry } from '@tauri-apps/plugin-fs'
 | 
			
		||||
import {
 | 
			
		||||
  MAX_PADDING,
 | 
			
		||||
  deepFileFilter,
 | 
			
		||||
 | 
			
		||||
@ -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<FileEntry>) {
 | 
			
		||||
export function isProjectDirectory(fileOrDir: Partial<any>) {
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
@ -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 =
 | 
			
		||||
 | 
			
		||||
@ -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'
 | 
			
		||||
 | 
			
		||||
@ -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<typeof homeMachine>,
 | 
			
		||||
        event: EventFrom<typeof homeMachine, 'Delete project'>
 | 
			
		||||
      ) => {
 | 
			
		||||
        await removeDir(context.defaultDirectory + sep + event.data.name, {
 | 
			
		||||
        await remove(context.defaultDirectory + sep() + event.data.name, {
 | 
			
		||||
          recursive: true,
 | 
			
		||||
        })
 | 
			
		||||
        return `Successfully deleted "${event.data.name}"`
 | 
			
		||||
 | 
			
		||||
@ -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}`
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -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)}`)
 | 
			
		||||
 | 
			
		||||
@ -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'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										137
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								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"
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user