decamelize
Advanced tools
Comparing version 4.0.0 to 5.0.0
@@ -0,1 +1,41 @@ | ||
declare namespace decamelize { | ||
interface Options { | ||
/** | ||
Character or string inserted to separate words in `string`. | ||
@default '_' | ||
@example | ||
``` | ||
import decamelize = require('decamelize'); | ||
decamelize('unicornRainbow'); | ||
//=> 'unicorn_rainbow' | ||
decamelize('unicornRainbow', {separator: '-'}); | ||
//=> 'unicorn-rainbow' | ||
``` | ||
*/ | ||
readonly separator?: string; | ||
/** | ||
Preserve sequences of uppercase characters. | ||
@default false | ||
@example | ||
``` | ||
import decamelize = require('decamelize'); | ||
decamelize('testGUILabel'); | ||
//=> 'test_gui_label' | ||
decamelize('testGUILabel', {preserveConsecutiveUppercase: true}); | ||
//=> 'test_GUI_label' | ||
``` | ||
*/ | ||
readonly preserveConsecutiveUppercase?: boolean; | ||
} | ||
} | ||
/** | ||
@@ -5,3 +45,2 @@ Convert a camelized string into a lowercased one with a custom separator: `unicornRainbow` → `unicorn_rainbow`. | ||
@param string - The camelcase string to decamelize. | ||
@param separator - The separator to use to put in between the words from `string`. Default: `'_'`. | ||
@@ -15,8 +54,8 @@ @example | ||
decamelize('unicornRainbow', '-'); | ||
decamelize('unicornRainbow', {separator: '-'}); | ||
//=> 'unicorn-rainbow' | ||
``` | ||
*/ | ||
declare function decamelize(string: string, separator?: string): string; | ||
declare function decamelize(string: string, options?: decamelize.Options): string; | ||
export = decamelize; |
63
index.js
'use strict'; | ||
module.exports = (text, separator = '_') => { | ||
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 => { | ||
return $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) => { | ||
return $1 + separator + $2.toLowerCase(); | ||
} | ||
); | ||
}; | ||
module.exports = ( | ||
text, | ||
{ | ||
separator = '_', | ||
preserveConsecutiveUppercase = false | ||
} = {} | ||
) => { | ||
if (!(typeof text === 'string' && typeof separator === 'string')) { | ||
throw new TypeError('The `text` and `separator` arguments should be of type `string`'); | ||
throw new TypeError( | ||
'The `text` and `separator` arguments should be of type `string`' | ||
); | ||
} | ||
return text | ||
.replace(/([\p{Lowercase_Letter}\d])(\p{Uppercase_Letter})/gu, `$1${separator}$2`) | ||
.replace(/(\p{Uppercase_Letter}+)(\p{Uppercase_Letter}\p{Lowercase_Letter}+)/gu, `$1${separator}$2`) | ||
// 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_url_string` | ||
return decamelized | ||
.replace( | ||
/(\p{Uppercase_Letter}+)(\p{Uppercase_Letter}\p{Lowercase_Letter}+)/gu, | ||
replacement | ||
) | ||
.toLowerCase(); | ||
}; |
{ | ||
"name": "decamelize", | ||
"version": "4.0.0", | ||
"version": "5.0.0", | ||
"description": "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow", | ||
@@ -11,3 +11,3 @@ "license": "MIT", | ||
"email": "sindresorhus@gmail.com", | ||
"url": "sindresorhus.com" | ||
"url": "https://sindresorhus.com" | ||
}, | ||
@@ -14,0 +14,0 @@ "engines": { |
@@ -1,4 +0,4 @@ | ||
# decamelize [![Build Status](https://travis-ci.org/sindresorhus/decamelize.svg?branch=master)](https://travis-ci.org/sindresorhus/decamelize) | ||
# decamelize | ||
> Convert a camelized string into a lowercased one with a custom separator<br> | ||
> Convert a camelized string into a lowercased one with a custom separator\ | ||
> Example: `unicornRainbow` → `unicorn_rainbow` | ||
@@ -20,4 +20,10 @@ | ||
decamelize('unicornRainbow', '-'); | ||
decamelize('unicornRainbow', {separator: '-'}); | ||
//=> 'unicorn-rainbow' | ||
decamelize('testGUILabel', {preserveConsecutiveUppercase: true}); | ||
//=> 'test_GUI_label' | ||
decamelize('testGUILabel', {preserveConsecutiveUppercase: false}); | ||
//=> 'test_gui_label' | ||
``` | ||
@@ -27,3 +33,3 @@ | ||
### decamelize(input, separator?) | ||
### decamelize(input, options?) | ||
@@ -34,7 +40,40 @@ #### input | ||
#### separator | ||
#### options | ||
Type: `object` | ||
##### separator | ||
Type: `string`\ | ||
Default: `'_'` | ||
Character or string inserted to separate words in `string`. | ||
```js | ||
cosnt decamelize = require('decamelize'); | ||
decamelize('unicornRainbow'); | ||
//=> 'unicorn_rainbow' | ||
decamelize('unicornRainbow', {separator: '-'}); | ||
//=> 'unicorn-rainbow' | ||
``` | ||
##### preserveConsecutiveUppercase | ||
Type: `boolean`\ | ||
Default: `false` | ||
Preserve sequences of uppercase characters. | ||
```js | ||
const decamelize = require('decamelize'); | ||
decamelize('testGUILabel'); | ||
//=> 'test_gui_label' | ||
decamelize('testGUILabel', {preserveConsecutiveUppercase: true}); | ||
//=> 'test_GUI_label' | ||
``` | ||
## Related | ||
@@ -41,0 +80,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
6778
101
91