texforge 0.8.0

Self-contained LaTeX to PDF compiler CLI
[package]
name = "texforge"
version = "0.8.0"
edition = "2021"
# Raised from 1.75: `hayro` (the pure-Rust PDF rasterizer) requires 1.92.
rust-version = "1.92"
description = "Self-contained LaTeX to PDF compiler CLI"
license = "MIT"
repository = "https://github.com/UniverLab/texforge"
homepage = "https://univerlab.org/texforge"
keywords = ["latex", "pdf", "compiler", "cli"]
categories = ["command-line-utilities", "development-tools"]

[[bin]]
name = "texforge"
path = "src/main.rs"

[dependencies]
# Interactive prompts
inquire = "0.7"

# CLI argument parsing
clap = { version = "4.6", features = ["derive"] }

# Error handling
anyhow = "1.0"

# Serialization (for project.toml, template.toml)
serde = { version = "1.0", features = ["derive"] }
toml = "1.1"

# JSON output (texforge stats --json)
serde_json = "1.0"

# File system operations
walkdir = "2.5"

# Home directory resolution
dirs = "6.0"

# HTTP client (template downloads). rustls with the `ring` provider instead of
# the default `aws-lc-rs`: ring is pure-Rust+portable asm and cross-compiles
# cleanly to Windows/musl without a C toolchain (aws-lc-sys needs clang/NASM).
reqwest = { version = "0.13", default-features = false, features = [
    "blocking",
    "json",
    "http2",
    "charset",
    "rustls-no-provider",
] }
rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] }

# Archive extraction (GitHub tarballs + tectonic zip on Windows)
flate2 = "1.1"
tar = "0.4"
zip = { version = "2", default-features = false, features = ["deflate"] }

# File watching for --watch mode
notify = { version = "7", features = ["macos_fsevent"] }

# Mermaid diagram rendering
mermaid-rs-renderer = { version = "0.2", default-features = false }
resvg = "0.46"

# SVG -> PDF embedding, so diagrams stay vector in the built document instead
# of being rasterized. Pulls in its own usvg/resvg (^0.45, incompatible with
# our 0.46 above) — pass SVG as a string, never a usvg::Tree, across this
# boundary; see svg_to_pdf in src/diagrams/mod.rs.
svg2pdf = "0.13.0"

# Graphviz/DOT diagram rendering
layout-rs = "0.1"

# D2 diagram rendering (pure-Rust port of the d2lang pipeline, MPL-2.0)
d2-little = "0.7.1-1"

# Pure-Rust PDF rasterization (no C toolchain, no -sys crates)
hayro = "0.7.1"

# PNG encoding for `texforge preview` output (already in the lock via resvg)
png = "0.17"

# Temporary directories for build
tempfile = "3.8"

# Pure-Rust PDF text extraction (no C toolchain; same constraint as hayro)
pdf-extract = "0.12"
lopdf = "0.42"

# Hunspell-compatible spell-check backend (pure Rust, no_std; same
# musl-friendliness constraint as hayro/pdf-extract above). Pinned to the
# minor: spellbook's own README calls it alpha and warns any part of the API
# may break.
spellbook = "0.4"

[lints.clippy]
needless_pass_by_value = "warn"
redundant_closure = "warn"
redundant_clone = "warn"
large_enum_variant = "warn"
manual_let_else = "warn"
semicolon_if_nothing_returned = "warn"
inconsistent_struct_constructor = "warn"
doc_markdown = "warn"
# Keep the established `% 2 == 0` parser expression until its owning spec
# changes it; Clippy's newer suggestion is deliberately out of scope for TF6.
manual_is_multiple_of = "allow"

[profile.release]
opt-level = 3
lto = true
codegen-units = 1
strip = true