1'use strict'; 2 3function preserveCamelCase(str) { 4 let isLastCharLower = false; 5 let isLastCharUpper = false; 6 let isLastLastCharUpper = false; 7 8 for (let i = 0; i < str.length; i++) { 9 const c = str[i]; 10 11 if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) { 12 str = str.substr(0, i) + '-' + str.substr(i); 13 isLastCharLower = false; 14 isLastLastCharUpper = isLastCharUpper; 15 isLastCharUpper = true; 16 i++; 17 } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) { 18 str = str.substr(0, i - 1) + '-' + str.substr(i - 1); 19 isLastLastCharUpper = isLastCharUpper; 20 isLastCharUpper = false; 21 isLastCharLower = true; 22 } else { 23 isLastCharLower = c.toLowerCase() === c; 24 isLastLastCharUpper = isLastCharUpper; 25 isLastCharUpper = c.toUpperCase() === c; 26 } 27 } 28 29 return str; 30} 31 32module.exports = function (str) { 33 if (arguments.length > 1) { 34 str = Array.from(arguments) 35 .map(x => x.trim()) 36 .filter(x => x.length) 37 .join('-'); 38 } else { 39 str = str.trim(); 40 } 41 42 if (str.length === 0) { 43 return ''; 44 } 45 46 if (str.length === 1) { 47 return str.toLowerCase(); 48 } 49 50 if (/^[a-z0-9]+$/.test(str)) { 51 return str; 52 } 53 54 const hasUpperCase = str !== str.toLowerCase(); 55 56 if (hasUpperCase) { 57 str = preserveCamelCase(str); 58 } 59 60 return str 61 .replace(/^[_.\- ]+/, '') 62 .toLowerCase() 63 .replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase()); 64}; 65