You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							91 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							91 lines
						
					
					
						
							2.5 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
const preserveCamelCase = (string, locale) => { | 
						|
	let isLastCharLower = false; | 
						|
	let isLastCharUpper = false; | 
						|
	let isLastLastCharUpper = false; | 
						|
 | 
						|
	for (let i = 0; i < string.length; i++) { | 
						|
		const character = string[i]; | 
						|
 | 
						|
		if (isLastCharLower && /[\p{Lu}]/u.test(character)) { | 
						|
			string = string.slice(0, i) + '-' + string.slice(i); | 
						|
			isLastCharLower = false; | 
						|
			isLastLastCharUpper = isLastCharUpper; | 
						|
			isLastCharUpper = true; | 
						|
			i++; | 
						|
		} else if (isLastCharUpper && isLastLastCharUpper && /[\p{Ll}]/u.test(character)) { | 
						|
			string = string.slice(0, i - 1) + '-' + string.slice(i - 1); | 
						|
			isLastLastCharUpper = isLastCharUpper; | 
						|
			isLastCharUpper = false; | 
						|
			isLastCharLower = true; | 
						|
		} else { | 
						|
			isLastCharLower = character.toLocaleLowerCase(locale) === character && character.toLocaleUpperCase(locale) !== character; | 
						|
			isLastLastCharUpper = isLastCharUpper; | 
						|
			isLastCharUpper = character.toLocaleUpperCase(locale) === character && character.toLocaleLowerCase(locale) !== character; | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	return string; | 
						|
}; | 
						|
 | 
						|
const preserveConsecutiveUppercase = input => { | 
						|
	return input.replace(/^[\p{Lu}](?![\p{Lu}])/gu, m1 => m1.toLowerCase()); | 
						|
}; | 
						|
 | 
						|
const postProcess = (input, options) => { | 
						|
	return input.replace(/[_.\- ]+([\p{Alpha}\p{N}_]|$)/gu, (_, p1) => p1.toLocaleUpperCase(options.locale)) | 
						|
		.replace(/\d+([\p{Alpha}\p{N}_]|$)/gu, m => m.toLocaleUpperCase(options.locale)); | 
						|
}; | 
						|
 | 
						|
const camelCase = (input, options) => { | 
						|
	if (!(typeof input === 'string' || Array.isArray(input))) { | 
						|
		throw new TypeError('Expected the input to be `string | string[]`'); | 
						|
	} | 
						|
 | 
						|
	options = { | 
						|
		pascalCase: false, | 
						|
		preserveConsecutiveUppercase: false, | 
						|
		...options | 
						|
	}; | 
						|
 | 
						|
	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.toLocaleUpperCase(options.locale) : input.toLocaleLowerCase(options.locale); | 
						|
	} | 
						|
 | 
						|
	const hasUpperCase = input !== input.toLocaleLowerCase(options.locale); | 
						|
 | 
						|
	if (hasUpperCase) { | 
						|
		input = preserveCamelCase(input, options.locale); | 
						|
	} | 
						|
 | 
						|
	input = input.replace(/^[_.\- ]+/, ''); | 
						|
 | 
						|
	if (options.preserveConsecutiveUppercase) { | 
						|
		input = preserveConsecutiveUppercase(input); | 
						|
	} else { | 
						|
		input = input.toLocaleLowerCase(); | 
						|
	} | 
						|
 | 
						|
	if (options.pascalCase) { | 
						|
		input = input.charAt(0).toLocaleUpperCase(options.locale) + input.slice(1); | 
						|
	} | 
						|
 | 
						|
	return postProcess(input, options); | 
						|
}; | 
						|
 | 
						|
module.exports = camelCase; | 
						|
// TODO: Remove this for the next major release | 
						|
module.exports.default = camelCase;
 | 
						|
 |