Skip to content

Commit 35bf227

Browse files
committed
chore: migrate splitter function to typescript and modern JS syntax
Signed-off-by: Maksim Sukharev <[email protected]>
1 parent f6c88f3 commit 35bf227

File tree

1 file changed

+59
-44
lines changed

1 file changed

+59
-44
lines changed

src/utils/splitter.ts

Lines changed: 59 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,70 +10,85 @@
1010
* Accepts a string consisting of one or more valid JSON substrings and splits it. Any remaining string after the end of the last complete JSON substring is returned in the 'remainder' field.
1111
* Passing in invalid JSON can result in garbage output
1212
*
13-
* @param {string} string The string to look for JSON in
14-
* @returns {{ jsons: string[], remainder: '' }}
13+
* @param string The string to look for JSON in
1514
*
1615
* @example
17-
* var splitter = require('json-string-splitter');
18-
*
19-
* var pieces = splitter('{"foo":"bar"}{"more":"json"}{"partial":"json"');
16+
* const pieces = splitter('{"foo":"bar"}{"more":"json"}{"partial":"json"')
2017
*
2118
* console.log(pieces.jsons[0]); // '{"foo":"bar"}'
2219
* console.log(pieces.jsons[1]); // '{"more":"json"}'
2320
* console.log(pieces.remainder); // '{"partial":"json"'
2421
*/
25-
export function splitter(string) {
26-
var START = 0, JSON = 1, STRING = 2, ESCAPE = 3;
22+
export function splitter(string: string): { jsons: string[], remainder: string } {
23+
const START = 0, JSON = 1, STRING = 2, ESCAPE = 3
2724

28-
var state = START;
29-
var nesting_level = 0;
30-
var json_start = null;
31-
var bounds = [];
25+
let state = START
26+
let nestingLevel = 0
27+
let jsonStart = null
28+
const bounds = []
3229

33-
for(var i = 0 || 0; i < string.length; ++i) {
34-
switch(state) {
35-
case START:
36-
switch(string[i]) {
37-
case '{':
38-
++nesting_level;
39-
state = JSON;
40-
json_start = i;
41-
break;
30+
for (let i = 0; i < string.length; ++i) {
31+
switch (state) {
32+
case START: {
33+
switch (string[i]) {
34+
case '{': {
35+
++nestingLevel
36+
state = JSON
37+
jsonStart = i
38+
break
39+
}
4240
}
43-
break;
44-
case JSON:
45-
switch(string[i]) {
46-
case '{': ++nesting_level; break;
47-
case '}':
48-
--nesting_level;
49-
if(nesting_level === 0) {
50-
state = START;
51-
bounds.push({ start: json_start, end: i + 1 });
41+
break
42+
}
43+
case JSON: {
44+
switch (string[i]) {
45+
case '{': {
46+
++nestingLevel
47+
break
48+
}
49+
case '}': {
50+
--nestingLevel
51+
if (nestingLevel === 0) {
52+
state = START
53+
bounds.push({ start: jsonStart, end: i + 1 })
5254
}
53-
break;
54-
case '"': state = STRING; break;
55+
break
56+
}
57+
case '"': {
58+
state = STRING
59+
break
60+
}
5561
}
56-
break;
57-
case STRING:
58-
switch(string[i]) {
59-
case '"': state = JSON; break;
60-
case '\\': state = ESCAPE; break;
62+
break
63+
}
64+
case STRING: {
65+
switch (string[i]) {
66+
case '"': {
67+
state = JSON
68+
break
69+
}
70+
case '\\': {
71+
state = ESCAPE
72+
break
73+
}
6174
}
62-
break;
63-
case ESCAPE:
64-
state = STRING;
65-
break;
75+
break
76+
}
77+
case ESCAPE: {
78+
state = STRING
79+
break
80+
}
6681
}
6782
}
6883

69-
var result = {
84+
const result = {
7085
jsons: [],
7186
remainder: string.substring(bounds[bounds.length - 1].end),
7287
}
7388

7489
bounds.forEach(function(v) {
75-
result.jsons.push(string.substring(v.start, v.end));
76-
});
90+
result.jsons.push(string.substring(v.start, v.end))
91+
})
7792

78-
return result;
93+
return result
7994
}

0 commit comments

Comments
 (0)