|
|
@ -1,26 +1,26 @@ |
|
|
|
var events = require('events'); |
|
|
|
|
|
|
|
|
|
|
|
exports.print = function () { |
|
|
|
exports.print = function() { |
|
|
|
for (var i = 0, len = arguments.length; i < len; ++i) { |
|
|
|
process.stdout.write(String(arguments[i])); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
exports.puts = function () { |
|
|
|
exports.puts = function() { |
|
|
|
for (var i = 0, len = arguments.length; i < len; ++i) { |
|
|
|
process.stdout.write(arguments[i] + '\n'); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
exports.debug = function (x) { |
|
|
|
process.binding('stdio').writeError("DEBUG: " + x + "\n"); |
|
|
|
exports.debug = function(x) { |
|
|
|
process.binding('stdio').writeError('DEBUG: ' + x + '\n'); |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var error = exports.error = function (x) { |
|
|
|
var error = exports.error = function(x) { |
|
|
|
for (var i = 0, len = arguments.length; i < len; ++i) { |
|
|
|
process.binding('stdio').writeError(arguments[i] + '\n'); |
|
|
|
} |
|
|
@ -31,41 +31,41 @@ var error = exports.error = function (x) { |
|
|
|
* Echos the value of a value. Trys to print the value out |
|
|
|
* in the best way possible given the different types. |
|
|
|
* |
|
|
|
* @param {Object} value The object to print out |
|
|
|
* @param {Object} value The object to print out. |
|
|
|
* @param {Boolean} showHidden Flag that shows hidden (not enumerable) |
|
|
|
* properties of objects. |
|
|
|
* @param {Number} depth Depth in which to descend in object. Default is 2. |
|
|
|
* @param {Boolean} colors Flag to turn on ANSI escape codes to color the |
|
|
|
* output. Default is false (no coloring). |
|
|
|
*/ |
|
|
|
exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
exports.inspect = function(obj, showHidden, depth, colors) { |
|
|
|
var seen = []; |
|
|
|
|
|
|
|
var stylize = function (str, styleType) { |
|
|
|
var stylize = function(str, styleType) { |
|
|
|
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
|
|
|
var styles = { 'bold' : [1, 22] |
|
|
|
, 'italic' : [3, 23] |
|
|
|
, 'underline' : [4, 24] |
|
|
|
, 'inverse' : [7, 27] |
|
|
|
, 'white' : [37, 39] |
|
|
|
, 'grey' : [90, 39] |
|
|
|
, 'black' : [30, 39] |
|
|
|
, 'blue' : [34, 39] |
|
|
|
, 'cyan' : [36, 39] |
|
|
|
, 'green' : [32, 39] |
|
|
|
, 'magenta' : [35, 39] |
|
|
|
, 'red' : [31, 39] |
|
|
|
, 'yellow' : [33, 39] |
|
|
|
var styles = { 'bold' : [1, 22] |
|
|
|
, 'italic' : [3, 23] |
|
|
|
, 'underline' : [4, 24] |
|
|
|
, 'inverse' : [7, 27] |
|
|
|
, 'white' : [37, 39] |
|
|
|
, 'grey' : [90, 39] |
|
|
|
, 'black' : [30, 39] |
|
|
|
, 'blue' : [34, 39] |
|
|
|
, 'cyan' : [36, 39] |
|
|
|
, 'green' : [32, 39] |
|
|
|
, 'magenta' : [35, 39] |
|
|
|
, 'red' : [31, 39] |
|
|
|
, 'yellow' : [33, 39] |
|
|
|
}; |
|
|
|
var style = { "special": "grey" |
|
|
|
, "number": "blue" |
|
|
|
, "boolean": "blue" |
|
|
|
, "undefined": "red" |
|
|
|
, "null": "red" |
|
|
|
, "string": "green" |
|
|
|
, "date": "magenta" |
|
|
|
var style = { 'special': 'grey' |
|
|
|
, 'number': 'blue' |
|
|
|
, 'boolean': 'blue' |
|
|
|
, 'undefined': 'red' |
|
|
|
, 'null': 'red' |
|
|
|
, 'string': 'green' |
|
|
|
, 'date': 'magenta' |
|
|
|
//, "name": intentionally not styling
|
|
|
|
, "regexp": "cyan" |
|
|
|
, 'regexp': 'cyan' |
|
|
|
}[styleType]; |
|
|
|
if (style) { |
|
|
|
return '\033[' + styles[style][0] + 'm' + str + |
|
|
@ -92,13 +92,13 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
// Primitive types cannot have properties
|
|
|
|
switch (typeof value) { |
|
|
|
case 'undefined': return stylize('undefined', 'undefined'); |
|
|
|
case 'string': return stylize( |
|
|
|
case 'string': return stylize( |
|
|
|
JSON.stringify(value).replace(/'/g, "\\'") |
|
|
|
.replace(/\\"/g, '"') |
|
|
|
.replace(/(^"|"$)/g, "'"), |
|
|
|
'string'); |
|
|
|
case 'number': return stylize('' + value, 'number'); |
|
|
|
case 'boolean': return stylize('' + value, 'boolean'); |
|
|
|
case 'number': return stylize('' + value, 'number'); |
|
|
|
case 'boolean': return stylize('' + value, 'boolean'); |
|
|
|
} |
|
|
|
// For some reason typeof null is "object", so special case here.
|
|
|
|
if (value === null) { |
|
|
@ -114,7 +114,7 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
if (isRegExp(value)) { |
|
|
|
return stylize('' + value, 'regexp'); |
|
|
|
} else { |
|
|
|
return stylize('[Function'+ (value.name ? ': '+ value.name : '')+ ']', 'special'); |
|
|
|
return stylize('[Function' + (value.name ? ': ' + value.name : '') + ']', 'special'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -127,17 +127,17 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
// Determine the object type
|
|
|
|
if (isArray(value)) { |
|
|
|
type = 'Array'; |
|
|
|
braces = ["[", "]"]; |
|
|
|
braces = ['[', ']']; |
|
|
|
} else { |
|
|
|
type = 'Object'; |
|
|
|
braces = ["{", "}"]; |
|
|
|
braces = ['{', '}']; |
|
|
|
} |
|
|
|
|
|
|
|
// Make functions say that they are functions
|
|
|
|
if (typeof value === 'function') { |
|
|
|
base = (isRegExp(value)) ? ' ' + value : ' [Function'+ (value.name ? ': '+ value.name : '')+ ']'; |
|
|
|
base = (isRegExp(value)) ? ' ' + value : ' [Function' + (value.name ? ': ' + value.name : '') + ']'; |
|
|
|
} else { |
|
|
|
base = ""; |
|
|
|
base = ''; |
|
|
|
} |
|
|
|
|
|
|
|
// Make dates with properties first say the date
|
|
|
@ -151,35 +151,35 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
|
|
|
|
if (recurseTimes < 0) { |
|
|
|
if (isRegExp(value)) { |
|
|
|
return stylize('' + value, "regexp"); |
|
|
|
return stylize('' + value, 'regexp'); |
|
|
|
} else { |
|
|
|
return stylize("[Object]", "special"); |
|
|
|
return stylize('[Object]', 'special'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
seen.push(value); |
|
|
|
|
|
|
|
var output = keys.map(function (key) { |
|
|
|
var output = keys.map(function(key) { |
|
|
|
var name, str; |
|
|
|
if (value.__lookupGetter__) { |
|
|
|
if (value.__lookupGetter__(key)) { |
|
|
|
if (value.__lookupSetter__(key)) { |
|
|
|
str = stylize("[Getter/Setter]", "special"); |
|
|
|
str = stylize('[Getter/Setter]', 'special'); |
|
|
|
} else { |
|
|
|
str = stylize("[Getter]", "special"); |
|
|
|
str = stylize('[Getter]', 'special'); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (value.__lookupSetter__(key)) { |
|
|
|
str = stylize("[Setter]", "special"); |
|
|
|
str = stylize('[Setter]', 'special'); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (visible_keys.indexOf(key) < 0) { |
|
|
|
name = "[" + key + "]"; |
|
|
|
name = '[' + key + ']'; |
|
|
|
} |
|
|
|
if (!str) { |
|
|
|
if (seen.indexOf(value[key]) < 0) { |
|
|
|
if ( recurseTimes === null) { |
|
|
|
if (recurseTimes === null) { |
|
|
|
str = format(value[key]); |
|
|
|
} else { |
|
|
|
str = format(value[key], recurseTimes - 1); |
|
|
@ -205,17 +205,17 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
} |
|
|
|
name = JSON.stringify('' + key); |
|
|
|
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { |
|
|
|
name = name.substr(1, name.length-2); |
|
|
|
name = stylize(name, "name"); |
|
|
|
name = name.substr(1, name.length - 2); |
|
|
|
name = stylize(name, 'name'); |
|
|
|
} else { |
|
|
|
name = name.replace(/'/g, "\\'") |
|
|
|
.replace(/\\"/g, '"') |
|
|
|
.replace(/(^"|"$)/g, "'"); |
|
|
|
name = stylize(name, "string"); |
|
|
|
name = stylize(name, 'string'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return name + ": " + str; |
|
|
|
return name + ': ' + str; |
|
|
|
}); |
|
|
|
|
|
|
|
seen.pop(); |
|
|
@ -223,7 +223,7 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
var numLinesEst = 0; |
|
|
|
var length = output.reduce(function(prev, cur) { |
|
|
|
numLinesEst++; |
|
|
|
if( cur.indexOf('\n') >= 0 ) { |
|
|
|
if (cur.indexOf('\n') >= 0) { |
|
|
|
numLinesEst++; |
|
|
|
} |
|
|
|
return prev + cur.length + 1; |
|
|
@ -235,8 +235,8 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
+ ' ' |
|
|
|
+ output.join(',\n ') |
|
|
|
+ ' ' |
|
|
|
+ braces[1] |
|
|
|
; |
|
|
|
+ braces[1]; |
|
|
|
|
|
|
|
} else { |
|
|
|
output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; |
|
|
|
} |
|
|
@ -247,18 +247,18 @@ exports.inspect = function (obj, showHidden, depth, colors) { |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
function isArray (ar) { |
|
|
|
function isArray(ar) { |
|
|
|
return ar instanceof Array |
|
|
|
|| Array.isArray(ar) |
|
|
|
|| (ar && ar !== Object.prototype && isArray(ar.__proto__)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function isRegExp (re) { |
|
|
|
var s = ""+re; |
|
|
|
function isRegExp(re) { |
|
|
|
var s = ''+ re; |
|
|
|
return re instanceof RegExp // easy case
|
|
|
|
|| typeof(re) === "function" // duck-type for context-switching evalcx case
|
|
|
|
&& re.constructor.name === "RegExp" |
|
|
|
|| typeof(re) === 'function' // duck-type for context-switching evalcx case
|
|
|
|
&& re.constructor.name === 'RegExp' |
|
|
|
&& re.compile |
|
|
|
&& re.test |
|
|
|
&& re.exec |
|
|
@ -266,9 +266,9 @@ function isRegExp (re) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function isDate (d) { |
|
|
|
function isDate(d) { |
|
|
|
if (d instanceof Date) return true; |
|
|
|
if (typeof d !== "object") return false; |
|
|
|
if (typeof d !== 'object') return false; |
|
|
|
var properties = Date.prototype && Object.getOwnPropertyNames(Date.prototype); |
|
|
|
var proto = d.__proto__ && Object.getOwnPropertyNames(d.__proto__); |
|
|
|
return JSON.stringify(proto) === JSON.stringify(properties); |
|
|
@ -277,9 +277,9 @@ function isDate (d) { |
|
|
|
|
|
|
|
var pWarning; |
|
|
|
|
|
|
|
exports.p = function () { |
|
|
|
exports.p = function() { |
|
|
|
if (!pWarning) { |
|
|
|
pWarning = "util.p will be removed in future versions of Node. Use util.puts(util.inspect()) instead.\n"; |
|
|
|
pWarning = 'util.p will be removed in future versions of Node. Use util.puts(util.inspect()) instead.\n'; |
|
|
|
exports.error(pWarning); |
|
|
|
} |
|
|
|
for (var i = 0, len = arguments.length; i < len; ++i) { |
|
|
@ -288,7 +288,7 @@ exports.p = function () { |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
function pad (n) { |
|
|
|
function pad(n) { |
|
|
|
return n < 10 ? '0' + n.toString(10) : n.toString(10); |
|
|
|
} |
|
|
|
|
|
|
@ -296,22 +296,22 @@ function pad (n) { |
|
|
|
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; |
|
|
|
|
|
|
|
// 26 Feb 16:19:34
|
|
|
|
function timestamp () { |
|
|
|
function timestamp() { |
|
|
|
var d = new Date(); |
|
|
|
return [ d.getDate() |
|
|
|
return [d.getDate() |
|
|
|
, months[d.getMonth()] |
|
|
|
, [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':') |
|
|
|
].join(' '); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
exports.log = function (msg) { |
|
|
|
exports.log = function(msg) { |
|
|
|
exports.puts(timestamp() + ' - ' + msg.toString()); |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var execWarning; |
|
|
|
exports.exec = function () { |
|
|
|
exports.exec = function() { |
|
|
|
if (!execWarning) { |
|
|
|
execWarning = 'util.exec has moved to the "child_process" module. Please update your source code.'; |
|
|
|
error(execWarning); |
|
|
@ -320,49 +320,49 @@ exports.exec = function () { |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
exports.pump = function (readStream, writeStream, callback) { |
|
|
|
exports.pump = function(readStream, writeStream, callback) { |
|
|
|
var callbackCalled = false; |
|
|
|
|
|
|
|
function call (a, b, c) { |
|
|
|
function call(a, b, c) { |
|
|
|
if (callback && !callbackCalled) { |
|
|
|
callback(a, b, c); |
|
|
|
callbackCalled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!readStream.pause) readStream.pause = function () {readStream.emit("pause");}; |
|
|
|
if (!readStream.resume) readStream.resume = function () {readStream.emit("resume");}; |
|
|
|
if (!readStream.pause) readStream.pause = function() {readStream.emit('pause');}; |
|
|
|
if (!readStream.resume) readStream.resume = function() {readStream.emit('resume');}; |
|
|
|
|
|
|
|
readStream.addListener("data", function (chunk) { |
|
|
|
readStream.addListener('data', function(chunk) { |
|
|
|
if (writeStream.write(chunk) === false) readStream.pause(); |
|
|
|
}); |
|
|
|
|
|
|
|
writeStream.addListener("pause", function () { |
|
|
|
writeStream.addListener('pause', function() { |
|
|
|
readStream.pause(); |
|
|
|
}); |
|
|
|
|
|
|
|
writeStream.addListener("drain", function () { |
|
|
|
writeStream.addListener('drain', function() { |
|
|
|
readStream.resume(); |
|
|
|
}); |
|
|
|
|
|
|
|
writeStream.addListener("resume", function () { |
|
|
|
writeStream.addListener('resume', function() { |
|
|
|
readStream.resume(); |
|
|
|
}); |
|
|
|
|
|
|
|
readStream.addListener("end", function () { |
|
|
|
readStream.addListener('end', function() { |
|
|
|
writeStream.end(); |
|
|
|
}); |
|
|
|
|
|
|
|
readStream.addListener("close", function () { |
|
|
|
readStream.addListener('close', function() { |
|
|
|
call(); |
|
|
|
}); |
|
|
|
|
|
|
|
readStream.addListener("error", function (err) { |
|
|
|
readStream.addListener('error', function(err) { |
|
|
|
writeStream.end(); |
|
|
|
call(err); |
|
|
|
}); |
|
|
|
|
|
|
|
writeStream.addListener("error", function (err) { |
|
|
|
writeStream.addListener('error', function(err) { |
|
|
|
readStream.destroy(); |
|
|
|
call(err); |
|
|
|
}); |
|
|
@ -378,10 +378,10 @@ exports.pump = function (readStream, writeStream, callback) { |
|
|
|
* expected during bootstrapping (see mirror.js in r114903). |
|
|
|
* |
|
|
|
* @param {function} ctor Constructor function which needs to inherit the |
|
|
|
* prototype |
|
|
|
* @param {function} superCtor Constructor function to inherit prototype from |
|
|
|
* prototype. |
|
|
|
* @param {function} superCtor Constructor function to inherit prototype from. |
|
|
|
*/ |
|
|
|
exports.inherits = function (ctor, superCtor) { |
|
|
|
exports.inherits = function(ctor, superCtor) { |
|
|
|
ctor.super_ = superCtor; |
|
|
|
ctor.prototype = Object.create(superCtor.prototype, { |
|
|
|
constructor: { |
|
|
|