Aleph-Alpha / ts-rs

Generate TypeScript bindings from Rust types
MIT License
1.08k stars 107 forks source link

bug: Using `#[ts(rename_all = "...")]` `snake_case`, `SCREAMING_SNAKE_CASE` and `kebab-case` is not compatible with serde #297

Closed escritorio-gustavo closed 5 months ago

escritorio-gustavo commented 6 months ago

Describe the bug A few months ago, issue #165 reported inconsistencies in the implementation of inflector's camelCase in comparison with serde's. It turns out its snake_case implementation is also not consistent, which affects snake_case, SCREAMING_SNAKE_CASE (a.k.a. snake_case.to_ascii_uppercase()) and kebab-case (a.k.a. snake_case.replace('_', "-")). Also, we're missing SCREAMING-KEBAB-CASE

To Reproduce

#[derive(TS, Default, serde::Serialize)]
#[ts(export, export_to = "struct_rename/", rename_all = "kebab-case")]
#[serde(rename_all = "kebab-case")]
struct RenameAllScreamingKebab {
    crc32c_hash: i32,
    some_field: i32,
    some_other_field: i32,
}

Expected behavior

export type RenameAllScreamingKebab = {
    "crc32c-hash": number,
    "some-field": number,
    "some-other-field": number,
};

Actual behavior

export type RenameAllScreamingKebab = {
    "crc-3-2c-hash": number,
    "some-field": number,
    "some-other-field": number,
};