Test Report

1
0
27
52

ID Title Duration (ms)
1 Purdy should display an error 6
2 Purdy should display an error with detail 4
3 Purdy should indent array correctly 4
4 Purdy allows for removal of array index 1
5 Purdy honors indent level 1
6 Purdy should print plain 0
7 Purdy should handle circular references 2
8 Purdy should print a function 0
9 Purdy should print an anonymous function
Error: Expected '\u001b[36m\u001b[36m[Function: bound ]\...' to equal specified value at null.<anonymous> (/Users/daniel/sync/purdy.js/node_modules/code/lib/index.js:199:17) at /Users/daniel/sync/purdy.js/test/purdy.js:89:24 at Immediate._onImmediate (/Users/daniel/sync/purdy.js/node_modules/lab/lib/runner.js:455:17) at processImmediate [as _immediateCallback] (timers.js:383:17)
2
10 Purdy should print a string 1
11 Purdy should print a date 2
12 Purdy should print a number 0
13 Purdy should print null 1
14 Purdy should print undefined 0
15 Purdy should print a regular expression 1
16 Purdy should print a false boolean 0
17 Purdy should print a true boolean 1
18 Purdy should print an empty array without extra indentation 0
19 Purdy should print an empty object without extra indentation 1
20 Purdy should print a more complex object 3
21 Purdy should not print circular after second use 0
22 Purdy shows circular reference with path 1
23 Purdy will keep a path for an object in Hoek format 8
24 Purdy indents object the way it should 2
25 Purdy aligns object the way it should 2
26 Purdy prints directly to console 3
27 Purdy prints symbols 0

Code Coverage Report

98.40%
187
184
3

lib/index.js

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

Linting Report

Nothing to show here, linting is disabled.