function escapeString(string) { string = string.replace(/\\/g, "\\\\"). replace(/\n/g, "\\n"). replace(/\r/g, "\\r"). replace(/\t/g, "\\t"); if (string.indexOf("'") < 0) { return "'" + string + "'"; } string = string.replace(/"/g, "\\\""); return '"' + string + '"'; } function escapeKey(string, enumerable) { if (!enumerable) { return "[" + string + "]"; } if ((/[a-z_$][a-z0-9_$]*/i).test(string)) { return string; } return escapeString(string); } function getType(object) { var proto = object.__proto__; if (!(proto && proto.constructor)) { return ""; } return proto.constructor.name; } function inspect(value, keyer, short) { if (value === undefined) { return "undefined"; } if (value === null) { return "null"; } if (value === true) { return "true"; } if (value === false) { return "false"; } switch (typeof value) { case 'object': case 'function': if (short) { return "(" + getType(value) + (Object.keys(value).length ? "..." : "") + ")"; } var type = getType(value); var parts = keyer(value).map(function (key, i) { var prop = Object.getOwnPropertyDescriptor(value, key); if (prop.hasOwnProperty("value")) { return (i.toString() !== key ? escapeKey(key, prop.enumerable) + ": " : "") + inspect(prop.value, keyer, true); } if (prop.get) { if (prop.set) { return escapeKey(key, prop.enumerable) + ": [Getter/Setter]"; } return escapeKey(key, prop.enumerable) + ": [Getter]"; } else if (prop.set) { return escapeKey(key, prop.enumerable) + ": [Setter]"; } }); var body; if (parts.length) { body = " " + parts.join(", ") + " "; if (body.length > 77 - type.length) { body = "\n " + parts.join(",\n ") + "\n"; } } else { body = ""; } return "(" + type + body + ")"; case 'number': return value.toString(); case 'string': return escapeString(value); } throw new Error("Not Implemented"); } var types = { Number: [Number, 42], String: [String, "Hello"], Date: [Date, new Date(Date.now())], RegExp: [RegExp, new RegExp("Find Me", "gi")], Object: [Object, {name: "Tim", age: 28}], Array: [Array, [1,2,3,4]], Buffer: [Buffer, new Buffer(4)], EventEmitter: [process.EventEmitter, process] } Object.keys(types).map(function (name) { var type = types[name][0], prototype = type.prototype, example = types[name][1]; console.log("%s -> %s", name, inspect(type, Object.getOwnPropertyNames)); console.log("%s.prototype -> %s", name, inspect(prototype, Object.getOwnPropertyNames)); console.log("example %s -> %s\n", name, inspect(example, Object.getOwnPropertyNames)); }); var modules = ["http", "net", "url", "path", "querystring", "child_process", "step", "connect", "haml", "nstore"]; modules.map(function (name) { console.log("%s -> %s", name, inspect(require(name), Object.getOwnPropertyNames)); });