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.
		
		
		
		
			
				
					92 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					92 lines
				
				2.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 |