• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3function preserveCamelCase(str) {
4	let isLastCharLower = false;
5	let isLastCharUpper = false;
6	let isLastLastCharUpper = false;
7
8	for (let i = 0; i < str.length; i++) {
9		const c = str[i];
10
11		if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) {
12			str = str.substr(0, i) + '-' + str.substr(i);
13			isLastCharLower = false;
14			isLastLastCharUpper = isLastCharUpper;
15			isLastCharUpper = true;
16			i++;
17		} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) {
18			str = str.substr(0, i - 1) + '-' + str.substr(i - 1);
19			isLastLastCharUpper = isLastCharUpper;
20			isLastCharUpper = false;
21			isLastCharLower = true;
22		} else {
23			isLastCharLower = c.toLowerCase() === c;
24			isLastLastCharUpper = isLastCharUpper;
25			isLastCharUpper = c.toUpperCase() === c;
26		}
27	}
28
29	return str;
30}
31
32module.exports = function (str) {
33	if (arguments.length > 1) {
34		str = Array.from(arguments)
35			.map(x => x.trim())
36			.filter(x => x.length)
37			.join('-');
38	} else {
39		str = str.trim();
40	}
41
42	if (str.length === 0) {
43		return '';
44	}
45
46	if (str.length === 1) {
47		return str.toLowerCase();
48	}
49
50	if (/^[a-z0-9]+$/.test(str)) {
51		return str;
52	}
53
54	const hasUpperCase = str !== str.toLowerCase();
55
56	if (hasUpperCase) {
57		str = preserveCamelCase(str);
58	}
59
60	return str
61		.replace(/^[_.\- ]+/, '')
62		.toLowerCase()
63		.replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase());
64};
65