From 868931fefc8ef43c146350e057d0daa0b4d48f60 Mon Sep 17 00:00:00 2001 From: "Per Christian B. Viken" Date: Fri, 3 Oct 2025 19:25:10 +0200 Subject: [PATCH] refactor(lib, tool): Make kebab-case the default casing Fixes #166 --- CHANGELOG.md | 1 + TypeContractor.Tests/TypeScript/ApiClientWriterTests.cs | 4 ++-- TypeContractor.Tests/TypeScript/TypeScriptConverterTests.cs | 2 +- TypeContractor.Tool/Program.cs | 2 +- TypeContractor/Casing.cs | 4 ++-- TypeContractor/Helpers/CasingHelpers.cs | 6 +++--- TypeContractor/TypeContractorConfiguration.cs | 2 +- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e21e937..09714ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Move to xUnit v3 (#162) - Generate Zod v4 schemas (#168) - Use `globalThis.Response` instead of `Response` to avoid conflicts (#147) +- Set kebab-case as the default casing (#166) ## [0.17.4.1] - 2025-09-19 diff --git a/TypeContractor.Tests/TypeScript/ApiClientWriterTests.cs b/TypeContractor.Tests/TypeScript/ApiClientWriterTests.cs index f987d4d..0bb8510 100644 --- a/TypeContractor.Tests/TypeScript/ApiClientWriterTests.cs +++ b/TypeContractor.Tests/TypeScript/ApiClientWriterTests.cs @@ -357,8 +357,8 @@ public void Avoids_Duplicate_Imports_With_Same_ReturnType_And_Parameter() var file = File.ReadAllText(result).Trim(); file.Should() .NotBeEmpty() - .And.Contain("import { PersonDto, PersonDtoSchema } from '~/TypeContractor/Tests/TypeScript/PersonDto';") - .And.NotContain("import { PersonDto } from '~/TypeContractor/Tests/TypeScript/PersonDto';") + .And.Contain("import { PersonDto, PersonDtoSchema } from '~/type-contractor/tests/type-script/person-dto';") + .And.NotContain("import { PersonDto } from '~/type-contractor/tests/type-script/person-dto';") .And.Contain("export class TestClient {") .And.Contain("public async update(request: PersonDto, cancellationToken: AbortSignal = null): Promise {") .And.Contain("const url = new URL('test', window.location.origin);") diff --git a/TypeContractor.Tests/TypeScript/TypeScriptConverterTests.cs b/TypeContractor.Tests/TypeScript/TypeScriptConverterTests.cs index fd6b700..2c980bb 100644 --- a/TypeContractor.Tests/TypeScript/TypeScriptConverterTests.cs +++ b/TypeContractor.Tests/TypeScript/TypeScriptConverterTests.cs @@ -157,7 +157,7 @@ public void Nested_Classes_Gets_DeclaringType_As_Folder_Prefix() result.Should().NotBeNull(); result.Name.Should().Be("Response"); - result.ContractedType.Folder.Path.Should().EndWith("YearSummary"); + result.ContractedType.Folder.Path.Should().EndWith("year-summary"); } [Fact] diff --git a/TypeContractor.Tool/Program.cs b/TypeContractor.Tool/Program.cs index 34f47a6..7535040 100644 --- a/TypeContractor.Tool/Program.cs +++ b/TypeContractor.Tool/Program.cs @@ -21,7 +21,7 @@ var buildZodSchemasOptions = new Option("--build-zod-schemas", () => false, "Enable experimental support for Zod schemas alongside generated types."); var generateApiClientsOptions = new Option("--generate-api-clients", () => false, "Enable experimental support for auto-generating API clients for each endpoint."); var apiClientsTemplateOptions = new Option("--api-client-template", () => "aurelia", "Template to use for API clients. Either 'aurelia', 'react-axios' (built-in) or a path to a Handlebars file, including extension"); -var casingOptions = new Option("--casing", () => Casing.Pascal, "Casing to use for generated file names"); +var casingOptions = new Option("--casing", () => Casing.Kebab, "Casing to use for generated file names"); assemblyOption.IsRequired = true; outputOption.IsRequired = true; diff --git a/TypeContractor/Casing.cs b/TypeContractor/Casing.cs index 8bf2de7..9bee9f4 100644 --- a/TypeContractor/Casing.cs +++ b/TypeContractor/Casing.cs @@ -1,9 +1,9 @@ -namespace TypeContractor; +namespace TypeContractor; public enum Casing { /// - /// PascalCase (default) + /// PascalCase /// Pascal, diff --git a/TypeContractor/Helpers/CasingHelpers.cs b/TypeContractor/Helpers/CasingHelpers.cs index bf20980..557ec3d 100644 --- a/TypeContractor/Helpers/CasingHelpers.cs +++ b/TypeContractor/Helpers/CasingHelpers.cs @@ -7,7 +7,7 @@ namespace TypeContractor.Helpers; internal partial class CasingHelpers { [GeneratedRegex(@"(? SeperateWordsWithRegex().Replace(input, "_").ToLower(_cultureInfo); + private static string ToSnakeCase(string input) => SeparateWordsWithRegex().Replace(input, "_").ToLower(_cultureInfo); - private static string ToKebabCase(string input) => SeperateWordsWithRegex().Replace(input, "-").ToLower(_cultureInfo); + private static string ToKebabCase(string input) => SeparateWordsWithRegex().Replace(input, "-").ToLower(_cultureInfo); } diff --git a/TypeContractor/TypeContractorConfiguration.cs b/TypeContractor/TypeContractorConfiguration.cs index c055752..69027ba 100644 --- a/TypeContractor/TypeContractorConfiguration.cs +++ b/TypeContractor/TypeContractorConfiguration.cs @@ -30,7 +30,7 @@ public class TypeContractorConfiguration public bool GenerateApiClients => _apiClients.Count != 0; public IReadOnlyList ApiClients => _apiClients.AsReadOnly(); public string ApiClientTemplate => _apiClientTemplate ?? "aurelia"; - public Casing Casing => _casing ?? Casing.Pascal; + public Casing Casing => _casing ?? Casing.Kebab; /// /// Set up a default configuration using and