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