- create_backup writes a zip (manifest with sha256 per file, a VACUUM INTO database snapshot, assets, archive, fonts) atomically. restore_backup validates the manifest, rejects tampered files, path traversal, symlinks and newer schemas, checks the staged DB with integrity_check, then stages a pending restore. The swap runs on the next start before the database opens, moves the current data to backups/pre-restore-<ts>/ and rolls back on any failure. - Daily automatic backup (migration M9 auto_backup, default on) keeps the newest 14 and never blocks startup. - Settings Data tab: back up now, restore with confirmation and restart, auto-backup toggle, last backup time. - History exports the filtered rows as CSV (UTF-8 BOM, CRLF, formula-injection guard) or JSON (voiced.history.v1) with CA-friendly tax columns from a new list_invoice_ledger command. - Rust round-trip, rejection, swap-rollback and retention tests; vitest for the export and backup helpers. Adds the zip 8.6.0 and typed-path 0.12.3 crates (pure Rust); package builds must vendor them. PDF output and fingerprint goldens are unchanged. The new UI has not been run in a webview yet.
55 lines
1.5 KiB
TOML
55 lines
1.5 KiB
TOML
[package]
|
|
name = "voiced"
|
|
version = "0.1.0"
|
|
description = "Voiced — offline invoicing desktop app by Bongbetic"
|
|
authors = ["Bongbetic"]
|
|
edition = "2021"
|
|
rust-version = "1.95"
|
|
|
|
# The `_lib` suffix keeps the library name distinct from the binary name on Windows.
|
|
[lib]
|
|
name = "voiced_lib"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
[dependencies]
|
|
tauri = { version = "2", features = [] }
|
|
tauri-plugin-dialog = "2"
|
|
tauri-plugin-opener = "2"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
rusqlite = { version = "0.40", features = ["bundled"] }
|
|
rusqlite_migration = "2.6"
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
uuid = { version = "1", features = ["v4"] }
|
|
thiserror = "2"
|
|
base64 = "0.22"
|
|
sha2 = "0.10"
|
|
flate2 = "1"
|
|
zip = { version = "8", default-features = false, features = ["deflate-flate2"] }
|
|
percent-encoding = "2"
|
|
image = { version = "0.25.10", default-features = false, features = ["png", "jpeg", "webp"] }
|
|
|
|
# Desktop-only plugins (not available on mobile targets).
|
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
|
tauri-plugin-single-instance = "2"
|
|
tauri-plugin-window-state = "2"
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|
|
|
|
[features]
|
|
# Production builds embed the frontend and serve it over the custom asset
|
|
# protocol. Without this, the app expects a dev server on localhost:1420.
|
|
# DO NOT REMOVE.
|
|
custom-protocol = ["tauri/custom-protocol"]
|
|
|
|
[profile.release]
|
|
codegen-units = 1
|
|
lto = true
|
|
opt-level = "s"
|
|
panic = "abort"
|
|
strip = true
|