server: - backup exporter, auth extractors, error shapes, CONTEXT (prior work) - spa assets served outside the rate limit via route_layer - requests_per_second went to per_second(), which takes an interval not a rate: 50 meant one request per 50s once burst was spent. now converted properly. 15/s, burst 60 spa fixes: - account delete cleared snake_case token keys that were never written - refresh interceptor could retry forever - date ranges used local day boundaries stamped +00:00 - "all" period trend plotted one page; calendar days fabricated mood 3 - chart grid invisible: hsl(var(--border)) against rgba tokens - blob url leak, orphaned media on failed save, devtools in prod bundle - pt-safe/safe-area-pb classes never existed spa features: - offline outbox: entries queue to IndexedDB, replay with backoff, only server refusals count against an entry - drafts persist, quick-log sheet, diary infinite scroll + filters - route error boundary, stale-chunk recovery, no service worker in dev a11y + perf: - mood picker is a radiogroup, activity picker keyboard-operable, text alternatives for colour/emoji, locale week start - dark glass over the bright photo: worst case 1.4:1 -> 4.9-9.6:1 - initial payload 1095->769kB raw, 306->230kB gzip; 38 unused components and 5 deps dropped; fonts 218->133kB 53 tests added (43 spa, 10 server)
85 lines
2.9 KiB
TOML
85 lines
2.9 KiB
TOML
[workspace]
|
|
resolver = "2"
|
|
members = [
|
|
"crates/domain",
|
|
"crates/application",
|
|
"crates/api-types",
|
|
"crates/config",
|
|
"crates/adapters/http-axum",
|
|
"crates/adapters/sqlite",
|
|
"crates/adapters/auth",
|
|
"crates/adapters/storage",
|
|
"crates/adapters/event-publisher",
|
|
"crates/adapters/importer",
|
|
"crates/adapters/crypto",
|
|
"crates/adapters/music",
|
|
"crates/adapters/exporter",
|
|
"crates/adapters/weather",
|
|
"crates/adapters/web-push",
|
|
"crates/bootstrap",
|
|
"crates/server",
|
|
"crates/worker",
|
|
]
|
|
default-members = ["crates/server", "crates/worker"]
|
|
|
|
[workspace.package]
|
|
edition = "2024"
|
|
version = "0.1.0"
|
|
|
|
[workspace.dependencies]
|
|
domain = { path = "crates/domain" }
|
|
application = { path = "crates/application" }
|
|
api-types = { path = "crates/api-types" }
|
|
config = { path = "crates/config" }
|
|
http-axum = { path = "crates/adapters/http-axum" }
|
|
sqlite = { path = "crates/adapters/sqlite" }
|
|
auth = { path = "crates/adapters/auth" }
|
|
storage = { path = "crates/adapters/storage" }
|
|
event-publisher = { path = "crates/adapters/event-publisher" }
|
|
importer = { path = "crates/adapters/importer" }
|
|
crypto = { path = "crates/adapters/crypto" }
|
|
music = { path = "crates/adapters/music" }
|
|
exporter = { path = "crates/adapters/exporter" }
|
|
weather = { path = "crates/adapters/weather" }
|
|
web-push-adapter = { path = "crates/adapters/web-push" }
|
|
bootstrap = { path = "crates/bootstrap" }
|
|
csv = "1"
|
|
zip = { version = "8", default-features = false, features = ["deflate"] }
|
|
|
|
thiserror = "2"
|
|
async-trait = "0.1"
|
|
uuid = { version = "1", features = ["v4", "serde"] }
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
figment = { version = "0.10", features = ["toml", "env"] }
|
|
serde_json = "1"
|
|
tokio = { version = "1", features = ["rt-multi-thread", "macros", "signal"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
axum = { version = "0.8", features = ["macros", "multipart"] }
|
|
tower = { version = "0.5", features = ["util"] }
|
|
http-body-util = "0.1"
|
|
tower-http = { version = "0.7", features = ["cors", "trace", "fs"] }
|
|
tower_governor = { version = "0.8", default-features = false, features = ["axum"] }
|
|
sqlx = { version = "0.9", features = ["runtime-tokio", "sqlite"] }
|
|
email_address = "0.2"
|
|
chrono-tz = { version = "0.10", features = ["serde"] }
|
|
jsonwebtoken = { version = "11", features = ["aws_lc_rs"] }
|
|
argon2 = { version = "0.5", features = ["std"] }
|
|
object_store = { version = "0.14", features = ["aws"] }
|
|
bytes = "1"
|
|
base64 = "0.23"
|
|
chacha20poly1305 = "0.10"
|
|
md-5 = "0.10"
|
|
sha2 = "0.10"
|
|
rand = "0.9"
|
|
reqwest = { version = "0.13", default-features = false, features = ["rustls", "charset", "json", "query"] }
|
|
utoipa = { version = "5", features = ["axum_extras", "chrono", "uuid"] }
|
|
utoipa-scalar = { version = "0.3", features = ["axum"] }
|
|
|
|
[profile.release]
|
|
lto = true
|
|
strip = true
|
|
codegen-units = 1
|
|
opt-level = 3
|