[package]
name = "Readest"
version = "0.2.2"
description = "Your online library"
authors = ["Bilingify LLC"]
license = ""
repository = ""
edition = "2021"
rust-version = "1.77.2"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
name = "readestlib"
crate-type = ["staticlib", "cdylib", "lib"]

[features]
# Internal feature to suppress warnings from old objc crate
cargo-clippy = []
# Enable WebDriver plugin for E2E testing (use with `tauri build --debug --features webdriver`)
webdriver = ["tauri-plugin-webdriver"]
devtools = ["tauri/devtools"]

[build-dependencies]
tauri-build = { version = "2", features = [] }

[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
semver = "1"
base64 = "0.22"
minisign-verify = "0.2"
log = "0.4"
thiserror = "2"
walkdir = "2"
tokio = { version = "1", features = ["fs"] }
tokio-util = { version = "0.7", features = ["codec"] }
futures-util = "0.3"
futures = "0.3.31"
read-progress-stream = "1.0.0"
reqwest = { version = "0.12", default-features = false, features = [
  "json",
  "stream",
] }
tauri = { version = "2", features = [ "protocol-asset" ] }
tauri-build = "2"
tauri-plugin-log = "2"
tauri-plugin-fs = "2"
tauri-plugin-dialog = "2"
tauri-plugin-os = "2"
tauri-plugin-http = { version = "2", features = ["dangerous-settings"] }
tauri-plugin-shell = "2"
tauri-plugin-process = "2"
tauri-plugin-oauth = "2"
tauri-plugin-opener = "2"
tauri-plugin-deep-link = "2"
tauri-plugin-sign-in-with-apple = "1.0.2"
tauri-plugin-haptics = "2"
tauri-plugin-biometric = "2"
tauri-plugin-persisted-scope = "2"
tauri-plugin-native-bridge = { path = "./plugins/tauri-plugin-native-bridge" }
tauri-plugin-native-tts = { path = "./plugins/tauri-plugin-native-tts" }
tauri-plugin-webview-upgrade = { path = "./plugins/tauri-plugin-webview-upgrade" }
tauri-plugin-websocket = "2"
tauri-plugin-sharekit = "0.3"
tauri-plugin-clipboard-manager = "2"
tauri-plugin-device-info = "1.0.1"
tauri-plugin-turso = { path = "./plugins/tauri-plugin-turso" }
tauri-plugin-webdriver = { version = "0.2", optional = true }

# Native EPUB import path (Q1): zip + quick-xml + md5.
# Used by `epub_parser::parse_epub_metadata` (partialMD5 + downscaled
# cover) and `parse_epub_full` (OPF/nav/ncx prefetch + entry-size
# table) to do the mechanical zip work without ferrying multi-MB blobs
# across the JS<->Rust IPC boundary. Pure-Rust crates so they ship to
# every Tauri target (desktop, iOS, Android) without extra system deps.
zip = { version = "2", default-features = false, features = ["deflate"] }
quick-xml = "0.36"
md-5 = "0.10"
# Used by `epub_parser::read_zip_entry` as a fallback when an OPF/manifest
# href is percent-encoded (e.g. spaces as %20, CJK paths) but the zip stores
# the raw decoded bytes — or vice versa. Already in our transitive dep graph
# (reqwest pulls it), so adding it explicitly costs nothing.
percent-encoding = "2"

# Cover thumbnail generation (Q2). We decode the cover image extracted
# from the EPUB and, when its long edge exceeds the library-grid size,
# re-encode a smaller JPEG so the on-disk `cover.png` is suitable for
# webview rendering (~30-60 KB instead of multi-MB). Default features
# are disabled to keep the binary lean — we only need decoders for the
# formats EPUBs actually use (jpeg/png/gif) plus the JPEG encoder.
image = { version = "0.25", default-features = false, features = ["jpeg", "png", "gif"] }

# Native MOBI/AZW/AZW3 import path. Mirrors the EPUB fast-path: parse
# PalmDB + MobiHeader + EXTH in Rust to extract title/author/publisher/
# description/isbn/asin/subjects/language and the cover image, then
# return them to JS so the importer skips the foliate-js MOBI parser
# (which has to inflate the whole record stream up-front on the iOS
# WebView). Pure-Rust crate, ships to every Tauri target.
mobi = "0.8"

# Crash/error reporting. `tauri-plugin-sentry` injects @sentry/browser into
# every webview and routes browser + Rust panic events through one client; it
# re-exports sentry-rust-minidump for desktop native crashes. `rustls` avoids
# the native-tls/OpenSSL system dependency so the transport builds for
# Android/iOS. Native mobile crashes are handled by sentry-android/-cocoa.
sentry = { version = "0.42", default-features = false, features = [
  "backtrace",
  "contexts",
  "panic",
  "reqwest",
  "rustls",
] }
tauri-plugin-sentry = "0.5"

[target."cfg(target_os = \"macos\")".dependencies]
rand = "0.8"
cocoa = "0.25"
objc = "0.2.7"
objc-foundation = "0.1.1"
objc_id = "0.1.1"
block = "0.1.6"
objc2 = "0.6"
objc2-authentication-services = "0.3"
objc2-foundation = { version = "0.3", features = ["NSError", "NSArray"] }

[target.'cfg(any(target_os = "macos", windows, target_os = "linux"))'.dependencies]
tauri-plugin-cli = "2"
tauri-plugin-single-instance = "2"
tauri-plugin-updater = "2"
tauri-plugin-window-state = "2"
discord-rich-presence = "1.0.0"

[target.'cfg(windows)'.dependencies]
# Resolve the user's default browser from the registry for the cold-browser
# OAuth-redirect fallback (see src/spawn_fresh_browser.rs).
winreg = "0.52"

[target.'cfg(target_os = "android")'.dependencies]
libc = "0.2"
