瀏覽代碼

调整sql

john 1 年之前
父節點
當前提交
8d8fa881e9

+ 5 - 1
README.md

@@ -40,4 +40,8 @@ This template should help get you started developing with Tauri, React and Types
 
 sqlite3 版本表结构迁移
 https://blog.csdn.net/cdc8596/article/details/94732238
-/Users/sysadmin/.system_tools/sqlite
+/Users/sysadmin/.system_tools/sqlite
+
+https://crates.io/search?q=sqlite
+
+https://github.com/launchbadge/sqlx

+ 1 - 1
src-tauri/src/common/mod.rs

@@ -1 +1 @@
-pub mod sqlite;
+// pub mod sqlite;

+ 1 - 1
src-tauri/src/common/sqlite/migration/database_version.rs

@@ -107,7 +107,7 @@ pub struct NormalDdlDatabaseVersionSql {
 
 impl NormalDdlDatabaseVersionSql {
     // 创建一个新实例
-    pub fn new(version: u32, ddl: Vec<String>) -> Self {
+    fn new(version: u32, ddl: Vec<String>) -> Self {
         Self { version, ddl }
     }
 }

+ 4 - 4
src-tauri/src/common/sqlite/mod.rs

@@ -14,12 +14,12 @@ lazy_static::lazy_static! {
 }
 
 // 打开数据库连接
-pub async fn open(path: &String) -> Result<Arc<Mutex<Connection>>> {
+pub async fn open(path: &str) -> Result<Arc<Mutex<Connection>>> {
     open_with_flags(path, OpenFlags::default()).await
 }
 
 // 打开带有标志的数据库连接
-pub async fn open_with_flags(path: &String, flags: OpenFlags) -> Result<Arc<Mutex<Connection>>> {
+pub async fn open_with_flags(path: &str, flags: OpenFlags) -> Result<Arc<Mutex<Connection>>> {
     // 判断是否已经打开
     let exist = CONNECTIONS.read().unwrap().contains_key(path);
 
@@ -32,7 +32,7 @@ pub async fn open_with_flags(path: &String, flags: OpenFlags) -> Result<Arc<Mute
     } else {
         // 构造数据库路径
         let mut storage_path = crate::utils::system_tools_home_path()?.join("sqlite");
-        storage_path.push(path.clone());
+        storage_path.push(path.to_string());
 
         let prefix = storage_path.parent().unwrap_or(storage_path.as_path());
         std::fs::create_dir_all(prefix).map_err(|err| anyhow::anyhow!(err))?;
@@ -45,7 +45,7 @@ pub async fn open_with_flags(path: &String, flags: OpenFlags) -> Result<Arc<Mute
 
         // 将连接缓存
         let mut cache = CONNECTIONS.write().unwrap();
-        cache.insert(path.clone(), arc_conn.clone());
+        cache.insert(path.parse()?, arc_conn.clone());
 
         Ok(arc_conn)
     }

+ 1 - 1
src-tauri/src/common/sqlite/rusqlite_utils.rs

@@ -44,7 +44,7 @@ pub fn rusqlite_row_to_value(row: &Row<'_>, cnt: usize) -> Result<Vec<Value>> {
             Integer(i64_v) => Value::Number(Number::from(i64_v)), // 整数
             Real(f64_v) => Value::Number(Number::from_f64(f64_v).map_or(Number::from(0i64), |r| r)), // 浮点数
             Text(str_v) => Value::String(String::from_utf8(str_v.to_vec()).unwrap()), // 文本
-            Blob(v) => Value::Null, // 二进制数据(这里处理为 Null)
+            Blob(_v) => Value::Null, // 二进制数据(这里处理为 Null)
         };
         cols.push(idns_value); // 将转换后的值添加到列集合中
     }

+ 3 - 3
src-tauri/src/event_loop.rs

@@ -17,7 +17,7 @@ pub fn file_path(name: &str, parentid: &str) -> String {
     use std::path::Path;
     use std::time::SystemTime;
     // 生成 UUID
-    let uuid = Uuid::new_v4();
+    let _uuid = Uuid::new_v4();
 
     // let err = is_create("files");
     // println!("2424  {}", err);
@@ -28,7 +28,7 @@ pub fn file_path(name: &str, parentid: &str) -> String {
     // }
 
     let system_time = SystemTime::now();
-    let timestamp = system_time
+    let _timestamp = system_time
         .duration_since(SystemTime::UNIX_EPOCH)
         .expect("Failed to get timestamp");
 
@@ -144,7 +144,7 @@ pub fn file_sort(path: &str)  {
     
 
     // use strsim::{jaccard};
-    let hash_info = get_file_hase(&path);
+    let _hash_info = get_file_hase(&path);
     // let mut file1 = match fs::File::open("/Users/sysadmin/Downloads/文件相似度对比_old.pdf") {
     //     Ok(f) => f,
     //     Err(e) => panic!("{}", e),

+ 3 - 36
src-tauri/src/main.rs

@@ -13,7 +13,7 @@ mod servics;
 use crate::menus::default::use_memu;
 use crate::menus::event::m_event;
 use crate::event_loop::{greet, file_path, file_sort};
-use self_plugin::tauri_plugin_sqlite;
+// use self_plugin::tauri_plugin_sqlite;
 use self_plugin::tauri_plugin_file;
 use servics::files_servics;
 
@@ -25,46 +25,13 @@ use tauri::api::path::app_data_dir;
 use tauri_plugin_sql::{Migration, MigrationKind};
 
 fn main() {
-    let migrations = vec![
-        // Define your migrations here
-        Migration {
-            version: 1,
-            description: "create_initial_tables",
-            sql: "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);",
-            kind: MigrationKind::Up,
-        },
-        Migration {
-            version: 2,
-            description: "create_initial_tables",
-            sql: "ALTER TABLE 'users' ADD 'addType' TEXT;ALTER TABLE 'users' ADD 'userTime' TEXT;",
-            kind: MigrationKind::Up,
-        }
-        // Migration {
-        //     version: 3,
-        //     description: "create_initial_tables",
-        //     sql: "ALTER TABLE users DROP COLUMN userTime;",
-        //     kind: MigrationKind::Up,
-        // },
-        // Migration {
-        //     version: 4,
-        //     description: "create_initial_tables",
-        //     sql: "ALTER TABLE 'users' ADD 'addType' TEXT;",
-        //     kind: MigrationKind::Up,
-        // },
-        // Migration {
-        //     version: 5,
-        //     description: "create_initial_tables",
-        //     sql: "ALTER TABLE 'users' ADD 'addType2' TEXT;",
-        //     kind: MigrationKind::Up,
-        // }
-    ];
     tauri::Builder::default()
-        .plugin(tauri_plugin_sqlite::init())
+        // .plugin(tauri_plugin_sqlite::init())
         .plugin(tauri_plugin_file::init())
         .plugin(files_servics::init())
         .plugin(
             tauri_plugin_sql::Builder::default()
-            .add_migrations("sqlite:test.db", migrations)
+            .add_migrations("sqlite:files.db", files_servics::migrations::set_files_migrations())
         .build()
     )
 

+ 1 - 1
src-tauri/src/self_plugin/mod.rs

@@ -1,2 +1,2 @@
-pub mod tauri_plugin_sqlite;
+// pub mod tauri_plugin_sqlite;
 pub mod tauri_plugin_file;

+ 7 - 7
src-tauri/src/self_plugin/tauri_plugin_file/files.rs

@@ -87,13 +87,13 @@ pub fn get_all_directory(path: String) -> Result<Vec<PathBuf>> {
     Ok(files)
 }
 
-#[command]
-fn getFileType(file_path: String) -> Option<String> {
-    let path = Path::new(&file_path);
-    path.extension()
-        .and_then(|ext| ext.to_str())
-        .map(|ext| ext.to_lowercase())
-}
+// #[command]
+// fn getFileType(file_path: String) -> Option<String> {
+//     let path = Path::new(&file_path);
+//     path.extension()
+//         .and_then(|ext| ext.to_str())
+//         .map(|ext| ext.to_lowercase())
+// }
 
 #[command]
 pub fn get_file_type(file_path: &str) -> Option<&str> {

+ 1 - 1
src-tauri/src/self_plugin/tauri_plugin_file/mod.rs

@@ -12,7 +12,7 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
         .invoke_handler(tauri::generate_handler![
             get_all_directory,get_file_type_by_path,calculate_file_hash
         ])
-        .setup(|app| {
+        .setup(|_app| {
             // app.manage(SqliteMap::default());
             Ok(())
         })

+ 1 - 1
src-tauri/src/self_plugin/tauri_plugin_sqlite/mod.rs

@@ -19,7 +19,7 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
             execute_batch,
             execute
         ])
-        .setup(|app| {
+        .setup(|_app| {
             // app.manage(SqliteMap::default());
             Ok(())
         })

+ 0 - 58
src-tauri/src/servics/files_servics/file_sqlite3.rs

@@ -1,58 +0,0 @@
-
-
-
-
-use tauri_plugin_sql::plugin::*;
-
-pub mod file_sqlite3 {
-    // 判断是否新建表
-    pub fn is_create(table_name: &str) -> bool {
-        if table_name.len() < 1 {
-            return false;
-        }
-        let connection = load("sqlite::files.db").unwrap();
-        let query: String = format!(
-            "SELECT tbl_name FROM sqlite_master WHERE tbl_name = '{}'",
-            table_name
-        );
-        let mut is_table: bool = false;
-        connection
-            .iterate(query, |pairs| {
-                for &(_tpl_name, value) in pairs.iter() {
-                    if value.unwrap() == table_name {
-                        is_table = true
-                    }
-                }
-                true
-            })
-            .unwrap();
-        // is_table
-        if !is_table {
-            return create(table_name);
-        }
-        is_table
-    }
-
-    pub fn create(table_name: &str) -> bool {
-        println!("28");
-        if table_name.len() < 1 {
-            return false;
-        }
-        let connection = sqlite::open("tauri.db").unwrap();
-        // CREATE TABLE users (name TEXT, age INTEGER)
-        let query: String = format!("CREATE TABLE '{}' ( name TEXT, path TEXT, history_path TEXT, uuid TEXT, parent_id TEXT, create_time INTEGER, update_time INTEGER, file_type TEXT, user TEXT, rule TEXT );", table_name);
-        // let mut isTable: bool = false;
-        println!("36");
-        connection.execute(query).unwrap();
-        true
-    }
-
-    use crate::files::file_struct::File;
-    pub fn inset(file: File) -> bool {
-        // INSERT INTO files (name, path, history_path, uuid, parent_id, create_time, update_time, file_type, user, rule) VALUES ('1', '1', '2', '3', '4', 5, null, null, null, null)
-        let query: String = format!("INSERT INTO files (name, path, history_path, uuid, parent_id, create_time, update_time, file_type, user, rule) VALUES ('{}', '{}', '{}', '{}', '{}', '{:?}', '{:?}', '{}', '{}', '{}')", file.name, file.path, file.history_path,  file.uuid, file.parent_id, file.create_time, file.update_time, file.file_type, file.user, file.rule);
-        let connection = sqlite::open("tauri.db").unwrap();
-        connection.execute(query).unwrap();
-        true
-    }
-}

+ 0 - 31
src-tauri/src/servics/files_servics/file_struct.rs

@@ -1,31 +0,0 @@
-// pub mod FileStruct {
-//     pub struct Site {
-//         pub domain: String,
-//         pub nation: String,
-//     }
-// }
-
-use std::time::Duration;
-
-#[derive(Debug)]
-pub struct Site {
-    pub domain: String,
-    pub nation: String,
-}
-
-
-// name TEXT, path TEXT, history_path TEXT, uuid TEXT, parent_id TEXT, create_time INTEGER, update_time INTEGER, file_type TEXT, user TEXT, rule TEXT
-
-#[derive(Debug)]
-pub struct File {
-    pub name: String,
-    pub path: String,
-    pub history_path: String,
-    pub uuid: String,
-    pub parent_id: String,
-    pub create_time: Duration,
-    pub update_time: Duration,
-    pub file_type: String,
-    pub user: String,
-    pub rule: String,
-}

+ 0 - 9
src-tauri/src/servics/files_servics/file_tools.rs

@@ -1,9 +0,0 @@
-pub mod file_tools {
-    use crate::files::file_struct::Site;
-    pub fn get_base_path () -> Site {
-        Site {
-            domain: String::from("domain"),
-            nation: String::from("nation")
-        }
-    }
-}

+ 9 - 4
src-tauri/src/servics/files_servics/mod.rs

@@ -1,18 +1,23 @@
-pub(crate) mod file_sqlite3;
+pub(crate) mod files_servics;
 
+pub mod migrations; // 定义数据库迁移模块
 use tauri::{
     plugin::{Builder, TauriPlugin}, Runtime,
 };
 
-use self::file_sqlite3::*;
+
+use self::files_servics::*;
 
 /// Initializes the plugin.
 pub fn init<R: Runtime>() -> TauriPlugin<R> {
     Builder::new("ss-files")
         .invoke_handler(tauri::generate_handler![
-          is_create,create,inset
+            // is_create,
+            // create,
+            // inset,
+            test2
         ])
-        .setup(|app| {
+        .setup(|_app| {
             Ok(())
         })
         .build()

+ 0 - 8
src-tauri/src/servics/files_servics/modCopy

@@ -1,8 +0,0 @@
-pub mod file_struct;
-// pub use FileStruct;
-
-pub mod file_sqlite3;
-// pub use file_sqlite3::file_sqlite3;
-
-pub mod file_tools;
-// pub mod file_tools::file_tools;

+ 1 - 1
src/pages/DuplicateFile/DuplicateFile.module.less

@@ -2,7 +2,7 @@
   padding: 24px;
   box-sizing: border-box;
   width: 100%;
-  height: 60vh;
+  height: 80vh;
   overflow: hidden;
 
   // .searchBox {

+ 7 - 8
src/pages/DuplicateFile/DuplicateFile.tsx

@@ -26,6 +26,7 @@ import { DEFAULT_TIME_FORMAT } from "@/config";
 import Database from "tauri-plugin-sql-api";
 import { createSql } from "@/databases/createTableSql";
 const db = await Database.load("sqlite:test.db");
+const filesDB = await Database.load("sqlite:files.db");
 
 const { Search } = Input;
 const { TextArea } = Input;
@@ -58,10 +59,6 @@ export default function DuplicateFile() {
   const [isModalOpen, setIsModalOpen] = useState(false);
   const [fileInfo, setFileInfo] = useState<any>({});
   const [fileInfoSource, setFileInfoSource] = useState<FileInfoType>({});
-  const [current, setCurrent] = useState(1)
-  const [total, setTotal] = useState(0)
-
-
 
   const columns = [
     {
@@ -134,7 +131,7 @@ export default function DuplicateFile() {
 
   useEffect(() => {
     getFileList()
-  }, [])
+  }, [current])
 
   async function handleOk(newFileInfo: FileInfoType) {
     console.log(180, newFileInfo);
@@ -147,7 +144,7 @@ export default function DuplicateFile() {
   }
 
   async function openModal(info?: FileInfoType) {
-    initDB()
+    // initDB()
     // setIsModalOpen(true);
     // const res = await insertSeletedFileHistory('/Users/sysadmin/Downloads');
     // console.log(133, res);
@@ -183,7 +180,8 @@ Object Prototype
   }
 
   async function getFileList() {
-    const {data, total: localeTotal} = await get_all_history(current, total);
+    console.log(183, current, total);
+    const {data, total: localeTotal} = await get_all_history(current - 1, 10);
     console.log(173, data);
     const newFileList = data.map(item => {
       return {
@@ -192,13 +190,14 @@ Object Prototype
       }
     })
     setFileList(newFileList)
+    console.log(192, localeTotal);
     setTotal(localeTotal)
   }
 
 
   async function initDB() {
     try {
-      const result = await db.execute(createSql.search_files);
+      const result = await filesDB.execute(createSql.search_files);
       console.log(179, result);
     } catch (error) {
       console.log(182, error);

+ 3 - 0
src/plugins/tauri-plugin-file/file.ts

@@ -1,10 +1,13 @@
 import { invoke } from "@tauri-apps/api/tauri";
 
+import Database from "tauri-plugin-sql-api";
+
 export class File {
   path: string;
 
   constructor(path: string) {
     this.path = path;
+    this.db = await Database.load("sqlite:files.db");
   }
 
   static async getAllList(path: string): Promise<string[]> {

+ 22 - 13
src/services/file-service.ts

@@ -1,5 +1,6 @@
 import { table_init } from "@/databases/index";
-import { SQLite } from "@/plugins/tauri-plugin-sqlite";
+// import { SQLite } from "@/plugins/tauri-plugin-sqlite";
+import Database from "tauri-plugin-sql-api";
 import { FILE_DB_PATH } from "@/config";
 import { FileInfoType, historyListType, insertSearchFilesPasamsType } from "@/types/files";
 
@@ -20,8 +21,10 @@ export async function insertSeletedFileHistory(path?: string, fileInfoParams?: F
     path: "/Users/sysadmin/Downloads"
  */
   try {
-    await table_init(FILE_DB_PATH, "select_history");
-    const DB = await SQLite.open(FILE_DB_PATH);
+    // await table_init(FILE_DB_PATH, "select_history");
+
+    const DB = await Database.load("sqlite:files.db");
+    // const DB = await SQLite.open(FILE_DB_PATH);
     await DB.execute(
       `INSERT INTO select_history (time, name, path, addType, checkboxAll, checkboxSizeAll, checkedSizeValues, checkedTypeValues, passType) VALUES (:time, :name, :path, :addType, :checkboxAll, :checkboxSizeAll, :checkedSizeValues, :checkedTypeValues, :passType)`,
       {
@@ -52,8 +55,9 @@ export async function insertSeletedFileHistory(path?: string, fileInfoParams?: F
  */
 export async function get_info_by_path(path: string):Promise<[FileInfoType|boolean, string]>{
   try {
-    await table_init(FILE_DB_PATH, "select_history");
-    const DB = await SQLite.open(FILE_DB_PATH);
+    // await table_init(FILE_DB_PATH, "select_history");
+    // const DB = await SQLite.open(FILE_DB_PATH);
+    const DB = await Database.load("sqlite:files.db");
     const res = await DB.queryWithArgs<Array<FileInfoType>>(
       "SELECT * FROM select_history WHERE path = :path",
       { ":path": path }
@@ -116,19 +120,23 @@ export async function get_info_by_path(path: string):Promise<[FileInfoType|boole
 export async function get_all_history(page?: number, pageSize?: number): Promise<{
   [x: string]: any; data: insertSearchFilesPasamsType[], total: number 
 }> {
-  await table_init(FILE_DB_PATH, "select_history");
-  const DB = await SQLite.open(FILE_DB_PATH);
+  // await table_init(FILE_DB_PATH, "select_history");
+  const DB = await Database.load("sqlite:files.db");
+
   // 查询总记录数
-  const totalResult = await DB.queryWithArgs<Array<{ total: number }>>("SELECT COUNT(*) AS total FROM select_history");
+  const totalResult = await DB.select("SELECT COUNT(*) AS total FROM select_history");
+  console.log(128, totalResult);
+  // [Log] 128 – {lastInsertId: 0, rowsAffected: 0} (file-service.ts, line 51)
   const total = totalResult[0].total;  // 获取总记录数
   // 计算分页偏移量
   const offset = (page || 1 - 1) * (pageSize || 10);
 
   // 获取当前页的数据
-  const data = await DB.queryWithArgs<Array<FileInfoType>>(
+  const data = await DB.select(
     "SELECT * FROM select_history LIMIT ? OFFSET ?", [pageSize, offset]
   );
-
+  console.log(138, data, pageSize, offset)
+  DB.close()
   return { data, total };  // 返回包含数据和总记录数的对象
 }
 
@@ -136,9 +144,10 @@ export async function get_all_history(page?: number, pageSize?: number): Promise
 
 export async function get_list_by_sourceid(sourceId: number):Promise<[insertSearchFilesPasamsType[]|false, string]>{
   try {
-    await table_init(FILE_DB_PATH, "select_history");
-    const DB = await SQLite.open(FILE_DB_PATH);
-    const res = await DB.queryWithArgs<Array<insertSearchFilesPasamsType>>(
+    // await table_init(FILE_DB_PATH, "select_history");
+    // const DB = await SQLite.open(FILE_DB_PATH);
+    const DB = await Database.load("sqlite:test.db");
+    const res = await DB.execute(
       "SELECT * FROM search_files WHERE sourceId = :sourceId",
       { ":sourceId": sourceId }
     );

+ 27 - 27
yarn.lock

@@ -730,9 +730,9 @@
     csstype "^3.0.2"
 
 "@vitejs/plugin-react@^4.3.0":
-  version "4.3.0"
-  resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz#f20ec2369a92d8abaaefa60da8b7157819d20481"
-  integrity sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==
+  version "4.3.1"
+  resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e"
+  integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==
   dependencies:
     "@babel/core" "^7.24.5"
     "@babel/plugin-transform-react-jsx-self" "^7.24.5"
@@ -807,19 +807,19 @@ array-tree-filter@^2.1.0:
   integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
 
 browserslist@^4.22.2:
-  version "4.23.0"
-  resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
-  integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
+  version "4.23.1"
+  resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96"
+  integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==
   dependencies:
-    caniuse-lite "^1.0.30001587"
-    electron-to-chromium "^1.4.668"
+    caniuse-lite "^1.0.30001629"
+    electron-to-chromium "^1.4.796"
     node-releases "^2.0.14"
-    update-browserslist-db "^1.0.13"
+    update-browserslist-db "^1.0.16"
 
-caniuse-lite@^1.0.30001587:
-  version "1.0.30001629"
-  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz#907a36f4669031bd8a1a8dbc2fa08b29e0db297e"
-  integrity sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==
+caniuse-lite@^1.0.30001629:
+  version "1.0.30001632"
+  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz#964207b7cba5851701afb4c8afaf1448db3884b6"
+  integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==
 
 chalk@^2.4.2:
   version "2.4.2"
@@ -893,10 +893,10 @@ debug@^4.1.0, debug@^4.3.1:
   dependencies:
     ms "2.1.2"
 
-electron-to-chromium@^1.4.668:
-  version "1.4.794"
-  resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.794.tgz#cca7762998f6c42517770666e272f52a53c08605"
-  integrity sha512-6FApLtsYhDCY0Vglq3AptsdxQ+PJLc6AxlAM0HjEihUAiOPPbkASEsq9gtxUeZY9o0sJIEa3WnF0vVH4VT4iug==
+electron-to-chromium@^1.4.796:
+  version "1.4.798"
+  resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.798.tgz#6a3fcab2edc1e66e3883466f6b4b8944323c0164"
+  integrity sha512-by9J2CiM9KPGj9qfp5U4FcPSbXJG7FNzqnYaY4WLzX+v2PHieVGmnsA4dxfpGE3QEC7JofpPZmn7Vn1B9NR2+Q==
 
 errno@^0.1.1:
   version "0.1.8"
@@ -1100,9 +1100,9 @@ postcss@^8.4.38:
     source-map-js "^1.2.0"
 
 prettier@^3.3.0:
-  version "3.3.1"
-  resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.1.tgz#e68935518dd90bb7ec4821ba970e68f8de16e1ac"
-  integrity sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==
+  version "3.3.2"
+  resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
+  integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
 
 prr@~1.0.1:
   version "1.0.1"
@@ -1448,9 +1448,9 @@ rc-upload@~4.5.2:
     rc-util "^5.2.0"
 
 rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1, rc-util@^5.39.3, rc-util@^5.40.1, rc-util@^5.41.0:
-  version "5.41.0"
-  resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.41.0.tgz#b1ba000d4f3a9e72563370a3243b59f89b40e1bd"
-  integrity sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg==
+  version "5.42.0"
+  resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.42.0.tgz#3412da49dc5a95c9688ce00099ec43e02734533f"
+  integrity sha512-uxj2fkMe++/A3CTNagEljdTjZJHVFNH5EZcK9D4YAtWWTdEMglRE4VFtd0psIPUBIY+lSdqwVcIrR1oQMR07vw==
   dependencies:
     "@babel/runtime" "^7.18.3"
     react-is "^18.2.0"
@@ -1642,7 +1642,7 @@ undici-types@~5.26.4:
   resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
   integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
 
-update-browserslist-db@^1.0.13:
+update-browserslist-db@^1.0.16:
   version "1.0.16"
   resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356"
   integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==
@@ -1651,9 +1651,9 @@ update-browserslist-db@^1.0.13:
     picocolors "^1.0.1"
 
 vite@^5.2.12:
-  version "5.2.12"
-  resolved "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz#3536c93c58ba18edea4915a2ac573e6537409d97"
-  integrity sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==
+  version "5.2.13"
+  resolved "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz#945ababcbe3d837ae2479c29f661cd20bc5e1a80"
+  integrity sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==
   dependencies:
     esbuild "^0.20.1"
     postcss "^8.4.38"