@mikezimm/fps-core-v7
Version:
Library of reusable core interfaces, types and constants migrated from fps-library-v2
38 lines • 2.24 kB
JavaScript
/**
* Originally copied from here on 2022-12-12: Just modified with typings.
* https://github.com/sindresorhus/decamelize/blob/main/index.js - v6.0.0
* Tested in codePen and it seems to work converting scss classNames to css class-names
*/
const handlePreserveConsecutiveUppercase = (decamelized, separator) => {
// Lowercase all single uppercase characters. As we
// want to preserve uppercase sequences, we cannot
// simply lowercase the separated string at the end.
// `data_For_USACounties` => `data_for_USACounties`
decamelized = decamelized.replace(/((?<![\p{Uppercase_Letter}\d])[\p{Uppercase_Letter}\d](?![\p{Uppercase_Letter}\d]))/gu, $0 => $0.toLowerCase());
// Remaining uppercase sequences will be separated from lowercase sequences.
// `data_For_USACounties` => `data_for_USA_counties`
return decamelized.replace(/(\p{Uppercase_Letter}+)(\p{Uppercase_Letter}\p{Lowercase_Letter}+)/gu, (_, $1, $2) => $1 + separator + $2.toLowerCase());
};
export function decamelize(text, separator = '_', preserveConsecutiveUppercase = false) {
if (!(typeof text === 'string' && typeof separator === 'string')) {
throw new TypeError('The `text` and `separator` arguments should be of type `string`');
}
// Checking the second character is done later on. Therefore process shorter strings here.
if (text.length < 2) {
return preserveConsecutiveUppercase ? text : text.toLowerCase();
}
const replacement = `$1${separator}$2`;
// Split lowercase sequences followed by uppercase character.
// `dataForUSACounties` => `data_For_USACounties`
// `myURLstring => `my_URLstring`
const decamelized = text.replace(/([\p{Lowercase_Letter}\d])(\p{Uppercase_Letter})/gu, replacement);
if (preserveConsecutiveUppercase) {
return handlePreserveConsecutiveUppercase(decamelized, separator);
}
// Split multiple uppercase characters followed by one or more lowercase characters.
// `my_URLstring` => `my_ur_lstring`
return decamelized
.replace(/(\p{Uppercase_Letter})(\p{Uppercase_Letter}\p{Lowercase_Letter}+)/gu, replacement)
.toLowerCase();
}
//# sourceMappingURL=decamelize.js.map