P0 blockers: - Fix migration numbering conflict and duplicate indexes - Change comments.post_id FK to ON DELETE CASCADE - Restrict public post detail endpoint to published posts only - Fix rate-limiting IP extraction and fallback to ConnectInfo - Harden HTML sanitizer: deny unknown URL schemes, restrict data URIs - Remove session token from login response body - Enforce image pixel/dimension limits on upload and serving P1 high-risk: - Validate uploads by magic bytes and decode GIF/WebP - Add pagination/rate-limiting to search, tag posts, and comments - Make first-admin registration and slug uniqueness check atomic - HTML-escape comment author fields - Improve HTML minify cache key and skip admin/error responses - Add mobile navigation menu P2 accessibility/quality: - Associate form labels with inputs - Key PostDetail article by slug to re-init scripts on navigation - Improve image viewer keyboard accessibility - Make theme toggle SSR-friendly and add aria-label - Invalidate slug 404 cache on create and pending count on new comment - Deduplicate tags case-insensitively P3 cleanup: - Remove unused tower-http dependency, expand make clean - Configure DB pool timeouts and verified recycling - Run background cleanup tasks immediately on startup - Use SHA-256 for stable disk cache keys - Log DB errors with Display instead of Debug - Update README migration instructions All tests pass (321), clippy clean, dx check clean.
85 lines
3.0 KiB
TOML
85 lines
3.0 KiB
TOML
[package]
|
|
name = "yggdrasil"
|
|
version = "0.2.0"
|
|
edition = "2021"
|
|
|
|
[dependencies]
|
|
dioxus = { version = "0.7.9", features = ["fullstack", "router"] }
|
|
serde = { version = "1.0", features = ["derive"] }
|
|
tokio = { version = "1.52", features = ["rt-multi-thread", "macros", "fs", "time", "sync"], optional = true }
|
|
tokio-postgres = { version = "0.7", features = ["with-chrono-0_4"], optional = true }
|
|
deadpool-postgres = { version = "0.14", optional = true }
|
|
argon2 = { version = "0.5", optional = true }
|
|
uuid = { version = "1", features = ["v4"], optional = true }
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
regex = { version = "1.12", optional = true }
|
|
pulldown-cmark = { version = "0.13", optional = true }
|
|
dotenvy = { version = "0.15", optional = true }
|
|
tracing = { version = "0.1", optional = true, features = ["release_max_level_info"] }
|
|
tracing-subscriber = { version = "0.3", optional = true }
|
|
|
|
rand = { version = "0.8", features = ["getrandom"], optional = true }
|
|
http = { version = "1", optional = true }
|
|
axum = { version = "0.8", optional = true, features = ["multipart"] }
|
|
http-body-util = { version = "0.1", optional = true }
|
|
serde_json = "1.0"
|
|
sha2 = { version = "0.10", optional = true }
|
|
hex = { version = "0.4", optional = true }
|
|
lol_html = { version = "2", optional = true }
|
|
syntect = { version = "5", default-features = false, features = ["default-syntaxes", "default-themes", "default-fancy", "html", "parsing", "dump-load", "yaml-load"], optional = true }
|
|
# NOTE: WebP decoder is intentionally excluded from the image crate.
|
|
# We use zenwebp for both encoding and decoding to ensure consistency.
|
|
# Do NOT add "webp" to the features list without updating src/webp.rs.
|
|
image = { version = "0.25", optional = true, default-features = false, features = ["jpeg", "png", "gif"] }
|
|
zenwebp = { version = "0.3", optional = true }
|
|
moka = { version = "0.12", features = ["future"], optional = true }
|
|
governor = { version = "0.8", optional = true }
|
|
md-5 = { version = "0.10", optional = true }
|
|
|
|
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
|
web-sys = { version = "0.3", features = ["Document", "Window", "Storage", "Element", "DomTokenList", "MediaQueryList", "HtmlImageElement", "MouseEvent", "KeyboardEvent", "Node", "EventTarget", "Navigator"] }
|
|
wasm-bindgen = "0.2"
|
|
wasm-bindgen-futures = "0.4"
|
|
js-sys = "0.3"
|
|
|
|
[dev-dependencies]
|
|
tokio = { version = "1.52", features = ["rt-multi-thread", "macros", "fs", "time", "sync"] }
|
|
serial_test = "3"
|
|
|
|
[profile.release]
|
|
debug = false
|
|
opt-level = 3
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
strip = "symbols"
|
|
|
|
[features]
|
|
default = ["web", "server"]
|
|
web = ["dioxus/web"]
|
|
server = [
|
|
"dioxus/server",
|
|
"dep:tokio",
|
|
"dep:tokio-postgres",
|
|
"dep:deadpool-postgres",
|
|
"dep:argon2",
|
|
"dep:uuid",
|
|
"dep:regex",
|
|
"dep:pulldown-cmark",
|
|
"dep:rand",
|
|
"dep:http",
|
|
"dep:sha2",
|
|
"dep:hex",
|
|
"dep:dotenvy",
|
|
"dep:tracing",
|
|
"dep:tracing-subscriber",
|
|
"dep:http-body-util",
|
|
"dep:lol_html",
|
|
"dep:syntect",
|
|
"dep:axum",
|
|
"dep:image",
|
|
"dep:zenwebp",
|
|
"dep:moka",
|
|
"dep:governor",
|
|
"dep:md-5",
|
|
]
|