Coverage

98%
63
62
1

prettyjson.js

98%
53
52
1
LineHitsSource
1<span class="c">// Package for formatting JSON data in a coloured </span>
2<span class="c">// YAML-style, perfect for CLI output</span>
3
4<span class="c">// ### Export package</span>
51module<span class="k">.</span>exports <span class="k">=</span> exports<span class="k">;</span>
6
7
8<span class="c">// ### Module dependencies</span>
91<span class="k">var</span> colors <span class="k">=</span> require<span class="k">(</span><span class="s">'colors'</span><span class="k">);</span>
101<span class="k">var</span> Utils <span class="k">=</span> require<span class="k">(</span><span class="s">'./utils'</span><span class="k">);</span>
111<span class="k">var</span> fs <span class="k">=</span> require<span class="k">(</span><span class="s">'fs'</span><span class="k">);</span>
12
13<span class="c">// ### Package version</span>
141exports<span class="k">.</span>version <span class="k">=</span> JSON<span class="k">.</span>parse<span class="k">(</span>fs<span class="k">.</span>readFileSync<span class="k">(</span>__dirname <span class="k">+</span> <span class="s">'/../package.json'</span><span class="k">,</span> <span class="s">'utf8'</span><span class="k">)).</span>version<span class="k">;</span>
15
16<span class="c">// ### Render function</span>
17<span class="c">// *Parameters:*</span>
18<span class="c">//</span>
19<span class="c">// * **`data`**: Data to render</span>
20<span class="c">// * **`options`**: Hash with different options to configure the parser</span>
21<span class="c">// * **`indentation`**: Base indentation of the parsed output</span>
22<span class="c">//</span>
23<span class="c">// *Example of options hash:*</span>
24<span class="c">// </span>
25<span class="c">// {</span>
26<span class="c">// emptyArrayMsg: '(empty)', // Rendered message on empty strings</span>
27<span class="c">// keysColor: 'blue', // Color for keys in hashes</span>
28<span class="c">// dashColor: 'red', // Color for the dashes in arrays</span>
29<span class="c">// defaultIndentation: 2 // Indentation on nested objects</span>
30<span class="c">// }</span>
311exports<span class="k">.</span>render <span class="k">=</span> <span class="k">function</span> render<span class="k">(</span>data<span class="k">,</span> options<span class="k">,</span> indentation<span class="k">)</span> <span class="k">{</span>
3251 <span class="s">"use strict"</span><span class="k">;</span>
33
34 <span class="c">// Default value for the indentation param</span>
3551 indentation <span class="k">=</span> indentation <span class="k">||</span> <span class="s">0</span><span class="k">;</span>
36
37 <span class="c">// Default values for the options</span>
3851 options <span class="k">=</span> options <span class="k">||</span> <span class="k">{}</span><span class="k">;</span>
3951 options<span class="k">.</span>emptyArrayMsg <span class="k">=</span> options<span class="k">.</span>emptyArrayMsg <span class="k">||</span> <span class="s">'(empty array)'</span><span class="k">;</span>
4051 options<span class="k">.</span>keysColor <span class="k">=</span> options<span class="k">.</span>keysColor <span class="k">||</span> <span class="s">"green"</span><span class="k">;</span>
4151 options<span class="k">.</span>dashColor <span class="k">=</span> options<span class="k">.</span>dashColor <span class="k">||</span> <span class="s">"green"</span><span class="k">;</span>
4251 options<span class="k">.</span>defaultIndentation <span class="k">=</span> options<span class="k">.</span>defaultIndentation <span class="k">||</span> <span class="s">2</span><span class="k">;</span>
43
44 <span class="c">// Initialize the output (it's an array of lines)</span>
4551 <span class="k">var</span> output <span class="k">=</span> <span class="k">[];</span>
46
47 <span class="c">// Helper function to detect if an object can be serializable directly</span>
4851 <span class="k">var</span> isSerializable <span class="k">=</span> <span class="k">function</span><span class="k">(</span>input<span class="k">)</span> <span class="k">{</span>
4973 <span class="k">if</span> <span class="k">(</span><span class="k">typeof</span> input <span class="k">===</span> <span class="s">'string'</span> <span class="k">||</span> <span class="k">typeof</span> input <span class="k">===</span> <span class="s">'boolean'</span> <span class="k">||</span>
50 <span class="k">typeof</span> input <span class="k">===</span> <span class="s">'number'</span> <span class="k">||</span> input <span class="k">===</span> <span class="k">null</span><span class="k">)</span> <span class="k">{</span>
5149 <span class="k">return</span> <span class="k">true</span><span class="k">;</span>
52 <span class="k">}</span>
5324 <span class="k">return</span> <span class="k">false</span><span class="k">;</span>
54 <span class="k">}</span><span class="k">;</span>
55
5651 <span class="k">var</span> addColorToData <span class="k">=</span> <span class="k">function</span><span class="k">(</span>input<span class="k">)</span> <span class="k">{</span>
5733 <span class="k">if</span> <span class="k">(</span><span class="k">typeof</span> input <span class="k">===</span> <span class="s">'string'</span><span class="k">)</span> <span class="k">{</span>
58 <span class="c">// Print strings in regular terminal color</span>
5929 <span class="k">return</span> input<span class="k">;</span>
60 <span class="k">}</span>
61
624 <span class="k">if</span> <span class="k">(</span>input <span class="k">===</span> <span class="k">true</span><span class="k">)</span> <span class="k">{</span>
631 <span class="k">return</span> <span class="k">(</span>input<span class="k">+</span><span class="s">''</span><span class="k">).</span>green<span class="k">;</span>
64 <span class="k">}</span>
653 <span class="k">if</span> <span class="k">(</span>input <span class="k">===</span> <span class="k">false</span><span class="k">)</span> <span class="k">{</span>
661 <span class="k">return</span> <span class="k">(</span>input<span class="k">+</span><span class="s">''</span><span class="k">).</span>red<span class="k">;</span>
67 <span class="k">}</span>
682 <span class="k">if</span> <span class="k">(</span>input <span class="k">===</span> <span class="k">null</span><span class="k">)</span> <span class="k">{</span>
691 <span class="k">return</span> <span class="k">(</span>input<span class="k">+</span><span class="s">''</span><span class="k">).</span>grey<span class="k">;</span>
70 <span class="k">}</span>
711 <span class="k">if</span> <span class="k">(</span><span class="k">typeof</span> input <span class="k">===</span> <span class="s">'number'</span><span class="k">)</span> <span class="k">{</span>
721 <span class="k">return</span> <span class="k">(</span>input<span class="k">+</span><span class="s">''</span><span class="k">).</span>blue<span class="k">;</span>
73 <span class="k">}</span>
740 <span class="k">return</span> <span class="k">(</span>input<span class="k">+</span><span class="s">''</span><span class="k">);</span>
75 <span class="k">}</span><span class="k">;</span>
76
77 <span class="c">// Render a string exactly equal</span>
7851 <span class="k">if</span> <span class="k">(</span>isSerializable<span class="k">(</span>data<span class="k">))</span> <span class="k">{</span>
7933 output<span class="k">.</span>push<span class="k">(</span>Utils<span class="k">.</span>indent<span class="k">(</span>indentation<span class="k">)</span> <span class="k">+</span> addColorToData<span class="k">(</span>data<span class="k">));</span>
80 <span class="k">}</span>
8118 <span class="k">else</span> <span class="k">if</span> <span class="k">(</span>Array<span class="k">.</span>isArray<span class="k">(</span>data<span class="k">))</span> <span class="k">{</span>
82 <span class="c">// If the array is empty, render the `emptyArrayMsg`</span>
838 <span class="k">if</span> <span class="k">(</span>data<span class="k">.</span>length <span class="k">===</span> <span class="s">0</span><span class="k">)</span> <span class="k">{</span>
842 output<span class="k">.</span>push<span class="k">(</span>Utils<span class="k">.</span>indent<span class="k">(</span>indentation<span class="k">)</span> <span class="k">+</span> options<span class="k">.</span>emptyArrayMsg<span class="k">);</span>
85 <span class="k">}</span> <span class="k">else</span> <span class="k">{</span>
866 data<span class="k">.</span>forEach<span class="k">(</span><span class="k">function</span><span class="k">(</span>element<span class="k">)</span> <span class="k">{</span>
87 <span class="c">// Prepend the dash at the begining of each array's element line</span>
8813 <span class="k">var</span> line <span class="k">=</span> Utils<span class="k">.</span>indent<span class="k">(</span>indentation<span class="k">)</span> <span class="k">+</span> <span class="k">(</span><span class="s">'- '</span><span class="k">)[</span>options<span class="k">.</span>dashColor<span class="k">];</span>
89
90 <span class="c">// If the element of the array is a string, render it in the same line</span>
9113 <span class="k">if</span> <span class="k">(</span><span class="k">typeof</span> element <span class="k">===</span> <span class="s">'string'</span><span class="k">)</span> <span class="k">{</span>
9211 line <span class="k">+=</span> exports<span class="k">.</span>render<span class="k">(</span>element<span class="k">,</span> options<span class="k">);</span>
9311 output<span class="k">.</span>push<span class="k">(</span>line<span class="k">);</span>
94
95 <span class="c">// If the element of the array is an array or object, render it in next line</span>
96 <span class="k">}</span> <span class="k">else</span> <span class="k">{</span>
972 output<span class="k">.</span>push<span class="k">(</span>line<span class="k">);</span>
982 output<span class="k">.</span>push<span class="k">(</span>
99 exports<span class="k">.</span>render<span class="k">(</span>element<span class="k">,</span> options<span class="k">,</span> indentation <span class="k">+</span> options<span class="k">.</span>defaultIndentation<span class="k">)</span>
100 <span class="k">);</span>
101 <span class="k">}</span>
102 <span class="k">}</span><span class="k">);</span>
103 <span class="k">}</span>
104 <span class="k">}</span>
10510 <span class="k">else</span> <span class="k">if</span> <span class="k">(</span><span class="k">typeof</span> data <span class="k">===</span> <span class="s">'object'</span><span class="k">)</span> <span class="k">{</span>
106 <span class="c">// Get the size of the longest index to render all the values on the same column</span>
10710 <span class="k">var</span> maxIndexLength <span class="k">=</span> Utils<span class="k">.</span>getMaxIndexLength<span class="k">(</span>data<span class="k">);</span>
10810 <span class="k">var</span> key<span class="k">;</span>
109
11010 <span class="k">for</span><span class="k">(</span><span class="k">var</span> i <span class="k">in</span> data<span class="k">)</span> <span class="k">{</span>
111 <span class="c">// Prepend the index at the beginning of the line</span>
11222 key <span class="k">=</span> Utils<span class="k">.</span>indent<span class="k">(</span>indentation<span class="k">)</span> <span class="k">+</span> <span class="k">(</span>i <span class="k">+</span> <span class="s">': '</span><span class="k">)[</span>options<span class="k">.</span>keysColor<span class="k">];</span>
113
114 <span class="c">// If the value is serializable, render it in the same line</span>
11522 <span class="k">if</span> <span class="k">(</span>isSerializable<span class="k">(</span>data<span class="k">[</span>i<span class="k">]))</span> <span class="k">{</span>
11616 key <span class="k">+=</span> exports<span class="k">.</span>render<span class="k">(</span>data<span class="k">[</span>i<span class="k">],</span> options<span class="k">,</span> maxIndexLength <span class="k">-</span> i<span class="k">.</span>length<span class="k">);</span>
11716 output<span class="k">.</span>push<span class="k">(</span>key<span class="k">);</span>
118
119 <span class="c">// If the index is an array or object, render it in next line</span>
120 <span class="k">}</span> <span class="k">else</span> <span class="k">{</span>
1216 output<span class="k">.</span>push<span class="k">(</span>key<span class="k">);</span>
1226 output<span class="k">.</span>push<span class="k">(</span>
123 exports<span class="k">.</span>render<span class="k">(</span>data<span class="k">[</span>i<span class="k">],</span> options<span class="k">,</span> indentation <span class="k">+</span> options<span class="k">.</span>defaultIndentation<span class="k">)</span>
124 <span class="k">);</span>
125 <span class="k">}</span>
126 <span class="k">}</span>
127 <span class="k">}</span>
128 <span class="c">// Return all the lines as a string</span>
12951 <span class="k">return</span> output<span class="k">.</span>join<span class="k">(</span><span class="s">'</span><span class="t">\n</span><span class="s">'</span><span class="k">);</span>
130<span class="k">}</span><span class="k">;</span>

