e84f503958995a95599a582bb07ff9c109f0fbf8349201b9bc05fbaa423bbc3d3b49eb6362b9f8823d6f582ec5b0e96ceb17ab73c9dcf475384ea910b92756 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. const NUMBER_CHAR_RE = /\d/;
  3. const STR_SPLITTERS = ["-", "_", "/", "."];
  4. function isUppercase(char = "") {
  5. if (NUMBER_CHAR_RE.test(char)) {
  6. return void 0;
  7. }
  8. return char !== char.toLowerCase();
  9. }
  10. function splitByCase(str, separators) {
  11. const splitters = separators ?? STR_SPLITTERS;
  12. const parts = [];
  13. if (!str || typeof str !== "string") {
  14. return parts;
  15. }
  16. let buff = "";
  17. let previousUpper;
  18. let previousSplitter;
  19. for (const char of str) {
  20. const isSplitter = splitters.includes(char);
  21. if (isSplitter === true) {
  22. parts.push(buff);
  23. buff = "";
  24. previousUpper = void 0;
  25. continue;
  26. }
  27. const isUpper = isUppercase(char);
  28. if (previousSplitter === false) {
  29. if (previousUpper === false && isUpper === true) {
  30. parts.push(buff);
  31. buff = char;
  32. previousUpper = isUpper;
  33. continue;
  34. }
  35. if (previousUpper === true && isUpper === false && buff.length > 1) {
  36. const lastChar = buff.at(-1);
  37. parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
  38. buff = lastChar + char;
  39. previousUpper = isUpper;
  40. continue;
  41. }
  42. }
  43. buff += char;
  44. previousUpper = isUpper;
  45. previousSplitter = isSplitter;
  46. }
  47. parts.push(buff);
  48. return parts;
  49. }
  50. function upperFirst(str) {
  51. return str ? str[0].toUpperCase() + str.slice(1) : "";
  52. }
  53. function lowerFirst(str) {
  54. return str ? str[0].toLowerCase() + str.slice(1) : "";
  55. }
  56. function pascalCase(str, opts) {
  57. return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("") : "";
  58. }
  59. function camelCase(str, opts) {
  60. return lowerFirst(pascalCase(str || "", opts));
  61. }
  62. function kebabCase(str, joiner) {
  63. return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? "-") : "";
  64. }
  65. function snakeCase(str) {
  66. return kebabCase(str || "", "_");
  67. }
  68. function flatCase(str) {
  69. return kebabCase(str || "", "");
  70. }
  71. function trainCase(str, opts) {
  72. return (Array.isArray(str) ? str : splitByCase(str)).filter(Boolean).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("-");
  73. }
  74. const titleCaseExceptions = /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;
  75. function titleCase(str, opts) {
  76. return (Array.isArray(str) ? str : splitByCase(str)).filter(Boolean).map(
  77. (p) => titleCaseExceptions.test(p) ? p.toLowerCase() : upperFirst(opts?.normalize ? p.toLowerCase() : p)
  78. ).join(" ");
  79. }
  80. exports.camelCase = camelCase;
  81. exports.flatCase = flatCase;
  82. exports.isUppercase = isUppercase;
  83. exports.kebabCase = kebabCase;
  84. exports.lowerFirst = lowerFirst;
  85. exports.pascalCase = pascalCase;
  86. exports.snakeCase = snakeCase;
  87. exports.splitByCase = splitByCase;
  88. exports.titleCase = titleCase;
  89. exports.trainCase = trainCase;
  90. exports.upperFirst = upperFirst;