File tree Expand file tree Collapse file tree 2 files changed +59
-0
lines changed Expand file tree Collapse file tree 2 files changed +59
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * Transforms a camelCase (or PascalCase) string to snake_case
3+ * @param {string } inputStr camelCase or PascalCase string
4+ * @returns { string } snake_case string
5+ */
6+
7+ function camelPascalToSnakeCase ( inputStr ) {
8+ if ( typeof inputStr !== "string" ) {
9+ throw new Error ( `Expected string as input, found ${ typeof inputStr } ` ) ;
10+ }
11+
12+ let snakeStr = "" ;
13+ let lastCharWasLower = false ;
14+
15+ for ( let index = 0 ; index < inputStr . length ; index ++ ) {
16+ const char = inputStr [ index ] ;
17+
18+ if ( / [ A - Z ] / . test ( char ) && ( ! lastCharWasLower || ( index > 0 && / [ a - z 0 - 9 ] / . test ( inputStr [ index - 1 ] ) ) ) ) {
19+ if ( index > 0 && inputStr [ index - 1 ] !== "_" ) {
20+ snakeStr += "_" ;
21+ }
22+ snakeStr += char . toLowerCase ( ) ;
23+ lastCharWasLower = false ;
24+ } else if ( / [ a - z 0 - 9 ] / . test ( char ) ) {
25+ snakeStr += char ;
26+ lastCharWasLower = / [ a - z ] / . test ( char ) ;
27+ } else {
28+ snakeStr += "_" ;
29+ lastCharWasLower = false ;
30+ }
31+ }
32+
33+ // Remove leading underscore
34+ if ( snakeStr [ 0 ] === "_" ) {
35+ snakeStr = snakeStr . substring ( 1 ) ;
36+ }
37+
38+ return snakeStr ;
39+ }
40+
41+ export { camelPascalToSnakeCase }
Original file line number Diff line number Diff line change 1+ import { camelPascalToSnakeCase } from "../CamelPascalToSnakeCase" ;
2+
3+ describe ( 'camelToSnakeCase' , ( ) => {
4+ it . each ( [
5+ [ 'someRandomString' , 'some_random_string' ] ,
6+ [ 'SomeRandomStr#ng' , 'some_random_str_ng' ] ,
7+ [ '123someRandom123String123' , '123some_random123_string123' ] ,
8+ [ '123SomeRandom123String123' , '123_some_random123_string123' ] ,
9+ [ '123SomeRandom123String123' , '123_some_random123_string123' ] ,
10+ [ '' , '' ] ,
11+ ] ) ( 'converts %s to snake_case %s' , ( input , expected ) => {
12+ expect ( camelPascalToSnakeCase ( input ) ) . toBe ( expected ) ;
13+ } ) ;
14+
15+ it ( 'throws an error when the input is not a string' , ( ) => {
16+ expect ( ( ) => camelPascalToSnakeCase ( 123 ) ) . toThrow ( 'Expected string as input' ) ;
17+ } ) ;
18+ } ) ;
You can’t perform that action at this time.
0 commit comments