ktsu.StrongStrings
1.4.3-pre.10
Prefix Reserved
See the version list below for details.
dotnet add package ktsu.StrongStrings --version 1.4.3-pre.10
NuGet\Install-Package ktsu.StrongStrings -Version 1.4.3-pre.10
<PackageReference Include="ktsu.StrongStrings" Version="1.4.3-pre.10" />
<PackageVersion Include="ktsu.StrongStrings" Version="1.4.3-pre.10" />
<PackageReference Include="ktsu.StrongStrings" />
paket add ktsu.StrongStrings --version 1.4.3-pre.10
#r "nuget: ktsu.StrongStrings, 1.4.3-pre.10"
#addin nuget:?package=ktsu.StrongStrings&version=1.4.3-pre.10&prerelease
#tool nuget:?package=ktsu.StrongStrings&version=1.4.3-pre.10&prerelease
ktsu.StrongStrings
A transparent wrapper around strings that provides strong typing, compile-time feedback, and runtime validation.
Introduction
ktsu.StrongStrings
is a .NET library that provides a way to create strongly-typed wrappers around standard strings. It gives you the benefits of strong typing, compile-time feedback, and runtime validation while maintaining full compatibility with string operations. The intention is to provide usage context and validation to naked strings in a similar way that Enums do for integers.
Features
- Strong Typing: Create distinct types for different string usages (e.g., EmailAddress, UserId, Url)
- Compile-Time Safety: Prevent mixing of semantically different strings
- Runtime Validation: Apply custom validation rules that throw exceptions for invalid data
- Transparent Usage: Works with existing string APIs through implicit conversion
- String Operation Support: Full access to standard string methods and properties
- Immutability: Implemented as records for value semantics and immutability
Installation
Package Manager Console
Install-Package ktsu.StrongStrings
.NET CLI
dotnet add package ktsu.StrongStrings
Package Reference
<PackageReference Include="ktsu.StrongStrings" Version="x.y.z" />
Usage Examples
Basic Example
using ktsu.StrongStrings;
// Create a strong type by deriving a record class from StrongStringAbstract<TDerived>:
public record class MyStrongString : StrongStringAbstract<MyStrongString> { }
public class MyDemoClass
{
public MyStrongString Stronk { get; set; } = new();
public static void Demo(MyStrongString inStrongString, string inSystemString, out MyStrongString outStrongString, out string outSystemString)
{
// You can implicitly cast down to a System.String
outSystemString = inStrongString;
// You must explicitly cast up to a StrongString
outStrongString = (MyStrongString)inSystemString;
//You can provide a StrongString to a method that expects a System.String
Path.Combine(inStrongString, inSystemString);
// You can use the .WeakString property or the .ToString() method to get the value of the underlying System.String
outSystemString = inStrongString.WeakString;
outSystemString = inStrongString.ToString();
// You can not implicitly cast up to a StrongString
// outStrongString = inSystemString; // This will not compile
// You can not cast from one StrongString to another
// OtherStrongString other = inStrongString; // This will not compile
// OtherStrongString other = (OtherStrongString)inStrongString; // This will not compile either
}
}
Validation Example
public abstract class StartsWithHttp : IValidator
{
public static bool IsValid(AnyStrongString? strongString)
{
ArgumentNullException.ThrowIfNull(strongString);
return strongString.StartsWith("http", StringComparison.InvariantCultureIgnoreCase);
}
}
public abstract class EndsWithDotCom : IValidator
{
public static bool IsValid(AnyStrongString? strongString)
{
ArgumentNullException.ThrowIfNull(strongString);
return strongString.EndsWith(".com", StringComparison.InvariantCultureIgnoreCase);
}
}
public record class MyValidatedString : StrongStringAbstract<MyValidatedString, StartsWithHttp, EndsWithDotCom> { }
// This will work:
MyValidatedString valid = (MyValidatedString)"http://example.com";
// This will throw a FormatException:
MyValidatedString invalid = (MyValidatedString)"ftp://example.net";
Advanced Usage
Creating Domain-Specific String Types
using ktsu.StrongStrings;
// Define validators
public abstract class ValidEmail : IValidator
{
private static readonly Regex EmailRegex = new Regex(@"^[^@\s]+@[^@\s]+\.[^@\s]+$");
public static bool IsValid(AnyStrongString? strongString)
{
ArgumentNullException.ThrowIfNull(strongString);
return EmailRegex.IsMatch(strongString.ToString());
}
}
// Create domain-specific types
public record class EmailAddress : StrongStringAbstract<EmailAddress, ValidEmail> { }
public record class Username : StrongStringAbstract<Username> { }
public record class UserId : StrongStringAbstract<UserId> { }
// Use in a service
public class UserService
{
public User GetUser(UserId id) { /* ... */ }
public void SendEmail(EmailAddress to, string subject) { /* ... */ }
// Type safety ensures you can't pass a Username where UserId is expected
}
Modifying Strong Strings
// Strong strings are immutable, but you can create new ones with modifications
public record class Path : StrongStringAbstract<Path> { }
Path basePath = (Path)"/home/user";
// Add prefixes or suffixes
Path documentsPath = basePath.WithSuffix("/documents"); // "/home/user/documents"
Path etcPath = (Path)"/etc".WithSuffix("/config"); // "/etc/config"
// Combine with standard string methods
Path combined = (Path)(basePath + "/downloads"); // "/home/user/downloads"
API Reference
StrongStringAbstract<TDerived>
The base class for creating strongly-typed strings.
Properties
Name | Type | Description |
---|---|---|
WeakString |
string |
The underlying string value |
Length |
int |
Length of the string |
Methods
Name | Return Type | Description |
---|---|---|
IsEmpty() |
bool |
Checks if the string is empty |
IsValid() |
bool |
Validates the string against defined validators |
WithPrefix(string) |
TDerived |
Creates a new instance with the specified prefix |
WithSuffix(string) |
TDerived |
Creates a new instance with the specified suffix |
* |
* |
All standard string methods are available |
IValidator Interface
Interface for implementing custom validation rules.
Methods
Name | Return Type | Description |
---|---|---|
IsValid(AnyStrongString?) |
bool |
Static method that validates a string |
Contributing
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
Please make sure to update tests as appropriate.
License
This project is licensed under the MIT License - see the LICENSE.md file for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (5)
Showing the top 5 NuGet packages that depend on ktsu.StrongStrings:
Package | Downloads |
---|---|
ktsu.Extensions
A collection of useful extension methods for .NET types including strings, collections, dictionaries, enumerables, and reflection. |
|
ktsu.StrongPaths
A library that provides strong typing for common filesystem paths providing compile time feedback and runtime validation. |
|
ktsu.AppDataStorage
Application data management library using JSON serialization to save and load data in the user's app data folder. |
|
ktsu.CredentialCache
CredentialCache |
|
ktsu.GitIntegration
Git Integration |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.4.3-pre.17 | 0 | 5/20/2025 |
1.4.3-pre.15 | 32 | 5/17/2025 |
1.4.3-pre.14 | 112 | 5/16/2025 |
1.4.3-pre.13 | 179 | 5/15/2025 |
1.4.3-pre.12 | 182 | 5/14/2025 |
1.4.3-pre.11 | 184 | 5/13/2025 |
1.4.3-pre.10 | 215 | 5/12/2025 |
1.4.3-pre.9 | 154 | 5/11/2025 |
1.4.3-pre.8 | 93 | 5/10/2025 |
1.4.3-pre.7 | 37 | 5/9/2025 |
1.4.3-pre.6 | 111 | 5/8/2025 |
1.4.3-pre.5 | 110 | 5/7/2025 |
1.4.3-pre.4 | 107 | 5/6/2025 |
1.4.3-pre.3 | 107 | 5/5/2025 |
1.4.3-pre.2 | 105 | 5/4/2025 |
1.4.3-pre.1 | 107 | 5/4/2025 |
1.4.2 | 197 | 5/4/2025 |
1.4.2-pre.1 | 47 | 4/26/2025 |
1.4.1 | 378 | 4/26/2025 |
1.4.1-pre.1 | 109 | 4/4/2025 |
1.4.0 | 1,904 | 3/30/2025 |
1.3.1-pre.2 | 66 | 3/29/2025 |
1.3.1-pre.1 | 450 | 3/25/2025 |
1.3.0 | 2,522 | 2/17/2025 |
1.2.27-pre.3 | 67 | 2/6/2025 |
1.2.27-pre.2 | 55 | 2/5/2025 |
1.2.27-pre.1 | 59 | 2/5/2025 |
1.2.26 | 6,444 | 12/28/2024 |
1.2.26-pre.26 | 52 | 2/4/2025 |
1.2.26-pre.25 | 57 | 2/3/2025 |
1.2.26-pre.24 | 60 | 2/2/2025 |
1.2.26-pre.23 | 56 | 1/31/2025 |
1.2.26-pre.22 | 49 | 1/29/2025 |
1.2.26-pre.21 | 53 | 1/27/2025 |
1.2.26-pre.20 | 56 | 1/25/2025 |
1.2.26-pre.19 | 54 | 1/23/2025 |
1.2.26-pre.18 | 52 | 1/21/2025 |
1.2.26-pre.17 | 52 | 1/20/2025 |
1.2.26-pre.16 | 52 | 1/19/2025 |
1.2.26-pre.15 | 44 | 1/17/2025 |
1.2.26-pre.14 | 42 | 1/15/2025 |
1.2.26-pre.13 | 46 | 1/13/2025 |
1.2.26-pre.12 | 50 | 1/11/2025 |
1.2.26-pre.11 | 48 | 1/10/2025 |
1.2.26-pre.10 | 51 | 1/10/2025 |
1.2.26-pre.9 | 43 | 1/8/2025 |
1.2.26-pre.8 | 55 | 1/7/2025 |
1.2.26-pre.7 | 56 | 1/6/2025 |
1.2.26-pre.6 | 73 | 1/4/2025 |
1.2.26-pre.5 | 57 | 1/3/2025 |
1.2.26-pre.4 | 58 | 1/3/2025 |
1.2.26-pre.3 | 62 | 1/3/2025 |
1.2.26-pre.2 | 67 | 1/1/2025 |
1.2.26-pre.1 | 57 | 12/27/2024 |
1.2.25 | 1,820 | 12/26/2024 |
1.2.24 | 90 | 12/26/2024 |
1.2.23 | 90 | 12/26/2024 |
1.2.22 | 88 | 12/26/2024 |
1.2.21 | 85 | 12/26/2024 |
1.2.20 | 101 | 12/26/2024 |
1.2.19 | 100 | 12/26/2024 |
1.2.18 | 2,260 | 12/23/2024 |
1.2.17 | 90 | 12/23/2024 |
1.2.16 | 96 | 12/23/2024 |
1.2.15 | 1,955 | 12/4/2024 |
1.2.14 | 569 | 12/2/2024 |
1.2.13 | 577 | 11/30/2024 |
1.2.12 | 97 | 11/30/2024 |
1.2.11 | 702 | 11/20/2024 |
1.2.10 | 1,136 | 11/13/2024 |
1.2.9 | 912 | 11/1/2024 |
1.2.8 | 1,633 | 10/4/2024 |
1.2.7 | 891 | 9/19/2024 |
1.2.6 | 329 | 9/19/2024 |
1.2.5 | 256 | 9/19/2024 |
1.2.4 | 113 | 9/18/2024 |
1.2.3 | 116 | 9/18/2024 |
1.2.2 | 218 | 9/18/2024 |
1.2.1 | 417 | 9/18/2024 |
1.2.0 | 540 | 9/18/2024 |
1.1.1 | 422 | 9/14/2024 |
1.1.0 | 107 | 9/14/2024 |
## v1.4.3-pre.10 (prerelease)
Incremental prerelease update.
## v1.4.3-pre.9 (prerelease)
Changes since v1.4.3-pre.8:
## v1.4.3-pre.8 (prerelease)
Changes since v1.4.3-pre.7:
## v1.4.3-pre.7 (prerelease)
Changes since v1.4.3-pre.6:
## v1.4.3-pre.6 (prerelease)
Changes since v1.4.3-pre.5:
## v1.4.3-pre.5 (prerelease)
Changes since v1.4.3-pre.4:
## v1.4.3-pre.4 (prerelease)
Changes since v1.4.3-pre.3:
## v1.4.3-pre.3 (prerelease)
Changes since v1.4.3-pre.2:
## v1.4.3-pre.2 (prerelease)
Changes since v1.4.3-pre.1:
## v1.4.3-pre.1 (prerelease)
Changes since v1.4.2:
- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.4.2 (patch)
Changes since v1.4.1:
- Update project SDK references in StrongStrings and StrongStrings.Test ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove Directory.Build.props and Directory.Build.targets files; add copyright notices to StrongStrings source files and tests; delete unused PowerShell scripts for versioning and changelog generation. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.4.2-pre.1 (prerelease)
Incremental prerelease update.
## v1.4.1 (patch)
Changes since v1.4.0:
- Update README to match standard template format ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.4.1-pre.1 (prerelease)
Incremental prerelease update.
## v1.4.0 (minor)
Changes since v1.3.0:
- Add LICENSE template ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.3.1-pre.2 (prerelease)
Changes since v1.3.1-pre.1:
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.1-pre.1 (prerelease)
Changes since v1.3.0:
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.3.0 (minor)
Changes since v1.2.0:
- Suppress CA1859 warning and re-indent PreBuild target ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix concurrency and run every 5 mins ([@matt-edmondson](https://github.com/matt-edmondson))
- Change build schedule to nightly and on push ([@matt-edmondson](https://github.com/matt-edmondson))
- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor MakeCanonical and As methods in AnyStrongString ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor assertions and add suppress warnings ([@matt-edmondson](https://github.com/matt-edmondson))
- Add conditional build arguments for dotnet build command ([@matt-edmondson](https://github.com/matt-edmondson))
- Update namespace from ktsu.io.StrongStrings to ktsu.StrongStrings ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor build argument assignment in dotnet.yml for clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Apply new editorconfig ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AnyStrongString with MakeCanonical method ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.27-pre.3 (prerelease)
Changes since v1.2.27-pre.2:
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.27-pre.2 (prerelease)
Changes since v1.2.27-pre.1:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.27-pre.1 (prerelease)
Changes since v1.2.26:
- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor build argument assignment in dotnet.yml for clarity ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.26 (patch)
Changes since v1.2.25:
- Add conditional build arguments for dotnet build command ([@matt-edmondson](https://github.com/matt-edmondson))
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.26-pre.26 (prerelease)
Changes since v1.2.26-pre.25:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.25 (prerelease)
Changes since v1.2.26-pre.24:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.24 (prerelease)
Changes since v1.2.26-pre.23:
## v1.2.26-pre.23 (prerelease)
Changes since v1.2.26-pre.22:
## v1.2.26-pre.22 (prerelease)
Changes since v1.2.26-pre.21:
## v1.2.26-pre.21 (prerelease)
Changes since v1.2.26-pre.20:
- Bump MSTest from 3.7.2 to 3.7.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.26-pre.20 (prerelease)
Changes since v1.2.26-pre.19:
## v1.2.26-pre.19 (prerelease)
Changes since v1.2.26-pre.18:
## v1.2.26-pre.18 (prerelease)
Changes since v1.2.26-pre.17:
- Bump MSTest from 3.7.1 to 3.7.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.26-pre.17 (prerelease)
Changes since v1.2.26-pre.16:
- Bump coverlet.collector from 6.0.3 to 6.0.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.26-pre.16 (prerelease)
Changes since v1.2.26-pre.15:
## v1.2.26-pre.15 (prerelease)
Changes since v1.2.26-pre.14:
## v1.2.26-pre.14 (prerelease)
Changes since v1.2.26-pre.13:
## v1.2.26-pre.13 (prerelease)
Changes since v1.2.26-pre.12:
- Bump MSTest from 3.7.0 to 3.7.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.26-pre.12 (prerelease)
Changes since v1.2.26-pre.11:
## v1.2.26-pre.11 (prerelease)
Changes since v1.2.26-pre.10:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.10 (prerelease)
Changes since v1.2.26-pre.9:
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.9 (prerelease)
Changes since v1.2.26-pre.8:
## v1.2.26-pre.8 (prerelease)
Changes since v1.2.26-pre.7:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.7 (prerelease)
Changes since v1.2.26-pre.6:
## v1.2.26-pre.6 (prerelease)
Changes since v1.2.26-pre.5:
## v1.2.26-pre.5 (prerelease)
Changes since v1.2.26-pre.4:
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.4 (prerelease)
Changes since v1.2.26-pre.3:
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.26-pre.3 (prerelease)
Changes since v1.2.26-pre.2:
- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.26-pre.2 (prerelease)
Changes since v1.2.26-pre.1:
- Add conditional build arguments for dotnet build command ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor build argument assignment in dotnet.yml for clarity ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.26-pre.1 (prerelease)
Incremental prerelease update.
## v1.2.25 (patch)
Changes since v1.2.24:
- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.24 (patch)
Changes since v1.2.23:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.23 (patch)
Changes since v1.2.22:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.22 (patch)
Changes since v1.2.21:
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.21 (patch)
Changes since v1.2.20:
- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.20 (patch)
Changes since v1.2.19:
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.19 (patch)
Changes since v1.2.18:
- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.18 (patch)
Changes since v1.2.17:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.17 (patch)
Changes since v1.2.16:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.16 (patch)
Changes since v1.2.15:
- Refactor assertions and add suppress warnings ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.15 (patch)
Changes since v1.2.14:
- Bump MSTest.TestAdapter from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestFramework from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.14 (patch)
Changes since v1.2.13:
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.13 (patch)
Changes since v1.2.12:
- Refactor MakeCanonical and As methods in AnyStrongString ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.12 (patch)
Changes since v1.2.11:
- Suppress CA1859 warning and re-indent PreBuild target ([@matt-edmondson](https://github.com/matt-edmondson))
- Update namespace from ktsu.io.StrongStrings to ktsu.StrongStrings ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AnyStrongString with MakeCanonical method ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.11 (patch)
Changes since v1.2.10:
- Bump Microsoft.NET.Test.Sdk in the microsoft group ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestFramework from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.10 (patch)
Changes since v1.2.9:
- Bump MSTest.TestAdapter from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.9 (patch)
Changes since v1.2.8:
- Bump MSTest.TestAdapter from 3.6.1 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestFramework from 3.6.0 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.8 (patch)
Changes since v1.2.7:
- Bump MSTest.TestAdapter from 3.6.0 to 3.6.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.7 (patch)
Changes since v1.2.6:
- Change build schedule to nightly and on push ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.6 (patch)
Changes since v1.2.5:
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix concurrency and run every 5 mins ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.2.5 (patch)
Changes since v1.2.4:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.4 (patch)
Changes since v1.2.3:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.3 (patch)
Changes since v1.2.2:
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.2 (patch)
Changes since v1.2.1:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestFramework from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestAdapter from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.2.1 (patch)
Changes since v1.2.0:
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.2.0 (minor)
Changes since 1.1.0:
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Add an As method to convert between different types of string strings ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.1 (major)
- Add builtin json convertor for System.Text.Json ([@matt-edmondson](https://github.com/matt-edmondson))
- Add github package support ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate from .project.props to Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Use environment files for reading VERSION as set-output is deprecated ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial commit ([@matt-edmondson](https://github.com/matt-edmondson))
- Update github workflow to support submodules ([@matt-edmondson](https://github.com/matt-edmondson))
- Use environment files for reading VERSION as set-output is deprecated ([@matt-edmondson](https://github.com/matt-edmondson))
- Dont try to push packages when building pull requests ([@matt-edmondson](https://github.com/matt-edmondson))
- Code style cleanup and add symbols and source to the nuget package ([@matt-edmondson](https://github.com/matt-edmondson))
- Use environment files for reading VERSION as set-output is deprecated ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Update readme and description ([@matt-edmondson](https://github.com/matt-edmondson))
- Make code generation use csx rather than t4 so that it works with Rider ([@matt-edmondson](https://github.com/matt-edmondson))
- Use environment files for reading VERSION as set-output is deprecated ([@matt-edmondson](https://github.com/matt-edmondson))
- Add more unit tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Create dependabot-merge.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix a bunch of interface problems and add a unit test project ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from AUTHORS file during build ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README.md ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build config ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove obsolete t4 junk from project file ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove suffix methods with are now in ktsu.io.Extensions, and do a cleanup of old cruft ([@matt-edmondson](https://github.com/matt-edmondson))
- Enable dependabot and sourcelink ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix build to properly read variables from files ([@matt-edmondson](https://github.com/matt-edmondson))
- Use environment files for reading VERSION as set-output is deprecated ([@matt-edmondson](https://github.com/matt-edmondson))
- Test signing ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from VERSION when building ([@matt-edmondson](https://github.com/matt-edmondson))
- Correct a typo in the namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Formatted with resharper and add t4 templating for the inheritance hierarchy ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement the full interface of System.String and add support for validators ([@matt-edmondson](https://github.com/matt-edmondson))
- Use fully qualified names for templated types to avoid having to provide the namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Rearrange the interface/base class to make using it as a parameter, casting to derived types, and calling statics easier ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from VERSION when building ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove old resharper settings ([@matt-edmondson](https://github.com/matt-edmondson))
- v1.0.0-alpha.6 ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor empty array returns in AnyStrongString ([@matt-edmondson](https://github.com/matt-edmondson))
- Add a JsonConverter for use with System.Text.Json ([@matt-edmondson](https://github.com/matt-edmondson))
- Upgrade actions ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix some style warnings ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README.md ([@matt-edmondson](https://github.com/matt-edmondson))
- Assign dependabot PRs to matt ([@matt-edmondson](https://github.com/matt-edmondson))
- Bump version to 1.0.0-alpha.2 ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.targets ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README.md ([@matt-edmondson](https://github.com/matt-edmondson))
- Read PackageDescription from DESCRIPTION file ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Avoid double upload of symbols package ([@matt-edmondson](https://github.com/matt-edmondson))
- Rearrange the inheritance hierarchy to be better and split out tests into categories ([@matt-edmondson](https://github.com/matt-edmondson))