Skip to content

Instantly share code, notes, and snippets.

@keego
Last active September 9, 2022 08:19
Show Gist options
  • Save keego/e44bd44b1b75108dc0e5d9e9ee72febb to your computer and use it in GitHub Desktop.
Save keego/e44bd44b1b75108dc0e5d9e9ee72febb to your computer and use it in GitHub Desktop.
/**
* Converts a label or variable name into kebab-case
*
* i.e
* ```
* "Sentence case rekt" -> "sentence-case-rekt"
* "Title Case Rekt" -> "title-case-rekt"
* "camelCaseRekt" -> "camel-case-rekt"
* "PascalCaseRekt" -> "pascal-case-rekt"
* "snake_case_rekt" -> "snake-case-rekt"
* "kebab-case-unchanged" -> "kebab-case-unchanged"
* "numbers2Easy4Me255Colors12thStreet" -> "numbers-2-easy-4-me-255-colors-12th-street"
* "acronymnsLikeAPIAndUIAreSeparated" -> "acronymns-like-api-and-ui-are-separated"
* ```
*/
export function convertToKebabCase(name: string) {
return name
.replace(/\W+/g, '-') // guarantee any spaces are kebab'd
.replace(/([a-z])([^-a-z])/g, '$1-$2') // guarantee words suffixed with -
.replace(/[-]*([A-Z])([a-z])/g, '-$1$2') // guarantee words prefixed with -
.replace(/^-|[_]/g, '') // remove duplicates / other delimiters
.toLowerCase()
}
/**
* Converts a label or variable name to Title Case
*
* i.e
* ```
* "Sentence case rekt" -> "Sentence Case Rekt"
* "Title Case Unchanged" -> "Title Case Unchanged"
* "camelCaseRekt" -> "Camel Case Rekt"
* "PascalCaseRekt" -> "Pascal Case Rekt"
* "snake_case_rekt" -> "Snake Case Rekt"
* "kebab-case-unchanged" -> "Kebab Case Unchanged"
* "numbers2Easy4Me255Colors12thStreet" -> "Numbers 2 Easy 4 Me 255 Colors 12th Street"
* "acronymnsLikeAPIAndUIAreSeparated" -> "Acronymns Like API And UI Are Separated"
* ```
*/
export function convertToTitleCase(name: string) {
return name
.replace(/([a-z])([^a-z])/g, '$1 $2') // guarantee words are suffixed with a space
.replace(/([A-Z])([^A-Z])/g, ' $1$2') // guarantee words are prefixed with a space
.trim() // trim excess spacing on ends
.replace(/[\s-_]+/g, ' ') // replace all spacing / delimiters with a single space
.split(' ') // split into words
.map((token) => token.split('')) // split each word into letters
.map(
([first, ...rest]) =>
[
first.toUpperCase(), // capitalize first letter
...rest, // spread remaining letters
].join(''), // merge letters back into words
)
.join(' ') // merge words into sentence
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment