| var serialize = require('dom-serialize') | |
| var instanceOf = require('./util').instanceOf | |
| function isNode (obj) { | |
| return (obj.tagName || obj.nodeName) && obj.nodeType | |
| } | |
| function stringify (obj, depth) { | |
| if (depth === 0) { | |
| return '...' | |
| } | |
| if (obj === null) { | |
| return 'null' | |
| } | |
| switch (typeof obj) { | |
| case 'symbol': | |
| return obj.toString() | |
| case 'string': | |
| return "'" + obj + "'" | |
| case 'undefined': | |
| return 'undefined' | |
| case 'function': | |
| try { | |
| // function abc(a, b, c) { /* code goes here */ } | |
| // -> function abc(a, b, c) { ... } | |
| return obj.toString().replace(/\{[\s\S]*\}/, '{ ... }') | |
| } catch (err) { | |
| if (err instanceof TypeError) { | |
| // Support older browsers | |
| return 'function ' + (obj.name || '') + '() { ... }' | |
| } else { | |
| throw err | |
| } | |
| } | |
| case 'boolean': | |
| return obj ? 'true' : 'false' | |
| case 'object': | |
| var strs = [] | |
| if (instanceOf(obj, 'Array')) { | |
| strs.push('[') | |
| for (var i = 0, ii = obj.length; i < ii; i++) { | |
| if (i) { | |
| strs.push(', ') | |
| } | |
| strs.push(stringify(obj[i], depth - 1)) | |
| } | |
| strs.push(']') | |
| } else if (instanceOf(obj, 'Date')) { | |
| return obj.toString() | |
| } else if (instanceOf(obj, 'Text')) { | |
| return obj.nodeValue | |
| } else if (instanceOf(obj, 'Comment')) { | |
| return '<!--' + obj.nodeValue + '-->' | |
| } else if (obj.outerHTML) { | |
| return obj.outerHTML | |
| } else if (isNode(obj)) { | |
| return serialize(obj) | |
| } else if (instanceOf(obj, 'Error')) { | |
| return obj.toString() + '\n' + obj.stack | |
| } else { | |
| var constructor = 'Object' | |
| if (obj.constructor && typeof obj.constructor === 'function') { | |
| constructor = obj.constructor.name | |
| } | |
| strs.push(constructor) | |
| strs.push('{') | |
| var first = true | |
| for (var key in obj) { | |
| if (Object.prototype.hasOwnProperty.call(obj, key)) { | |
| if (first) { | |
| first = false | |
| } else { | |
| strs.push(', ') | |
| } | |
| strs.push(key + ': ' + stringify(obj[key], depth - 1)) | |
| } | |
| } | |
| strs.push('}') | |
| } | |
| return strs.join('') | |
| default: | |
| return obj | |
| } | |
| } | |
| module.exports = stringify |