Skip to content

[TD-02 follow-up] convert_case 3-way split is structural — pinned by Leptos internals + derive_more #485

@intendednull

Description

@intendednull

Follow-up to #251.

Big rock me investigate. convert_case make three crate live in tree: 0.6.0, 0.7.1, 0.10.0. Cargo update no help. All three already at latest of their major. Each major pinned by transitive crate we no own. Workspace [patch] no fix — only force-rebuild, no dedupe.

Current state (claude/friendly-maxwell-0olke)

$ cargo tree --target wasm32-unknown-unknown | grep -oE "convert_case v[0-9]+\.[0-9]+\.[0-9]+" | sort -u
convert_case v0.10.0
convert_case v0.6.0
convert_case v0.7.1

Same three on native target.

Who pin each version

Version Pinned by (req) Why we no can unify
0.6.0 server_fn_macro 0.7.8 (req "0.6.0") and config 0.15.22 (req "0.6.0", via leptos_config 0.7.8) Both pull from inside Leptos 0.7 stack. Even Leptos 0.7.9 (latest 0.7.x) still wire server_fn_macro 0.7.8. Bumping to Leptos 0.8 = framework major, breaking-change scope, way out of TD-02.
0.7.1 leptos_macro 0.7.9 (req "0.7") and reactive_stores_macro 0.1.8 (req "0.7", via reactive_stores/tachys) Same Leptos 0.7 stack — but two crate inside Leptos 0.7 already disagree with each other (server_fn_macro 0.6 vs leptos_macro 0.7). Even bumping to 0.8 not guarantee fix.
0.10.0 derive_more-impl 2.1.1 (req "0.10") Used by entire iroh stack (iroh, iroh-base, iroh-blobs, iroh-gossip, iroh-relay, iroh-tickets, n0-future, n0-watcher, netwatch, portmapper, noq, irpc). Bumping iroh major = breaking scope. Out of TD-02.

Why cargo update -p convert_case no help

$ cargo update -p convert_case@0.6.0
note: pass `--verbose` to see 40 unchanged dependencies behind latest

$ cargo update -p convert_case@0.7.1
note: pass `--verbose` to see 40 unchanged dependencies behind latest

$ cargo update -p convert_case@0.10.0
note: pass `--verbose` to see 40 unchanged dependencies behind latest

All three already at latest of their semver-compat range. Cargo no can pick single version because three transitive ^0.6 / ^0.7 / ^0.10 ranges no overlap.

Why workspace [patch] no help

[patch] only redirect source — it must still satisfy semver. We could not, e.g., make ^0.6 resolve to 0.10.x without forking convert_case crate itself and lying about its version. That break derive_more-impl API expectation (convert_case 0.6 → 0.10 has API breakage — the crate add Casing trait, rename methods, etc.).

The choice is: fork-and-lie (broken builds, maintenance burden), or accept three majors (small unique-per-major footprint, no functional risk).

What "fix" actually need

Three separate upstream domino, none in our control:

  1. Leptos 0.7 internal cleanup. leptos_macro and server_fn_macro need to align on same convert_case major. Already split inside Leptos 0.7.x. Probably never get fixed in 0.7 line.
  2. Leptos 0.8 upgrade. Framework major — own breaking-change PR. Even then, no guarantee convert_case unify (Leptos 0.8 not audited here).
  3. derive_more 2.x switch off convert_case or align with Leptos's choice. Pure upstream concern.

Until those land, three-version split structural.

What we could do, cosmetic (low value)

  • Add documentation note to top of Cargo.toml flag convert_case as known-multi-version. Pure paperwork. No build impact.
  • Wait for Leptos 0.8 migration (separate effort, separate scope).

Neither worth own PR.

Recommendation

Refs #251.

https://claude.ai/code/session_01FHLLfYeh9P9FP7Y47wu9We

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions