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 |
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 |