index.js
1 'use strict'; 2 3 const preserveCamelCase = string => { 4 let isLastCharLower = false; 5 let isLastCharUpper = false; 6 let isLastLastCharUpper = false; 7 8 for (let i = 0; i < string.length; i++) { 9 const character = string[i]; 10 11 if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) { 12 string = string.slice(0, i) + '-' + string.slice(i); 13 isLastCharLower = false; 14 isLastLastCharUpper = isLastCharUpper; 15 isLastCharUpper = true; 16 i++; 17 } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) { 18 string = string.slice(0, i - 1) + '-' + string.slice(i - 1); 19 isLastLastCharUpper = isLastCharUpper; 20 isLastCharUpper = false; 21 isLastCharLower = true; 22 } else { 23 isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character; 24 isLastLastCharUpper = isLastCharUpper; 25 isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character; 26 } 27 } 28 29 return string; 30 }; 31 32 const camelCase = (input, options) => { 33 if (!(typeof input === 'string' || Array.isArray(input))) { 34 throw new TypeError('Expected the input to be `string | string[]`'); 35 } 36 37 options = Object.assign({ 38 pascalCase: false 39 }, options); 40 41 const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x; 42 43 if (Array.isArray(input)) { 44 input = input.map(x => x.trim()) 45 .filter(x => x.length) 46 .join('-'); 47 } else { 48 input = input.trim(); 49 } 50 51 if (input.length === 0) { 52 return ''; 53 } 54 55 if (input.length === 1) { 56 return options.pascalCase ? input.toUpperCase() : input.toLowerCase(); 57 } 58 59 const hasUpperCase = input !== input.toLowerCase(); 60 61 if (hasUpperCase) { 62 input = preserveCamelCase(input); 63 } 64 65 input = input 66 .replace(/^[_.\- ]+/, '') 67 .toLowerCase() 68 .replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase()) 69 .replace(/\d+(\w|$)/g, m => m.toUpperCase()); 70 71 return postProcess(input); 72 }; 73 74 module.exports = camelCase; 75 // TODO: Remove this for the next major release 76 module.exports.default = camelCase;