UNPKG

1.9 kBJavaScriptView Raw
1const sort = require('./sort');
2
3function repeat(s, count) {
4 return new Array(count + 1).join(s);
5}
6
7function formatJSON(source, indent) {
8 var i = 0; // eslint-disable-line no-var
9 var il = 0; // eslint-disable-line no-var
10 var tab = (typeof indent === 'undefined') ? ' ' : indent; // eslint-disable-line no-var
11 var newJson = ''; // eslint-disable-line no-var
12 var indentLevel = 0; // eslint-disable-line no-var
13 var inString = false; // eslint-disable-line no-var
14 var currentChar = null; // eslint-disable-line no-var
15
16 for (i = 0, il = source.length; i < il; i += 1) {
17 currentChar = source.charAt(i);
18
19 switch (currentChar) {
20 case '{':
21 case '[':
22 if (inString) {
23 newJson += currentChar;
24 } else {
25 newJson += currentChar + '\n' + repeat(tab, indentLevel + 1); // eslint-disable-line prefer-template
26 indentLevel += 1;
27 }
28 break;
29 case '}':
30 case ']':
31 if (inString) {
32 newJson += currentChar;
33 } else {
34 indentLevel -= 1;
35 newJson += '\n' + repeat(tab, indentLevel) + currentChar; // eslint-disable-line prefer-template
36 }
37 break;
38 case ',':
39 if (inString) {
40 newJson += currentChar;
41 } else {
42 newJson += ',\n' + repeat(tab, indentLevel); // eslint-disable-line prefer-template
43 }
44 break;
45 case ':':
46 if (inString) {
47 newJson += currentChar;
48 } else {
49 newJson += ': ';
50 }
51 break;
52 case ' ':
53 case '\n':
54 case '\t':
55 if (inString) {
56 newJson += currentChar;
57 }
58 break;
59 case '"':
60 if (i > 0 && source.charAt(i - 1) !== '\\') {
61 inString = !inString;
62 }
63 newJson += currentChar;
64 break;
65 default:
66 newJson += currentChar;
67 break;
68 }
69 }
70 return newJson;
71}
72
73module.exports = (data, settings) => {
74 const sorted = settings.sort ?
75 sort(data) :
76 data;
77 return formatJSON(JSON.stringify(sorted), settings.indent.replace(/["']/g, ''));
78};