[workspace] resolver = "2" members = [ # editions "crates/workspace-hack", # editions "editions/oss/modules", "editions/oss/api", "editions/oss/workers", "editions/oss/openapi", "editions/oss/standalone", # meteroid "modules/meteroid", "modules/meteroid/crates/meteroid-app", "modules/meteroid/crates/meteroid-grpc-mapping", "modules/meteroid/crates/meteroid-api", "modules/meteroid/crates/meteroid-kit", "modules/meteroid/crates/meteroid-rest", "modules/meteroid/crates/meteroid-rest-common", "modules/meteroid/crates/meteroid-workers", "modules/meteroid/crates/meteroid-grpc", "modules/meteroid/crates/meteroid-tax", "modules/meteroid/crates/stripe-client", "modules/meteroid/crates/gocardless-client", "modules/meteroid/crates/stancer-client", "modules/meteroid/crates/mollie-client", "modules/meteroid/crates/hubspot-client", "modules/meteroid/crates/pennylane-client", "modules/meteroid/crates/diesel-models", "modules/meteroid/crates/diesel-schema", "modules/meteroid/crates/meteroid-store", "modules/meteroid/crates/meteroid-store-macros", "modules/meteroid/crates/meteroid-invoicing", "modules/meteroid/crates/meteroid-mailer", "modules/meteroid/crates/meteroid-oauth", "modules/meteroid/crates/meteroid-seeder", "modules/meteroid/crates/meteroid-testkit", "modules/meteroid/crates/meteroid-middleware", # metering "modules/metric-core", "modules/metering", "modules/metering/crates/metering-grpc", "modules/metering/crates/metering-server", # adapters "modules/adapters/slurm-collector", # shared "crates/kafka", "crates/golden", "crates/common-build-info", "crates/common-config", "crates/common-domain", "crates/common-eventbus", "crates/common-grpc", "crates/common-grpc-error-as-tonic-macros", "crates/common-grpc-error-as-tonic-macros-impl", "crates/common-logging", "crates/common-utils", "crates/distributed-lock", "crates/egress-guard", "crates/egress-http", "crates/http-client-tracing", "crates/secrecy", # enterprise "crates/license-protocol", "crates/rate-limiter", "crates/redis-rate-limiter", # vendored third-party (see crate LICENSE files) "crates/world-tax", # first-party fork of rusty-money (see crate LICENSE) "crates/meteroid-money", ] [workspace.package] license = "AGPL-3.0-only" edition = "2024" rust-version = "1.96" repository = "https://github.com/meteroid-oss/meteroid" # Backtraces keep file and line; full debuginfo made each debug binary ~2 GB and slowed linking. # Set `debug = true` locally to step through code in a debugger. [profile.dev] debug = "line-tables-only" [profile.dev.package."*"] debug = false # Proc macros get the build-override profile as dependencies, but the dev one when `--workspace` # selects them; pinning both keeps one artifact, and with it one copy of everything above them. [profile.dev.package.meteroid-store-macros] debug = false [profile.dev.package.common-grpc-error-as-tonic-macros-impl] debug = false # Same as dev, so `cargo test` reuses what `cargo build`/`cargo run` compiled. [profile.test] debug = "line-tables-only" [workspace.dependencies] anyhow = "1.0.75" argon2 = "0.5.2" async-trait = "0.1.74" axum = { version = "0.8.1", features = ["json", "query", "tower-log", "http1"] } axum-extra = { version = "0.12.5", default-features = false } axum-valid = "0.24.0" parquet = { version = "58.0.0", default-features = false } base62 = "2.2.3" base64 = "0.22.0" backon = "1.5.2" # Only to remove a test container whose start failed; the version testcontainers resolves. bollard = { version = "0.20.2", default-features = false } bytes = "1.10.1" cached = "0.59.0" chacha20poly1305 = "0.10.1" chrono = { version = "0.4.31", default-features = false } chrono-tz = { version = "0.10.3" } croner = "2" clap = "4.5.16" clickhouse = { version = "0.15.0", default-features = false } ctor = "1.0.6" deadpool-runtime = "0.3.1" diesel = { version = "2.3.7", features = ["chrono", "uuid", "serde_json", "numeric"] } diesel-async = { version = "0.9.0", features = ["postgres", "deadpool"] } diesel-derive-enum = { version = "2.1.0", features = ["postgres"] } diesel_migrations = { version = "2.3.1", features = ["postgres"] } diesel-derive-newtype = { version = "2.1.2" } dotenvy = "0.15.7" en16931 = "0.6.0" en16931-formats = { version = "0.6.0", default-features = false, features = ["cii", "ubl", "zugferd"] } env_logger = "0.11.5" encoding_rs = "0.8" envconfig = "0.11.0" error-stack = "0.7.0" ed25519-dalek = { version = "2.1", default-features = false, features = ["pkcs8", "pem", "rand_core"] } educe = { version = "0.6.0", default-features = false, features = ["Default"] } fluent-static = "0.5.0" fluent-syntax = "0.12" fred = { version = "10.1.0", features = ["enable-rustls-ring"] } futures = "0.3.28" futures-util = { version = "0.3.29", features = [] } governor = "0.10.0" hex = "0.4.3" hmac = "0.13.0" hmac-sha256 = "1.1.7" http = { version = "1.3.1" } http-body = "1.0.1" humantime = { version = "2.3.0" } hyper = { version = "1.7.0", default-features = false } image = "0.25.2" ordermap = "1.0.0" init-tracing-opentelemetry = { version = "0.38.0" } axum-tracing-opentelemetry = { version = "0.38.0" } insta = { version = "1.43.1", features = ["json"] } itertools = "0.14.0" jsonwebtoken = { version = "10.0.0", default-features = false } lazy_static = "1.5.0" lettre = { version = "0.11.21", default-features = false } log = "0.4.20" # Kept in lockstep with what en16931-formats' `zugferd` feature pulls, so the # hybrid PDF is written and read back through one PDF implementation. lopdf = { version = "0.44", default-features = false } mockall = "0.14.0" moka = { version = "0.12.10", features = ["log", "logging", "sync"] } nanoid = "0.5.0" nonzero_ext = { version = "0.3.0", default-features = false } # The HTTP client comes from oauth2-reqwest; oauth2's default one is reqwest 0.12. oauth2 = { version = "5.0.0", default-features = false } oauth2-reqwest = "0.1.0-alpha.3" o2o = { version = "0.5.3", default-features = false, features = ["syn2"] } object_store = { version = "0.13.2", default-features = false } once_cell = "1.18.0" opentelemetry = { version = "0.32.0", features = ["metrics", "trace", "logs"] } opentelemetry-otlp = { version = "0.32.0", default-features = false, features = ["grpc-tonic", "internal-logs", "logs", "metrics", "trace"] } opentelemetry_sdk = { version = "0.32.0", features = ["trace", "metrics", "rt-tokio", "rt-tokio-current-thread"] } opentelemetry-appender-tracing = { version = "0.32.0" } opentelemetry-resource-detectors = { version = "0.11.0" } paste = "1.0.15" pbjson-build = "0.9.0" pin-project = "1.1.3" proc-macro2 = { version = "1.0.78" } prost = "0.14.1" prost-build = "0.14.1" prost-types = "0.14.1" quick_cache = "0.6.2" quote = "1.0.35" lazy-regex = "3" rand = "0.10.0" rdkafka = "0.39.0" refinery-core = { version = "0.9.0" } refinery = { version = "0.9.0", default-features = false } # No crypto provider: build clients with http_client_tracing::client_builder, which installs ring. reqwest = { version = "0.13.2", default-features = false, features = ["rustls-no-provider", "charset", "http2", "system-proxy"] } hickory-resolver = { version = "0.26.1", default-features = false, features = ["tokio", "system-config"] } reqwest-retry = { version = "0.9.1", default-features = false } reqwest-middleware = { version = "0.5.1", default-features = false } rstest = "0.26.1" rust_decimal = "1.32.0" rust_decimal_macros = "1.32.0" rust_iso3166 = "0.1.14" rustls = { version = "0.23.12", default-features = false } sailfish = "0.11.1" scoped-futures = "0.1.4" sealed = "0.6.0" secrecy = { path = "crates/secrecy", default-features = false } serde = { version = "1.0.189", default-features = false } serde-enum-str = "0.5.0" serde_json = { version = "1.0.107", features = ["preserve_order"] } serde_path_to_error = "0.1.14" serde_with = "3.11.0" serde_qs = "1.0.0" serde_html_form = "0.4.0" sha2 = "0.11.0" signature = "2.2.0" syn = "2.0.52" strum = { version = "0.28", default-features = false } tap = "1.0.1" testcontainers = { version = "0.27.1", features = ["watchdog"] } thiserror = "2.0.3" # 0.3.47 fixes RUSTSEC-2026-0009; 0.3.48 reintroduces an E0119 coherence break # with typst-library 0.14.2 under Rust 1.94, so cap below it until typst is upgraded. time = ">=0.3.47, <0.3.48" tokio = { version = "1.33.0", default-features = false } tokio-postgres = { version = "0.7.7", default-features = false } tokio-postgres-rustls = "0.14.0" tokio-util = "0.7.10" totp-rs = { version = "5.7", default-features = false, features = ["gen_secret", "otpauth"] } tonic = "0.14.2" tonic-health = "0.14.2" tonic-prost = "0.14.2" tonic-reflection = "0.14.2" tonic-tracing-opentelemetry = "0.38.0" tonic-web = "0.14.2" tonic-prost-build = "0.14.2" tower = { version = "0.5.0" } tower-http = { version = "0.6.1", features = ["add-extension", "auth", "catch-panic", "cors", "limit", "set-header", "trace"] } tower-layer = { version = "0.3.3" } tracing = { version = "0.1.39", features = ["log"] } tracing-log = "0.2.0" tracing-subscriber = { version = "0.3.18", features = ["registry", "tracing-log", "fmt", "env-filter", "json"] } # Held by meteroid-invoicing as a pin on typst's transitive dependency. # ecow 0.2.7 adds extra AsRef<_> impls on EcoString, making `self.as_ref().repr()` in # typst-library 0.14.x ambiguous (E0282) under Rust 1.94. Pin to the last working release. ecow = "=0.2.6" typst = { version = "0.14.1" } typst-pdf = { version = "0.14.1" } typst-svg = { version = "0.14.1" } typst-as-lib = { version = "0.15.0", features = [] } unic-langid = "0.9" url = "2.5" urlencoding = "2.1" uuid = "1.18" # meteroid-oss fork of utoipa, published to crates.io as `meteroid-utoipa*` and aliased # back to `utoipa*` so the derive macros' generated `utoipa::` paths resolve unchanged. utoipa = { package = "meteroid-utoipa", version = "5.6.0", features = ["axum_extras", "uuid", "debug", "chrono", "decimal", "tagged_discriminator", "config"] } utoipa-config = { package = "meteroid-utoipa-config", version = "0.1.2" } utoipa-axum = { package = "meteroid-utoipa-axum", version = "0.2.0" } utoipa-scalar = { package = "meteroid-utoipa-scalar", version = "0.3.0", features = ["axum"] } validator = { version = "0.20.0" } zeroize = { version = "1.6", default-features = false, features = ["alloc"] } # TODO prefix it all golden = { path = "crates/golden" } common-build-info = { path = "crates/common-build-info" } common-domain = { path = "crates/common-domain" } common-config = { path = "crates/common-config" } common-eventbus = { path = "crates/common-eventbus" } common-logging = { path = "crates/common-logging" } common-grpc = { path = "crates/common-grpc" } common-grpc-error-as-tonic-macros = { path = "crates/common-grpc-error-as-tonic-macros" } common-grpc-error-as-tonic-macros-impl = { path = "crates/common-grpc-error-as-tonic-macros-impl" } metering-grpc = { path = "modules/metering/crates/metering-grpc" } meteroid-grpc = { path = "modules/meteroid/crates/meteroid-grpc" } common-utils = { path = "crates/common-utils" } distributed-lock = { path = "crates/distributed-lock", default-features = false } egress-guard = { path = "crates/egress-guard" } egress-http = { path = "crates/egress-http" } license-protocol = { path = "crates/license-protocol" } http-client-tracing = { path = "crates/http-client-tracing" } world-tax = { path = "crates/world-tax" } meteroid-money = { path = "crates/meteroid-money" } kafka = { path = "crates/kafka" } metering = { path = "modules/metering" } metering-server = { path = "modules/metering/crates/metering-server", default-features = false } metric-core = { path = "modules/metric-core" } diesel-models = { path = "modules/meteroid/crates/diesel-models" } diesel-schema = { path = "modules/meteroid/crates/diesel-schema" } meteroid-store = { path = "modules/meteroid/crates/meteroid-store" } meteroid-store-macros = { path = "modules/meteroid/crates/meteroid-store-macros" } meteroid-invoicing = { path = "modules/meteroid/crates/meteroid-invoicing" } meteroid-mailer = { path = "modules/meteroid/crates/meteroid-mailer" } meteroid-middleware = { path = "modules/meteroid/crates/meteroid-middleware" } stripe-client = { path = "modules/meteroid/crates/stripe-client" } gocardless-client = { path = "modules/meteroid/crates/gocardless-client" } stancer-client = { path = "modules/meteroid/crates/stancer-client" } mollie-client = { path = "modules/meteroid/crates/mollie-client" } meteroid-oauth = { path = "modules/meteroid/crates/meteroid-oauth" } meteroid-seeder = { path = "modules/meteroid/crates/meteroid-seeder" } meteroid-testkit = { path = "modules/meteroid/crates/meteroid-testkit" } meteroid-app = { path = "modules/meteroid/crates/meteroid-app" } meteroid-grpc-mapping = { path = "modules/meteroid/crates/meteroid-grpc-mapping" } meteroid-api = { path = "modules/meteroid/crates/meteroid-api" } meteroid-kit = { path = "modules/meteroid/crates/meteroid-kit" } meteroid-rest = { path = "modules/meteroid/crates/meteroid-rest" } meteroid-rest-common = { path = "modules/meteroid/crates/meteroid-rest-common" } meteroid-workers = { path = "modules/meteroid/crates/meteroid-workers" } hubspot-client = { path = "modules/meteroid/crates/hubspot-client" } pennylane-client = { path = "modules/meteroid/crates/pennylane-client" } meteroid-tax = { path = "modules/meteroid/crates/meteroid-tax" } meteroid-rs-dogfooding = { package = "meteroid-rs", version = "0.29.0" } rate-limiter = { path = "crates/rate-limiter" } redis-rate-limiter = { path = "crates/redis-rate-limiter" } [patch.crates-io]