Releases: kevin-lee/extras
v0.50.1
0.50.1 - 2025-12-27
Bug Fixes
- [
extras-core]extras.core.syntax.allis missingpredefsin Scala 2 (#599)
What's Changed
- Update README and API docs: Rename Elvis Operator in Scala 2 to Crying Elvis Operator by @kevin-lee in #597
- Update image alt text and link in changelog
0.50.0by @kevin-lee in #598 - Close #599: [
extras-core]extras.core.syntax.allis missingpredefsin Scala 2 by @kevin-lee in #600 - extras v0.50.1 by @kevin-lee in #601
Full Changelog: v0.50.0...v0.50.1
v0.50.0
0.50.0 - 2025-12-25 🎄🎁
New Features
-
[
extras-core] Add the Elvis operator (?:) toextras.core.syntaxfor Scala 3 (#580)val a: String | Null = "blah" a ?: "Unknown" // String = "blah"
val a: String | Null = null a ?: "Unknown" // String = "Unknown"
val a: String | Null = "blah" a ?: { println("Hello!"); "Unknown" } // String = "blah"
val a: String | Null = null a ?: { println("Hello!"); "Unknown" } // Hello! // String = "Unknown"
-
[
extras-core] Add the Crying Elvis Operator (?:=) toextras.core.syntaxfor Scala 2 (#594)-
Unlike Scala 3's extension methods, in Scala 2, extension methods are just regular methods in an implicit value class. As a result, method names ending with
:are right-associative, soa ?: bis evaluated asb.?:(a).Since we need the possibly-null value (
a) to be the receiver, the operator is provided as?:=(not ending with:), soa ?:= bis evaluated asa.?:=(b). -
Scala 2 doesn't have union types like
A | Null, so this operates on a plainAvalue that may benullat runtime. -
Also, for compatibility with Scala 2 code, Scala 3
predefsshould have?:=as an alias for?:.
val a = "blah" a ?:= "Unknown" // String = "blah"
val a: String = null a ?:= "Unknown" // String = "Unknown"
val a = "blah" a ?:= { println("Hello!"); "Unknown" } // String = "blah"
val a: String = null a ?:= { println("Hello!"); "Unknown" } // Hello! // String = "Unknown"
-
Changes
-
Rename
extras.core.syntax.stringtoextras.core.syntax.strings(#578)Also, replace the
package objectforextras.core.syntaxwith a package namedextras.core.syntax.
Internal Housekeeping
- Upgrade
doobiefor cats-effect 3 to1.0.0-RC10(#587)
-
Update libraries (#591)
- Update
catsto2.13.0 - Update
cats-effect3 to3.6.3 - Update
kittensto3.5.0 - Update
circeto0.14.13 - Update
fs2v3 to3.12.2 - Update
hedgehog-extrato0.19.0 - Update
embedded-postgresto2.2.0 - Update
effectieto2.3.0
- Update
What's Changed
- Upgrade: Bump actions/checkout from 4 to 5 by @dependabot[bot] in #576
- Upgrade: Bump actions/setup-java from 4 to 5 by @dependabot[bot] in #575
- Bump sbt to 1.11.5 by @kevin-lee in #577
- Close #578: Rename
extras.core.syntax.stringtoextras.core.syntax.stringsby @kevin-lee in #579 - Close #580: [
extras-core] Add the Elvis operator (?:) toextras.core.syntaxfor Scala 3 by @kevin-lee in #581 - Upgrade: Bump actions/setup-node from 4 to 5 by @dependabot[bot] in #582
- Bump
sbtto1.11.6by @kevin-lee in #583 - Upgrade: Bump actions/setup-node from 5 to 6 by @dependabot[bot] in #584
- Close #587: Upgrade doobie for cats-effect 3 to
1.0.0-RC10by @kevin-lee in #588 - Bump sbt and sbt plugins by @kevin-lee in #589
- Update tests for
?:syntax in Scala 3 by @kevin-lee in #590 - Upgrade: Bump actions/checkout from 5 to 6 by @dependabot[bot] in #585
- Upgrade: Bump actions/cache from 4 to 5 by @dependabot[bot] in #586
- Close #591: Update dependency libraries by @kevin-lee in #592
- Update Scala version for documentation generation (
2.13.18) by @kevin-lee in #593 - Close #594: [
extras-core] Add the Elvis operator (?:=) toextras.core.syntaxfor Scala 2 by @kevin-lee in #595 - extras v0.50.0 by @kevin-lee in #596
Full Changelog: v0.49.0...v0.50.0
v0.49.0
0.49.0 - 2025-08-19
New Features
- [extras-testing-tools] Support Scala Native (#572)
StubToolsis not included becauseThread.currentThread.getStackTrace.toListreturns an emptyList.
What's Changed
- Update GitHub Actions config to remove incorrect env var logging by @kevin-lee in #570
- Refactor coverage config and simplify build script by @kevin-lee in #571
- Close #572: [
extras-testing-tools] Support Scala Native by @kevin-lee in #573 - extras v0.49.0 by @kevin-lee in #574
Full Changelog: v0.48.0...v0.49.0
v0.48.0
0.48.0 - 2025-08-15
New Features
- Support Scala Native (#567)
What's Changed
- Remove
.jvmoptsby @kevin-lee in #566 - Close #567: Support Scala Native by @kevin-lee in #568
- extras v0.48.0 by @kevin-lee in #569
Full Changelog: v0.47.0...v0.48.0
v0.47.0
0.47.0 - 2025-08-06
New Features
- [
extras-testing-tools] AddScala.jssupport (#560)
-
[
extras-testing-tools] Add compile-time error check for Scala 2 (#562)CompileTimeError.from( "some Scala code causing a compile-time error" ) // String = "compile-time error message"
What's Changed
- Update: docs -
README.mdand intro.md with the Maven Central badges by @kevin-lee in #557 - Update: docs by @kevin-lee in #558
- Update: docs - with
Renderfrom anotherRenderby @kevin-lee in #559 - Close #560: [
extras-testing-tools] AddScala.jssupport by @kevin-lee in #561 - Update: GitHub Actions config - with
JAVA_OPTS,JVM_OPTSandSBT_OPTSby @kevin-lee in #563 - Close #562: [
extras-testing-tools] Add compile-time error check for Scala 2 by @kevin-lee in #564 - extras v0.47.0 by @kevin-lee in #565
Full Changelog: v0.46.1...v0.47.0
v0.46.1
0.46.1 - 2025-07-27
Bug Fixed
-
[
extras-render].renderextension method doesn't work well when there's a method with the same name exists in the context in Scala 3 (#554)- Version:
0.46.0 - Scala Version:
3 - Java Version:
n/a
The following code
import extras.render.Render import extras.render.syntax.* final case class JdkByCs( version: JdkByCs.Version, ) derives CanEqual object JdkByCs { extension (jdkByCs: JdkByCs) { def render: String = s"JdkByCs(version=${jdkByCs.version.render})" // <= this .render fails! } type Version = Version.Type object Version extends Newtype[SemVer | DecVer | DotSeparatedVersion] { extension (version: Version) { def major: MajorVersion = version.value match { case SemVer(m, n, _, _, _) => MajorVersion(if (m.value == 1) n.value else m.value) case DecVer(m, n, _, _) => MajorVersion(if (m.value == 1) n.value else m.value) case DotSeparatedVersion(v, vs) => val vNum = v.toInt MajorVersion( if vNum == 1 then vs.take(1) .headOption .filter(_.forall(_.isDigit)) .fold(vNum)(_.toInt) else vNum ) } } given renderVersion: Render[Version] with { def render(a: Version): String = a.value match { case v: SemVer => SemVer.render(v) case v: DecVer => DecVer.render(v) case DotSeparatedVersion(v, vs) => s"$v.${vs.mkString(".")}" } } } }
fails in compilation with an error like
[error] -- [E008] Not Found Error: /home/runner/work/jdk-sym-link/jdk-sym-link/modules/jdk-sym-link-core/src/main/scala/jdksymlink/cs/CoursierCmd.scala:90:103 [error] 90 | s"""JdkByCs(version=${jdkByCs.version.render}) [error] | ^^^^^^^^^^^^^^^^^^^^^^ [error] |value render is not a member of jdksymlink.cs.CoursierCmd.JdkByCs.Version. [error] |An extension method was tried, but could not be fully constructed: [error] | [error] | jdksymlink.cs.CoursierCmd.JdkByCs.render(jdkByCs.version) [error] | [error] | failed with: [error] | [error] | Found: (jdkByCs.version : jdksymlink.cs.CoursierCmd.JdkByCs.Version) [error] | Required: jdksymlink.cs.CoursierCmd.JdkByCs-
Cause:
Although it's an extension method with the name
renderforJdkByCs, it looks like this extension methodextension (jdkByCs: JdkByCs) { def render: String = s"""JdkByCs(version=${jdkByCs.version.render})" // <= this .render fails! }
has precedence over the extension method of the same name for
JdkByCs.Version. -
Solution:
Revert the
renderextension method for Scala 3 back to animplicit value class.
- Version:
What's Changed
- Fix #554: [
extras-render].renderextensionmethod doesn't work well when there's a method with the same name exists in the context in Scala 3 by @kevin-lee in #555 - extras v0.46.1 by @kevin-lee in #556
Full Changelog: v0.46.0...v0.46.1
v0.46.0
0.46.0 - 2025-07-27
New Features
-
[
extras-render] Add a new implementation ofRenderfor Scala 3 using Scala 3 syntax (#543)- Get rid of
implicitsyntax- Use
usingandsummon. - Use type-class syntax.
- Use
extensionmethod syntax.
- Use
- Use
opaque type.
- Get rid of
-
[
extras-render] Provide an optional instance ofcats.Contravariant[Render](#545)- The instance of
cats.Contravariant[Render]is available only if thecatslibrary is included in the project. Without it, attempting to use or access the instance of thecats.Contravariant[Render]type class causes a "compile-time" error. - Although
Renderhas acontramapextension method, it’s still a good idea to provide an instance ofcats.Contravariant. Since I don’t wantextras-renderto depend on Cats by default, I want to make it optional using sbt’sOptionaldependency feature.
- The instance of
Internal Housekeeping
- Upgrade
hedgehogandhedgehog-extra(#549)hedgehogto0.10.1hedgehog-extrato0.11.0
What's Changed
- Remove
package-lock.jsonby @kevin-lee in #538 - Bump
sbt-devoopsto3.2.1by @kevin-lee in #539 - Upgrade Docusaurus to version 3.8.1 and migrate to TypeScript by @kevin-lee in #540
- Bump sbt to
1.11.3by @kevin-lee in #541 - Update docs: Replace outdated 47deg.com URLs with current xebia.com URLs by @kevin-lee in #542
- Close #543: [extras-render] Add a new implementation of Render for Scala 3 using Scala 3 syntax by @kevin-lee in #544
- Update Scala version from 2.13.10 to 2.13.12 in GitHub Actions config by @kevin-lee in #547
- Close #545: [
extras-render] Provide an optional instance ofcats.Contravariant[Render]by @kevin-lee in #546 - Update GitHub Actions: Refactor GitHub workflow triggers by @kevin-lee in #548
- Close #549: Upgrade
hedgehogandhedgehog-extraby @kevin-lee in #550 - Update: GitHub Actions - Increase JVM heap size to 8G and consolidate coverage reporting by @kevin-lee in #551
- Update: GitHub Actions - Add manual trigger to coverage workflow by @kevin-lee in #552
- extras v0.46.0 by @kevin-lee in #553
Full Changelog: v0.45.0...v0.46.0
v0.45.0
0.45.0 - 2025-06-23
Internal Housekeeping
New Features
- Add Scala.js support (#522)
What's Changed
- Update docs -
cases.md-casessyntax from extras-string by @kevin-lee in #494 - Update: docs - badge for
extras-stringby @kevin-lee in #495 - Update docs -
cases.md-Seq[String]toPascalCaseStringby @kevin-lee in #496 - Update docs -
cases.md-Seq[String]tocamelCaseStringby @kevin-lee in #497 - Update docs -
cases.md-Seq[String]toSnake_Case_Stringby @kevin-lee in #498 - Update docs -
cases.md-Seq[String]toSNAKE_UPPER_CASE_STRING,snake_lower_case_stringandKebab-Case-String, by @kevin-lee in #499 - Update docs - cases.md -
Seq[String]toKEBAB-UPPER-CASE-STRINGby @kevin-lee in #500 - Update docs - cases.md -
Seq[String]tokebab-lower-case-stringby @kevin-lee in #501 - Update docs -
cases.md- more examples to case changes forSeq[String]by @kevin-lee in #502 - Update docs - cases.md - Split
StringbyPascalCaseorcacmelCaseby @kevin-lee in #503 - Upgrade: Bump actions/setup-java from 3 to 4 by @dependabot[bot] in #504
- Bump sbt to 1.9.8 by @kevin-lee in #506
- Close #508 - Upgrade effectie to
2.0.0-beta14by @kevin-lee in #509 - Upgrade: Bump actions/cache from 3 to 4 by @dependabot[bot] in #510
- Update docs: Add a logo image sized 96x96 by @kevin-lee in #511
- Update docs by @kevin-lee in #512
- Fix the broken mdoc build due to the missing "-Ymacro-annotations" in scalacOptions by @kevin-lee in #513
- Update docs: Make the sidebar hidable by @kevin-lee in #514
- Upgrade: Bump codecov/codecov-action from 3 to 4 by @dependabot[bot] in #515
- Close #517 - Bump
hedgehog-extrato0.8.0by @kevin-lee in #518 - Upgrade: Bump TimonVS/pr-labeler-action from 4 to 5 by @dependabot[bot] in #516
- Bump sbt to 1.9.9 by @kevin-lee in #519
- Bump sbt-devoops to 3.1.0 / sbt-docusaur to 0.16.0 by @kevin-lee in #520
- Upgrade: Bump scalacenter/sbt-dependency-submission from 2 to 3 by @dependabot[bot] in #521
- Update GitHub Actions: Replace custom SBT cache setup with
actions/setup-java's and addsbt/setup-sbtaction to havesbtas well as increasingMaxMetaspaceSizeto2Gby @kevin-lee in #524 - Update .gitignore to exclude additional build tool files by @kevin-lee in #523
- Updated sbt plugin and Scala versions, and refactored the rainbow color logic by @kevin-lee in #525
- Close #526 - Upgrade
effectieto2.0.0by @kevin-lee in #528 - Upgrade: Bump codecov/codecov-action from 4 to 5 by @dependabot[bot] in #527
- Update GitHub Actions: Add
sbt/setup-sbtto dependency-graph workflow by @kevin-lee in #529 - Bump sbt to 1.10.11 by @kevin-lee in #530
- Update docs: Add documentation for
Int.toOrdinalandLong.toOrdinalmethods by @kevin-lee in #531 - Update docs: Format
Int.toOrdinalandLong.toOrdinalheadings by @kevin-lee in #532 - Update docs: Reorder
stringssyntax: MovecommaAnd,serialCommaAnd,commaOrandserialCommaOrto beforecommaWithandserialCommaWithby @kevin-lee in #533 - Upgrade sbt to 1.11.0 and the sbt-ci-release plugin to 1.11.1 / clean up unused build settings related to the old Maven Central (OSSRH). by @kevin-lee in #534
- Bump
sbtto1.11.2by @kevin-lee in #535 - Close #522 - Support Scala.js by @kevin-lee in #536
- extras v0.45.0 by @kevin-lee in #537
Full Changelog: v0.44.0...v0.45.0
v0.44.0
0.44.0 - 2023-11-05
New Features
- [
extras-string] Addextras.strings.syntax.allto have allstringssyntax (#441)import extras.strings.syntax.all._
- [
extras-string] Add case conversion -string.toPascalCase(#443)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toPascalCase // Abc
"AbcDefGhi".toPascalCase // AbcDefGhi
"abcDefGhi".toPascalCase // AbcDefGhi
"abc".toPascalCase // Abc
"ABC".toPascalCase // Abc
"abc_def_ghi".toPascalCase // AbcDefGhi
"abc-def-ghi".toPascalCase // AbcDefGhi
"abc def ghi".toPascalCase // AbcDefGhi
- [
extras-string] Add case conversion -string.toOnePascalCase(#455)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toOnePascalCase // Abc
"AbcDef".toOnePascalCase // Abcdef
"abcDef".toOnePascalCase // Abcdef
"abc".toOnePascalCase // Abc
"ABC".toOnePascalCase // Abc
- [
extras-string] Add case conversion -string.toCamelCase(#444)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toCamelCase // abc
"AbcDefGhi".toCamelCase // abcDefGhi
"abcDefGhi".toCamelCase // abcDefGhi
"abc".toCamelCase // abc
"ABC".toCamelCase // abc
"abc_def_ghi".toCamelCase // abcDefGhi
"abc-def-ghi".toCamelCase // abcDefGhi
"abc def ghi".toCamelCase // abcDefGhi
- [
extras-string] Add case conversion -string.toSnakeCase(#445)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toSnakeCase // Abc
"AbcDefGhi".toSnakeCase // Abc_Def_Ghi
"abcDefGhi".toSnakeCase // abc_Def_Ghi
"abc".toSnakeCase // abc
"ABC".toSnakeCase // ABC
"Abc_Def_Ghi".toSnakeCase // Abc_Def_Ghi
"abc_def_ghi".toSnakeCase // abc_def_ghi
"ABC_DEF_GHI".toSnakeCase // ABC_DEF_GHI
"abc-def-ghi".toSnakeCase // abc_def_ghi
"Abc-Def-Ghi".toSnakeCase // Abc_Def_Ghi
"ABC-DEF-GHI".toSnakeCase // ABC_DEF_GHI
"abc def ghi".toSnakeCase // abc_def_ghi
"Abc Def Ghi".toSnakeCase // Abc_Def_Ghi
"ABC DEF GHI".toSnakeCase // ABC_DEF_GHI
- [
extras-string] Add case conversion -string.toSnakeUpperCase(#465)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toSnakeUpperCase // ABC
"AbcDefGhi".toSnakeUpperCase // ABC_DEF_GHI
"abcDefGhi".toSnakeUpperCase // ABC_DEF_GHI
"abc".toSnakeUpperCase // ABC
"ABC".toSnakeUpperCase // ABC
"Abc_Def_Ghi".toSnakeUpperCase // ABC_DEF_GHI
"abc_def_ghi".toSnakeUpperCase // ABC_DEF_GHI
"ABC_DEF_GHI".toSnakeUpperCase // ABC_DEF_GHI
"abc-def-ghi".toSnakeUpperCase // ABC_DEF_GHI
"Abc-Def-Ghi".toSnakeUpperCase // ABC_DEF_GHI
"ABC-DEF-GHI".toSnakeUpperCase // ABC_DEF_GHI
"abc def ghi".toSnakeUpperCase // ABC_DEF_GHI
"Abc Def Ghi".toSnakeUpperCase // ABC_DEF_GHI
"ABC DEF GHI".toSnakeUpperCase // ABC_DEF_GHI
- [
extras-string] Add case conversion -string.toSnakeLowerCase(#466)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toSnakeLowerCase // abc
"AbcDefGhi".toSnakeLowerCase // abc_def_ghi
"abcDefGhi".toSnakeLowerCase // abc_def_ghi
"abc".toSnakeLowerCase // abc
"ABC".toSnakeLowerCase // abc
"Abc_Def_Ghi".toSnakeLowerCase // abc_def_ghi
"abc_def_ghi".toSnakeLowerCase // abc_def_ghi
"ABC_DEF_GHI".toSnakeLowerCase // abc_def_ghi
"abc-def-ghi".toSnakeLowerCase // abc_def_ghi
"Abc-Def-Ghi".toSnakeLowerCase // abc_def_ghi
"ABC-DEF-GHI".toSnakeLowerCase // abc_def_ghi
"abc def ghi".toSnakeLowerCase // abc_def_ghi
"Abc Def Ghi".toSnakeLowerCase // abc_def_ghi
"ABC DEF GHI".toSnakeLowerCase // abc_def_ghi
- [
extras-string] Add case conversion -string.toKebabCase(#446)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toKebabCase // Abc
"AbcDefGhi".toKebabCase // Abc-Def-Ghi
"abcDefGhi".toKebabCase // abc-Def-Ghi
"abc".toKebabCase // abc
"ABC".toKebabCase // ABC
"Abc_Def_Ghi".toKebabCase // Abc-Def-Ghi
"abc_def_ghi".toKebabCase // abc-def-ghi
"ABC_DEF_GHI".toKebabCase // ABC-DEF-GHI
"abc-def-ghi".toKebabCase // abc-def-ghi
"Abc-Def-Ghi".toKebabCase // Abc-Def-Ghi
"ABC-DEF-GHI".toKebabCase // ABC-DEF-GHI
"abc def ghi".toKebabCase // abc-def-ghi
"Abc Def Ghi".toKebabCase // Abc-Def-Ghi
"ABC DEF GHI".toKebabCase // ABC-DEF-GHI
- [
extras-string] Add case conversion -string.toKebabUpperCase(#467)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toKebabUpperCase // ABC
"AbcDefGhi".toKebabUpperCase // ABC-DEF-GHI
"abcDefGhi".toKebabUpperCase // ABC-DEF-GHI
"abc".toKebabUpperCase // ABC
"ABC".toKebabUpperCase // ABC
"Abc_Def_Ghi".toKebabUpperCase // ABC-DEF-GHI
"abc_def_ghi".toKebabUpperCase // ABC-DEF-GHI
"ABC_DEF_GHI".toKebabUpperCase // ABC-DEF-GHI
"abc-def-ghi".toKebabUpperCase // ABC-DEF-GHI
"Abc-Def-Ghi".toKebabUpperCase // ABC-DEF-GHI
"ABC-DEF-GHI".toKebabUpperCase // ABC-DEF-GHI
"abc def ghi".toKebabUpperCase // ABC-DEF-GHI
"Abc Def Ghi".toKebabUpperCase // ABC-DEF-GHI
"ABC DEF GHI".toKebabUpperCase // ABC-DEF-GHI
- [
extras-string] Add case conversion -string.toKebabLowerCase(#468)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
"Abc".toKebabLowerCase // abc
"AbcDefGhi".toKebabLowerCase // abc-def-ghi
"abcDefGhi".toKebabLowerCase // abc-def-ghi
"abc".toKebabLowerCase // abc
"ABC".toKebabLowerCase // abc
"Abc_Def_Ghi".toKebabLowerCase // abc-def-ghi
"abc_def_ghi".toKebabLowerCase // abc-def-ghi
"ABC_DEF_GHI".toKebabLowerCase // abc-def-ghi
"abc-def-ghi".toKebabLowerCase // abc-def-ghi
"Abc-Def-Ghi".toKebabLowerCase // abc-def-ghi
"ABC-DEF-GHI".toKebabLowerCase // abc-def-ghi
"abc def ghi".toKebabLowerCase // abc-def-ghi
"Abc Def Ghi".toKebabLowerCase // abc-def-ghi
"ABC DEF GHI".toKebabLowerCase // abc-def-ghi
- [
extras-string] Add case conversion -Seq[String].mkPascalCaseString(#447)import extras.strings.syntax.cases._ // or import extras.strings.syntax.all._
List("Abc", "Def").mkPascalCaseString // AbcDef
List("AbcDef", "Ghi", "jkl", "MnoPqr").mkPascalCaseString // AbcDefGhiJklMnoPqr
List("abcDef", "Ghi", "jkl", "MnoPqr").mkPascalCaseString // AbcDefGhiJklMnoPqr
List("abc").mkPascalCaseString // Abc
List("ABC").mkPascalCaseString // Abc
List("Abc_Def_Ghi", "jkl_mno_Pqr").mkPascalCaseString // AbcDefGhiJklMnoPqr
List("abc_def_ghi", "jkl_mno_pqr", "st_u").mkPascalCaseString // AbcDefGhiJklMnoPqrStU
List("ABC_DEF_GHI", "JKL_MNO_PQR", "ST_U").mkPascalCaseString // AbcDefGhiJklMnoPqrStU
List("Abc-Def-Ghi", "jkl-mno-Pqr").mkPascalCaseString // AbcDefGhiJklMnoPqr
List("abc-def-ghi", "jkl-mno-pqr", "st-u").mkPascalCaseString // AbcDefGhiJklMnoPqrStU
List("ABC-DEF-GHI", "JKL-MNO-PQR", "ST-U").mkPascalCaseString // AbcDefGhiJklMnoPqrStU
List("Abc Def Ghi", "jkl mno Pqr").mkPascalCaseString // AbcDefGhiJklMnoPqr ...
v0.43.0
0.43.0 - 2023-10-03
Internal Housekeeping
- Upgrade effectie to
2.0.0-beta13(#438)
What's Changed
- Upgrade: Bump actions/checkout from 3 to 4 by @dependabot[bot] in #436
- Bump sbt to
1.9.6by @kevin-lee in #437 - Close #438 - Upgrade effectie to
2.0.0-beta13by @kevin-lee in #439 - extras v0.43.0 by @kevin-lee in #440
Full Changelog: v0.42.0...v0.43.0

