Test Report

0
0
34
51

ID Title Duration (ms)
1 Purdy should display an error 8
2 Purdy should display an error with detail 4
3 Purdy should indent array correctly 5
4 Purdy allows for removal of array index 1
5 Purdy honors indent level 0
6 Purdy prints arguments function 1
7 Purdy should print plain 0
8 Purdy should handle circular references 2
9 Purdy should print a function 0
10 Purdy should print an anonymous function 1
11 Purdy should print a string 0
12 Purdy should print a date 2
13 Purdy should print a number 1
14 Purdy should print null 0
15 Purdy should print undefined 1
16 Purdy should print a regular expression 0
17 Purdy should print a false boolean 1
18 Purdy should print a true boolean 0
19 Purdy should print an empty array without extra indentation 0
20 Purdy should print an empty object without extra indentation 0
21 Purdy should print a more complex object 3
22 Purdy should not print circular after second use 1
23 Purdy shows circular reference with path 1
24 Purdy will keep a path for an object in Hoek format 3
25 Purdy indents object the way it should 1
26 Purdy aligns object the way it should 1
27 Purdy prints directly to console 2
28 Purdy prints symbols 1
29 Purdy prints only symbols 0
30 Purdy obeys depth printing 1
31 Purdy should handle depth printing for array 0
32 Purdy should print using zero depth 1
33 Purdy should handle depth printing for mixed 0
34 Purdy should handle depth printing using null depth 1

Code Coverage Report

99.52%
208
207
1

lib/index.js