utils.js

100%
10
10
0
LineHitsSource
11<span class="s">"use strict"</span><span class="k">;</span>
2
3<span class="c">/**</span>
4<span class="c"> * Creates a string with the same length as `numSpaces` parameter</span>
5<span class="c"> **/</span>
61exports<span class="k">.</span>indent <span class="k">=</span> <span class="k">function</span> indent<span class="k">(</span>numSpaces<span class="k">)</span> <span class="k">{</span>
770 <span class="k">return</span> <span class="k">new</span> Array<span class="k">(</span>numSpaces<span class="k">+</span><span class="s">1</span><span class="k">).</span>join<span class="k">(</span><span class="s">' '</span><span class="k">);</span>
8<span class="k">}</span><span class="k">;</span>
9
10<span class="c">/**</span>
11<span class="c"> * Gets the string length of the longer index in a hash</span>
12<span class="c"> **/</span>
131exports<span class="k">.</span>getMaxIndexLength <span class="k">=</span> <span class="k">function</span><span class="k">(</span>input<span class="k">)</span> <span class="k">{</span>
1410 <span class="k">var</span> maxWidth <span class="k">=</span> <span class="s">0</span><span class="k">;</span>
1510 <span class="k">var</span> key<span class="k">;</span>
16
1710 <span class="k">for</span> <span class="k">(</span>key <span class="k">in</span> input<span class="k">)</span> <span class="k">{</span>
1822 <span class="k">if</span> <span class="k">(</span>key<span class="k">.</span>length <span class="k">></span> maxWidth<span class="k">)</span> <span class="k">{</span>
1915 maxWidth <span class="k">=</span> key<span class="k">.</span>length<span class="k">;</span>
20 <span class="k">}</span>
21 <span class="k">}</span>
2210 <span class="k">return</span> maxWidth<span class="k">;</span>
23<span class="k">}</span><span class="k">;</span>