File tree 2 files changed +59
-0
lines changed
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