99.52%
208
207
1
Line Lint Hits Source
1 // Load modules
2
3 1 var Chalk = require('chalk');
4 1 var Hoek = require('hoek');
5
6
7 // declare internals
8
9 1 var internals = {
10 indentLevel: 0,
11 colors: {
12 BoolFalse: 'red.bold',
13 BoolTrue: 'green.bold',
14 Circular: 'grey.bold',
15 Date: 'green',
16 Function: 'cyan',
17 Key: 'white.bold',
18 Null: 'red.bold',
19 Number: 'blue.bold',
20 RegExp: 'magenta',
21 String: 'yellow',
22 Symbol: 'magenta.bold',
23 Undefined: 'red.inverse',
24 depth: 'grey',
25 error: 'red',
26 path: 'blue'
27 },
28 defaults: {
29 depth: 2,
30 plain: false,
31 path: false,
32 indent: 4,
33 align: 'left',
34 arrayIndex: true,
35 pathPrefix: '// '
36 }
37 };
38
39
40 1 internals.purdy = function (object, options) {
41
42 1 return console.log(internals.stringify(object, options));
43 };
44
45
46 1 internals.stringify = function (object, options) {
47
48 37 internals.seen = [];
49 37 internals.path = [];
50 37 internals.settings = Hoek.applyToDefaults(internals.defaults, options || {}, true);
51 37 return internals.travel(object, '', 0);
52 };
53
54
55 1 internals.purdy.stringify = internals.stringify;
56
57
58 1 module.exports = internals.purdy;
59
60
61 1 internals.travel = function (object, path, depth) {
62
63 130 var type = toString.call(object).split(' ')[1].slice(0, -1);
64 130 var format = '';
65
66 130 if (internals[type]) {
67 74 format = internals[type](object, path, depth);
68 }
69 else {
70 56 format = String(object);
71 }
72
73 130 return internals.colorize(format, type);
74 };
75
76
77 1 internals.colorize = function (string, type) {
78
79 222 if (internals.settings.plain) {
80 130 return string;
81 }
82
83 92 var colors = internals.colors[type];
84 92 if (!colors) {
85 23 return string;
86 }
87
88 69 var colorArr = colors.split('.');
89
90 69 for (var i = 0, il = colorArr.length; i < il; ++i) {
91 118 var color = colorArr[i];
92 118 string = Chalk[color](string);
93 }
94
95 69 return string;
96 };
97
98
99 1 internals.lengthCompare = function (a, b) {
100
101 78 return a.length - b.length;
102 };
103
104
105 1 internals.tidyPath = function (path) {
106
107 4 return internals.colorize(path.slice(1, path.size), 'path');
108 };
109
110 1 internals.Object = internals.process = internals.global = function (object, path, depth) {
111
112 34 var keys = Object.keys(object);
113
114
if (
Object.getOwnPropertySymbols
) {
115 34 keys = keys.concat(Object.getOwnPropertySymbols(object));
116 }
117
118 34 if (keys.length === 0) {
119 1 return '{}';
120 }
121
122 33 ++depth;
123 33 var index = internals.seen.indexOf(object);
124 33 if (index !== -1) {
125 3 return internals.showCircular(index);
126 }
127 30 internals.seen.push(object);
128 30 internals.path.push(path);
129
130 30 var keyLengths = Hoek.clone(keys);
131 30 internals.indentLevel = internals.indentLevel + 1;
132 30 var out = '{\n';
133
134 30 for (var i = 0, il = keys.length; i < il; ++i) {
135 50 var key = keys[i];
136 50 var item = object[key];
137 50 if (internals.settings.path && path.length > 0) {
138 3 keyLengths.push(internals.settings.pathPrefix);
139 3 out = out + internals.indent() +
140 internals.colorize(internals.settings.pathPrefix, 'path') +
141 internals.tidyPath(path + '.' + key) + '\n';
142 }
143 50 var longest = keyLengths.sort(internals.lengthCompare)[keyLengths.length - 1];
144 50 var keyStr = key.toString();
145
146 50 if (internals.settings.depth === null || internals.settings.depth + 1 >= depth) {
147 48 out = out + internals.indent() + '' + (internals.printMember(keyStr, longest) + ':') + ' ' + internals.travel(item, path + '.' + keyStr, depth);
148 }
149 else {
150 2 internals.indentLevel = internals.indentLevel - 1;
151 2 return internals.colorize('[Object]', 'depth');
152 }
153 48 if (i !== il - 1) {
154 20 out = out + ',';
155 }
156 48 out = out + '\n';
157 }
158 28 internals.indentLevel = internals.indentLevel - 1;
159 28 out = out + internals.indent() + '}';
160 28 return out;
161 };
162
163
164 1 internals.showCircular = function (index) {
165
166 5 var showPath = internals.path[index];
167 5 showPath = showPath === '' ? '' : ' ' + showPath.slice(1, showPath.length);
168 5 return internals.colorize('[Circular~' + showPath + ']', 'Circular');
169 };
170
171
172 1 internals.Array = function (array, path, depth) {
173
174 23 if (array.length === 0) {
175 1 return '[]';
176 }
177
178 22 ++depth;
179 22 var index = internals.seen.indexOf(array);
180 22 if (index !== -1) {
181 2 return internals.showCircular(index);
182 }
183 20 internals.seen.push(array);
184 20 internals.path.push(path);
185
186 20 var out = '[\n';
187 20 internals.indentLevel = internals.indentLevel + 1;
188
189 20 for (var i = 0, il = array.length; i < il; ++i) {
190 48 var item = array[i];
191 48 if (internals.settings.path && path.length > 0) {
192 1 out = out + internals.indent() +
193 internals.colorize(internals.settings.pathPrefix, 'path') +
194 internals.tidyPath(path + '.' + i) + '\n';
195 }
196 48 var indexStr = internals.settings.arrayIndex ? '[' + internals.printMember(i, il) + '] ' : '';
197 48 if (internals.settings.depth === null || internals.settings.depth + 1 >= depth) {
198 45 out = out + internals.indent() + '' + indexStr + internals.travel(item, path + '.' + i, depth);
199 }
200 else {
201 3 internals.indentLevel = internals.indentLevel - 1;
202 3 return internals.colorize('[Object]', 'depth');
203 }
204 45 if (i !== il - 1) {
205 28 out = out + ',';
206 }
207 45 out = out + '\n';
208 }
209 17 internals.indentLevel = internals.indentLevel - 1;
210 17 out = out + internals.indent() + ']';
211 17 return out;
212 };
213
214
215 1 internals.Error = function (err) {
216
217 2 if (Object.keys(err).length === 0) {
218 1 return internals.colorize('[' + err + ']', 'error');
219 }
220 1 var obj = internals.Object(err);
221 1 return obj.replace(/^{/, '{ ' + internals.colorize('[Error: ' + err.message + ']', 'error') );
222 };
223
224
225 1 internals.String = function (str) {
226
227 12 return '\'' + str + '\'';
228 };
229
230 1 internals.Arguments = function (obj) {
231
232 1 var arr = Array.prototype.slice.call(obj);
233 1 return internals.Array(arr);
234 };
235
236
237 1 internals.Boolean = function (bool) {
238
239 2 if (bool === true) {
240 1 return internals.colorize(bool + '', 'BoolTrue');
241 }
242 1 return internals.colorize(bool + '', 'BoolFalse');
243 };
244
245
246 1 internals.Function = function (func) {
247
248 2 if (func.name) {
249 1 return internals.colorize('[Function: ' + func.name + ']', 'Function');
250 }
251 1 return internals.colorize('[Function: ?]', 'Function');
252 };
253
254
255 1 internals.indent = function () {
256
257 142 return internals.spaces(internals.indentLevel * internals.settings.indent);
258 };
259
260
261 1 internals.spaces = function (count) {
262
263 210 var out = '';
264 210 for (var i = 0; i < count; i++) {
265 765 out = out + ' ';
266 }
267
268 210 return out;
269 };
270
271
272 1 internals.printMember = function (member, max) {
273
274 68 if (internals.settings.align === 'left') {
275 40 max = 0;
276 }
277 68 var memberLength = member.length;
278 68 var maxLength = max.length;
279 68 var toShift = maxLength - memberLength;
280 68 return internals.colorize(internals.spaces(toShift) + member, 'Key');
281 };
282

Linting Report

Nothing to show here, linting is disabled.