casing.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const assert = require('assert')
  2. const invalidChars = /[^a-zA-Z0-9:]+/g
  3. /**
  4. * Convert text to kebab-case
  5. * @param {string} str Text to be converted
  6. * @return {string}
  7. */
  8. function kebabCase (str) {
  9. return str
  10. .replace(/([a-z])([A-Z])/g, match => match[0] + '-' + match[1])
  11. .replace(invalidChars, '-')
  12. .toLowerCase()
  13. }
  14. /**
  15. * Convert text to snake_case
  16. * @param {string} str Text to be converted
  17. * @return {string}
  18. */
  19. function snakeCase (str) {
  20. return str
  21. .replace(/([a-z])([A-Z])/g, match => match[0] + '_' + match[1])
  22. .replace(invalidChars, '_')
  23. .toLowerCase()
  24. }
  25. /**
  26. * Convert text to camelCase
  27. * @param {string} str Text to be converted
  28. * @return {string} Converted string
  29. */
  30. function camelCase (str) {
  31. return str
  32. .replace(/_/g, (_, index) => index === 0 ? _ : '-')
  33. .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter, index) =>
  34. index === 0 ? letter.toLowerCase() : letter.toUpperCase()
  35. )
  36. .replace(invalidChars, '')
  37. }
  38. /**
  39. * Convert text to PascalCase
  40. * @param {string} str Text to be converted
  41. * @return {string} Converted string
  42. */
  43. function pascalCase (str) {
  44. return str
  45. .replace(/_/g, (_, index) => index === 0 ? _ : '-')
  46. .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter, index) => letter.toUpperCase())
  47. .replace(invalidChars, '')
  48. }
  49. const convertersMap = {
  50. 'kebab-case': kebabCase,
  51. 'snake_case': snakeCase,
  52. 'camelCase': camelCase,
  53. 'PascalCase': pascalCase
  54. }
  55. module.exports = {
  56. allowedCaseOptions: [
  57. 'camelCase',
  58. 'kebab-case',
  59. 'PascalCase'
  60. ],
  61. /**
  62. * Return case converter
  63. * @param {string} name type of converter to return ('camelCase', 'kebab-case', 'PascalCase')
  64. * @return {kebabCase|camelCase|pascalCase}
  65. */
  66. getConverter (name) {
  67. assert(typeof name === 'string')
  68. return convertersMap[name] || pascalCase
  69. }
  70. }