migrar Alpha a Tauri app con Turso/libsql como BD local
This commit is contained in:
@@ -9,6 +9,8 @@
|
|||||||
"@tabler/icons-vue": "^3.44.0",
|
"@tabler/icons-vue": "^3.44.0",
|
||||||
"@tailwindcss/vite": "^4.3.0",
|
"@tailwindcss/vite": "^4.3.0",
|
||||||
"@tanstack/vue-table": "^8.21.3",
|
"@tanstack/vue-table": "^8.21.3",
|
||||||
|
"@tauri-apps/api": "^2.11.0",
|
||||||
|
"@tauri-apps/cli": "^2.11.2",
|
||||||
"@vueuse/core": "^14.3.0",
|
"@vueuse/core": "^14.3.0",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
@@ -320,6 +322,32 @@
|
|||||||
|
|
||||||
"@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.25", "", { "dependencies": { "@tanstack/virtual-core": "3.15.0" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-/ez+t68a5O4CgVysvk7Bav0XbSYSYufOVHZveXF+DYO9hvtg2UheYzR0YkniCeUtXmMjDne1dDqwBMkOmEUOow=="],
|
"@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.25", "", { "dependencies": { "@tanstack/virtual-core": "3.15.0" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-/ez+t68a5O4CgVysvk7Bav0XbSYSYufOVHZveXF+DYO9hvtg2UheYzR0YkniCeUtXmMjDne1dDqwBMkOmEUOow=="],
|
||||||
|
|
||||||
|
"@tauri-apps/api": ["@tauri-apps/api@2.11.0", "", {}, "sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli": ["@tauri-apps/cli@2.11.2", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.11.2", "@tauri-apps/cli-darwin-x64": "2.11.2", "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.2", "@tauri-apps/cli-linux-arm64-gnu": "2.11.2", "@tauri-apps/cli-linux-arm64-musl": "2.11.2", "@tauri-apps/cli-linux-riscv64-gnu": "2.11.2", "@tauri-apps/cli-linux-x64-gnu": "2.11.2", "@tauri-apps/cli-linux-x64-musl": "2.11.2", "@tauri-apps/cli-win32-arm64-msvc": "2.11.2", "@tauri-apps/cli-win32-ia32-msvc": "2.11.2", "@tauri-apps/cli-win32-x64-msvc": "2.11.2" }, "bin": { "tauri": "tauri.js" } }, "sha512-bk3HemqvGRoy+5D/dVMUQHKMYLglD0jVnMm/0iGMH6ufZ+p8r14m6BpIixwij3PBvZdvORUp1YifTD8QxVZ1Nw=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.11.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+4UZzLt+eOAEQCwgd+TqKgyUJMrvx+BgdXLLaqJYmPqzP+nE6YZr/hY6CWLYGQb8jFn99jEkmC6uA3tNvamA1w=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.11.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-VjYYtZUPqDMLutSfJEyxFE3Bz+DPi7c8wC3imckgvciLDZLq4qwKJxBicg0BXGhXjJsl8vKWgWRFNMPELQ+Xyg=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.11.2", "", { "os": "linux", "cpu": "arm" }, "sha512-yMemD6f4i95AQriS8EazyOFzbE34yjnP16i3IOzpHGQvBoy2DjypFMFBq0NtPuITURv/cOGguRtHR5d79/9CSA=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.11.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-cgI91D2wL8GSgoWwZXDqt+DwnuZCP2/bz03QAE4TrhgAKIsrB4hX26W/H1EONPUUNkqrsgeCD0wU6pcNjV/5kw=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.11.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-X1rm0BERqAAggtYTESSgXrS3sz4Sb/OiPiz54UqISlXW+GkR3vNIGnsy/lejNmoXGVqri3Q53BCfQiclOIyRPw=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.11.2", "", { "os": "linux", "cpu": "none" }, "sha512-usbMLJbT3KtkOrBMDVeGYNM35aTHXx38SJSzTMSqqjeUIOQ+iVPjb2yAGNAE+KqmBbAx4FOFIyMeKXx2M/JKGQ=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.11.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Ru4gwJKPG0ctVGchRGpRup4Y4lW2SSfFnrbQcyHhCliKy4g8Qz97TrUgCur4CbWyAgKxvGh3SjrkA0LDYzDGiw=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.11.2", "", { "os": "linux", "cpu": "x64" }, "sha512-eUm7T6clN1MMmNSRQ9gaWsQdyehQx2Gmn5hht/QUlqZQI/qcP2OJK5dnaxqwFzCr2HdsEo9ydxaqcS1oJzMvUw=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.11.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-HeeZW80jU+gVTOEX4X/hC6NVSAdDVXajwP5fxIZ/3z9WvUC7qrudX2GMTilYq6Dg0e0sk0XgsAJD1hZ5wPBXUA=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.11.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YhjQNZcXfbkCLyazSv1nPnJ9iRFE1wm6kc51FDbU10/Dk09io+6PAGMLjkxnX2GdM0qMnDmTjstY8mTDVvtKeA=="],
|
||||||
|
|
||||||
|
"@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.11.2", "", { "os": "win32", "cpu": "x64" }, "sha512-d2JchlFIpZevZVReyqhQOekJmb1UH3rhZ5VX6sH3ty9ETE0TKQavpihvoScUXfKKpW6HZC0MrFGRU0ZtD+w3gA=="],
|
||||||
|
|
||||||
"@ts-morph/common": ["@ts-morph/common@0.28.1", "", { "dependencies": { "minimatch": "^10.0.1", "path-browserify": "^1.0.1", "tinyglobby": "^0.2.14" } }, "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g=="],
|
"@ts-morph/common": ["@ts-morph/common@0.28.1", "", { "dependencies": { "minimatch": "^10.0.1", "path-browserify": "^1.0.1", "tinyglobby": "^0.2.14" } }, "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g=="],
|
||||||
|
|
||||||
"@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
|
"@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
|
||||||
|
|||||||
+4
-1
@@ -7,13 +7,16 @@
|
|||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vue-tsc --noEmit && vite build",
|
"build": "vue-tsc --noEmit && vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"typecheck": "vue-tsc --noEmit"
|
"typecheck": "vue-tsc --noEmit",
|
||||||
|
"tauri": "bun tauri"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@lucide/vue": "^1.16.0",
|
"@lucide/vue": "^1.16.0",
|
||||||
"@tabler/icons-vue": "^3.44.0",
|
"@tabler/icons-vue": "^3.44.0",
|
||||||
"@tailwindcss/vite": "^4.3.0",
|
"@tailwindcss/vite": "^4.3.0",
|
||||||
"@tanstack/vue-table": "^8.21.3",
|
"@tanstack/vue-table": "^8.21.3",
|
||||||
|
"@tauri-apps/api": "^2.11.0",
|
||||||
|
"@tauri-apps/cli": "^2.11.2",
|
||||||
"@vueuse/core": "^14.3.0",
|
"@vueuse/core": "^14.3.0",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
target/
|
||||||
Generated
+6205
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "alpha"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tauri = { version = "2", features = [] }
|
||||||
|
tauri-plugin-opener = "2"
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
serde_json = "1"
|
||||||
|
libsql = "0.9"
|
||||||
|
dirs-next = "2"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
tauri-build = { version = "2", features = [] }
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
tauri_build::build()
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 105 B |
@@ -0,0 +1,201 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::sync::Mutex;
|
||||||
|
use tauri::State;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct Project {
|
||||||
|
pub id: i64,
|
||||||
|
pub name: String,
|
||||||
|
pub key: Option<String>,
|
||||||
|
pub description: Option<String>,
|
||||||
|
pub status: String,
|
||||||
|
pub start_date: Option<String>,
|
||||||
|
pub end_date: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct WorkItem {
|
||||||
|
pub id: i64,
|
||||||
|
pub project_id: i64,
|
||||||
|
pub code: Option<String>,
|
||||||
|
pub title: String,
|
||||||
|
pub description: Option<String>,
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
pub wi_type: String,
|
||||||
|
pub status: String,
|
||||||
|
pub priority: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_conn(db_path: &str) -> Result<libsql::Connection, String> {
|
||||||
|
let db = libsql::Builder::new_local(db_path)
|
||||||
|
.build()
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("DB open: {e}"))?;
|
||||||
|
|
||||||
|
let conn = db.connect().map_err(|e| format!("Connect: {e}"))?;
|
||||||
|
|
||||||
|
conn.execute_batch(
|
||||||
|
"CREATE TABLE IF NOT EXISTS projects (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
key TEXT,
|
||||||
|
description TEXT,
|
||||||
|
status TEXT DEFAULT 'active',
|
||||||
|
start_date TEXT,
|
||||||
|
end_date TEXT,
|
||||||
|
created_at TEXT DEFAULT (datetime('now'))
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS work_items (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
project_id INTEGER NOT NULL,
|
||||||
|
code TEXT,
|
||||||
|
title TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
type TEXT DEFAULT 'task',
|
||||||
|
status TEXT DEFAULT 'backlog',
|
||||||
|
priority TEXT DEFAULT 'medium',
|
||||||
|
created_at TEXT DEFAULT (datetime('now')),
|
||||||
|
FOREIGN KEY (project_id) REFERENCES projects(id)
|
||||||
|
);"
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Migration: {e}"))?;
|
||||||
|
|
||||||
|
Ok(conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod commands {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn get_projects(state: State<'_, Mutex<String>>) -> Result<Vec<Project>, String> {
|
||||||
|
let db_path = state.lock().map_err(|e| e.to_string())?.clone();
|
||||||
|
let conn = get_conn(&db_path).await?;
|
||||||
|
|
||||||
|
let mut rows = conn
|
||||||
|
.query("SELECT id, name, key, description, status, start_date, end_date FROM projects ORDER BY name", ())
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Query: {e}"))?;
|
||||||
|
|
||||||
|
let mut projects = Vec::new();
|
||||||
|
while let Some(row) = rows.next().await.map_err(|e| format!("Row: {e}"))? {
|
||||||
|
projects.push(Project {
|
||||||
|
id: row.get::<i64>(0).unwrap_or(0),
|
||||||
|
name: row.get::<String>(1).unwrap_or_default(),
|
||||||
|
key: row.get::<String>(2).ok(),
|
||||||
|
description: row.get::<String>(3).ok(),
|
||||||
|
status: row.get::<String>(4).unwrap_or_else(|_| "active".into()),
|
||||||
|
start_date: row.get::<String>(5).ok(),
|
||||||
|
end_date: row.get::<String>(6).ok(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Ok(projects)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn save_project(state: State<'_, Mutex<String>>, project: Project) -> Result<i64, String> {
|
||||||
|
let db_path = state.lock().map_err(|e| e.to_string())?.clone();
|
||||||
|
let conn = get_conn(&db_path).await?;
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
"INSERT OR REPLACE INTO projects (id, name, key, description, status, start_date, end_date)
|
||||||
|
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)",
|
||||||
|
libsql::params![
|
||||||
|
project.id,
|
||||||
|
project.name,
|
||||||
|
project.key,
|
||||||
|
project.description,
|
||||||
|
project.status,
|
||||||
|
project.start_date,
|
||||||
|
project.end_date,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Insert: {e}"))?;
|
||||||
|
|
||||||
|
Ok(conn.last_insert_rowid())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn delete_project(state: State<'_, Mutex<String>>, id: i64) -> Result<(), String> {
|
||||||
|
let db_path = state.lock().map_err(|e| e.to_string())?.clone();
|
||||||
|
let conn = get_conn(&db_path).await?;
|
||||||
|
|
||||||
|
conn.execute("DELETE FROM work_items WHERE project_id = ?1", libsql::params![id])
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Delete WIs: {e}"))?;
|
||||||
|
|
||||||
|
conn.execute("DELETE FROM projects WHERE id = ?1", libsql::params![id])
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Delete project: {e}"))?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn get_work_items(state: State<'_, Mutex<String>>, project_id: i64) -> Result<Vec<WorkItem>, String> {
|
||||||
|
let db_path = state.lock().map_err(|e| e.to_string())?.clone();
|
||||||
|
let conn = get_conn(&db_path).await?;
|
||||||
|
|
||||||
|
let mut rows = conn
|
||||||
|
.query(
|
||||||
|
"SELECT id, project_id, code, title, description, type, status, priority FROM work_items WHERE project_id = ?1 ORDER BY created_at DESC",
|
||||||
|
libsql::params![project_id],
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Query: {e}"))?;
|
||||||
|
|
||||||
|
let mut items = Vec::new();
|
||||||
|
while let Some(row) = rows.next().await.map_err(|e| format!("Row: {e}"))? {
|
||||||
|
items.push(WorkItem {
|
||||||
|
id: row.get::<i64>(0).unwrap_or(0),
|
||||||
|
project_id: row.get::<i64>(1).unwrap_or(0),
|
||||||
|
code: row.get::<String>(2).ok(),
|
||||||
|
title: row.get::<String>(3).unwrap_or_default(),
|
||||||
|
description: row.get::<String>(4).ok(),
|
||||||
|
wi_type: row.get::<String>(5).unwrap_or_else(|_| "task".into()),
|
||||||
|
status: row.get::<String>(6).unwrap_or_else(|_| "backlog".into()),
|
||||||
|
priority: row.get::<String>(7).unwrap_or_else(|_| "medium".into()),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Ok(items)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn save_work_item(state: State<'_, Mutex<String>>, item: WorkItem) -> Result<i64, String> {
|
||||||
|
let db_path = state.lock().map_err(|e| e.to_string())?.clone();
|
||||||
|
let conn = get_conn(&db_path).await?;
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
"INSERT OR REPLACE INTO work_items (id, project_id, code, title, description, type, status, priority)
|
||||||
|
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)",
|
||||||
|
libsql::params![
|
||||||
|
item.id,
|
||||||
|
item.project_id,
|
||||||
|
item.code,
|
||||||
|
item.title,
|
||||||
|
item.description,
|
||||||
|
item.wi_type,
|
||||||
|
item.status,
|
||||||
|
item.priority,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Insert: {e}"))?;
|
||||||
|
|
||||||
|
Ok(conn.last_insert_rowid())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn delete_work_item(state: State<'_, Mutex<String>>, id: i64) -> Result<(), String> {
|
||||||
|
let db_path = state.lock().map_err(|e| e.to_string())?.clone();
|
||||||
|
let conn = get_conn(&db_path).await?;
|
||||||
|
|
||||||
|
conn.execute("DELETE FROM work_items WHERE id = ?1", libsql::params![id])
|
||||||
|
.await
|
||||||
|
.map_err(|e| format!("Delete: {e}"))?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||||
|
|
||||||
|
mod db;
|
||||||
|
|
||||||
|
use db::commands;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let db_path = {
|
||||||
|
let path = dirs_next::config_dir()
|
||||||
|
.unwrap_or_else(|| std::path::PathBuf::from("."))
|
||||||
|
.join("com.teloprax.alpha")
|
||||||
|
.join("alpha.db");
|
||||||
|
|
||||||
|
std::fs::create_dir_all(path.parent().unwrap()).ok();
|
||||||
|
path.to_str().unwrap().to_string()
|
||||||
|
};
|
||||||
|
|
||||||
|
tauri::Builder::default()
|
||||||
|
.plugin(tauri_plugin_opener::init())
|
||||||
|
.manage(Mutex::new(db_path))
|
||||||
|
.invoke_handler(tauri::generate_handler![
|
||||||
|
commands::get_projects,
|
||||||
|
commands::save_project,
|
||||||
|
commands::delete_project,
|
||||||
|
commands::get_work_items,
|
||||||
|
commands::save_work_item,
|
||||||
|
commands::delete_work_item,
|
||||||
|
])
|
||||||
|
.run(tauri::generate_context!())
|
||||||
|
.expect("error while running tauri application");
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/nicedoc/tauri/dev/crates/tauri-config-schema/schema.json",
|
||||||
|
"productName": "alpha",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"identifier": "com.teloprax.alpha",
|
||||||
|
"build": {
|
||||||
|
"frontendDist": "../dist",
|
||||||
|
"devUrl": "http://localhost:5173",
|
||||||
|
"beforeDevCommand": "bun dev",
|
||||||
|
"beforeBuildCommand": "bun run build"
|
||||||
|
},
|
||||||
|
"app": {
|
||||||
|
"windows": [
|
||||||
|
{
|
||||||
|
"title": "Alpha",
|
||||||
|
"width": 1280,
|
||||||
|
"height": 800,
|
||||||
|
"resizable": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"security": {
|
||||||
|
"csp": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bundle": {
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user