77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | const preserveCamelCase = string => { | ||
|  | 	let isLastCharLower = false; | ||
|  | 	let isLastCharUpper = false; | ||
|  | 	let isLastLastCharUpper = false; | ||
|  | 
 | ||
|  | 	for (let i = 0; i < string.length; i++) { | ||
|  | 		const character = string[i]; | ||
|  | 
 | ||
|  | 		if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) { | ||
|  | 			string = string.slice(0, i) + '-' + string.slice(i); | ||
|  | 			isLastCharLower = false; | ||
|  | 			isLastLastCharUpper = isLastCharUpper; | ||
|  | 			isLastCharUpper = true; | ||
|  | 			i++; | ||
|  | 		} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) { | ||
|  | 			string = string.slice(0, i - 1) + '-' + string.slice(i - 1); | ||
|  | 			isLastLastCharUpper = isLastCharUpper; | ||
|  | 			isLastCharUpper = false; | ||
|  | 			isLastCharLower = true; | ||
|  | 		} else { | ||
|  | 			isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character; | ||
|  | 			isLastLastCharUpper = isLastCharUpper; | ||
|  | 			isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return string; | ||
|  | }; | ||
|  | 
 | ||
|  | const camelCase = (input, options) => { | ||
|  | 	if (!(typeof input === 'string' || Array.isArray(input))) { | ||
|  | 		throw new TypeError('Expected the input to be `string | string[]`'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	options = Object.assign({ | ||
|  | 		pascalCase: false | ||
|  | 	}, options); | ||
|  | 
 | ||
|  | 	const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x; | ||
|  | 
 | ||
|  | 	if (Array.isArray(input)) { | ||
|  | 		input = input.map(x => x.trim()) | ||
|  | 			.filter(x => x.length) | ||
|  | 			.join('-'); | ||
|  | 	} else { | ||
|  | 		input = input.trim(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (input.length === 0) { | ||
|  | 		return ''; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (input.length === 1) { | ||
|  | 		return options.pascalCase ? input.toUpperCase() : input.toLowerCase(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const hasUpperCase = input !== input.toLowerCase(); | ||
|  | 
 | ||
|  | 	if (hasUpperCase) { | ||
|  | 		input = preserveCamelCase(input); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	input = input | ||
|  | 		.replace(/^[_.\- ]+/, '') | ||
|  | 		.toLowerCase() | ||
|  | 		.replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase()) | ||
|  | 		.replace(/\d+(\w|$)/g, m => m.toUpperCase()); | ||
|  | 
 | ||
|  | 	return postProcess(input); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = camelCase; | ||
|  | // TODO: Remove this for the next major release
 | ||
|  | module.exports.default = camelCase; |