|
|
@@ -1,64 +1,76 @@
|
|
|
'use strict';
|
|
|
|
|
|
-function preserveCamelCase(str) {
|
|
|
+const preserveCamelCase = string => {
|
|
|
let isLastCharLower = false;
|
|
|
let isLastCharUpper = false;
|
|
|
let isLastLastCharUpper = false;
|
|
|
|
|
|
- for (let i = 0; i < str.length; i++) {
|
|
|
- const c = str[i];
|
|
|
+ for (let i = 0; i < string.length; i++) {
|
|
|
+ const character = string[i];
|
|
|
|
|
|
- if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) {
|
|
|
- str = str.substr(0, i) + '-' + str.substr(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(c) && c.toLowerCase() === c) {
|
|
|
- str = str.substr(0, i - 1) + '-' + str.substr(i - 1);
|
|
|
+ } 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 = c.toLowerCase() === c;
|
|
|
+ isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
|
|
|
isLastLastCharUpper = isLastCharUpper;
|
|
|
- isLastCharUpper = c.toUpperCase() === c;
|
|
|
+ isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return str;
|
|
|
-}
|
|
|
+ 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;
|
|
|
|
|
|
-module.exports = function (str) {
|
|
|
- if (arguments.length > 1) {
|
|
|
- str = Array.from(arguments)
|
|
|
- .map(x => x.trim())
|
|
|
+ if (Array.isArray(input)) {
|
|
|
+ input = input.map(x => x.trim())
|
|
|
.filter(x => x.length)
|
|
|
.join('-');
|
|
|
} else {
|
|
|
- str = str.trim();
|
|
|
+ input = input.trim();
|
|
|
}
|
|
|
|
|
|
- if (str.length === 0) {
|
|
|
+ if (input.length === 0) {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
- if (str.length === 1) {
|
|
|
- return str.toLowerCase();
|
|
|
+ if (input.length === 1) {
|
|
|
+ return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
|
|
|
}
|
|
|
|
|
|
- if (/^[a-z0-9]+$/.test(str)) {
|
|
|
- return str;
|
|
|
- }
|
|
|
-
|
|
|
- const hasUpperCase = str !== str.toLowerCase();
|
|
|
+ const hasUpperCase = input !== input.toLowerCase();
|
|
|
|
|
|
if (hasUpperCase) {
|
|
|
- str = preserveCamelCase(str);
|
|
|
+ input = preserveCamelCase(input);
|
|
|
}
|
|
|
|
|
|
- return str
|
|
|
+ input = input
|
|
|
.replace(/^[_.\- ]+/, '')
|
|
|
.toLowerCase()
|
|
|
- .replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase());
|
|
|
+ .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;
|