var serialize = null try { serialize = require('dom-serialize') } catch (e) { // Ignore failure on IE8 } 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 '' } else if (obj.outerHTML) { return obj.outerHTML } else if (isNode(obj)) { if (serialize) { return serialize(obj) } else { return 'Skipping stringify, no support for dom-serialize' } } 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