1diff --git a/lib/util.js b/lib/util.js 2index a03e874..9074e8e 100644 3--- a/lib/util.js 4+++ b/lib/util.js 5@@ -19,430 +19,6 @@ 6 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 7 // USE OR OTHER DEALINGS IN THE SOFTWARE. 8 9-var formatRegExp = /%[sdj%]/g; 10-exports.format = function(f) { 11- if (!isString(f)) { 12- var objects = []; 13- for (var i = 0; i < arguments.length; i++) { 14- objects.push(inspect(arguments[i])); 15- } 16- return objects.join(' '); 17- } 18- 19- var i = 1; 20- var args = arguments; 21- var len = args.length; 22- var str = String(f).replace(formatRegExp, function(x) { 23- if (x === '%%') return '%'; 24- if (i >= len) return x; 25- switch (x) { 26- case '%s': return String(args[i++]); 27- case '%d': return Number(args[i++]); 28- case '%j': 29- try { 30- return JSON.stringify(args[i++]); 31- } catch (_) { 32- return '[Circular]'; 33- } 34- default: 35- return x; 36- } 37- }); 38- for (var x = args[i]; i < len; x = args[++i]) { 39- if (isNull(x) || !isObject(x)) { 40- str += ' ' + x; 41- } else { 42- str += ' ' + inspect(x); 43- } 44- } 45- return str; 46-}; 47- 48- 49-// Mark that a method should not be used. 50-// Returns a modified function which warns once by default. 51-// If --no-deprecation is set, then it is a no-op. 52-exports.deprecate = function(fn, msg) { 53- // Allow for deprecating things in the process of starting up. 54- if (isUndefined(global.process)) { 55- return function() { 56- return exports.deprecate(fn, msg).apply(this, arguments); 57- }; 58- } 59- 60- if (process.noDeprecation === true) { 61- return fn; 62- } 63- 64- var warned = false; 65- function deprecated() { 66- if (!warned) { 67- if (process.throwDeprecation) { 68- throw new Error(msg); 69- } else if (process.traceDeprecation) { 70- console.trace(msg); 71- } else { 72- console.error(msg); 73- } 74- warned = true; 75- } 76- return fn.apply(this, arguments); 77- } 78- 79- return deprecated; 80-}; 81- 82- 83-var debugs = {}; 84-var debugEnviron; 85-exports.debuglog = function(set) { 86- if (isUndefined(debugEnviron)) 87- debugEnviron = process.env.NODE_DEBUG || ''; 88- set = set.toUpperCase(); 89- if (!debugs[set]) { 90- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { 91- var pid = process.pid; 92- debugs[set] = function() { 93- var msg = exports.format.apply(exports, arguments); 94- console.error('%s %d: %s', set, pid, msg); 95- }; 96- } else { 97- debugs[set] = function() {}; 98- } 99- } 100- return debugs[set]; 101-}; 102- 103- 104-/** 105- * Echos the value of a value. Trys to print the value out 106- * in the best way possible given the different types. 107- * 108- * @param {Object} obj The object to print out. 109- * @param {Object} opts Optional options object that alters the output. 110- */ 111-/* legacy: obj, showHidden, depth, colors*/ 112-function inspect(obj, opts) { 113- // default options 114- var ctx = { 115- seen: [], 116- stylize: stylizeNoColor 117- }; 118- // legacy... 119- if (arguments.length >= 3) ctx.depth = arguments[2]; 120- if (arguments.length >= 4) ctx.colors = arguments[3]; 121- if (isBoolean(opts)) { 122- // legacy... 123- ctx.showHidden = opts; 124- } else if (opts) { 125- // got an "options" object 126- exports._extend(ctx, opts); 127- } 128- // set default options 129- if (isUndefined(ctx.showHidden)) ctx.showHidden = false; 130- if (isUndefined(ctx.depth)) ctx.depth = 2; 131- if (isUndefined(ctx.colors)) ctx.colors = false; 132- if (isUndefined(ctx.customInspect)) ctx.customInspect = true; 133- if (ctx.colors) ctx.stylize = stylizeWithColor; 134- return formatValue(ctx, obj, ctx.depth); 135-} 136-exports.inspect = inspect; 137- 138- 139-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics 140-inspect.colors = { 141- 'bold' : [1, 22], 142- 'italic' : [3, 23], 143- 'underline' : [4, 24], 144- 'inverse' : [7, 27], 145- 'white' : [37, 39], 146- 'grey' : [90, 39], 147- 'black' : [30, 39], 148- 'blue' : [34, 39], 149- 'cyan' : [36, 39], 150- 'green' : [32, 39], 151- 'magenta' : [35, 39], 152- 'red' : [31, 39], 153- 'yellow' : [33, 39] 154-}; 155- 156-// Don't use 'blue' not visible on cmd.exe 157-inspect.styles = { 158- 'special': 'cyan', 159- 'number': 'yellow', 160- 'boolean': 'yellow', 161- 'undefined': 'grey', 162- 'null': 'bold', 163- 'string': 'green', 164- 'date': 'magenta', 165- // "name": intentionally not styling 166- 'regexp': 'red' 167-}; 168- 169- 170-function stylizeWithColor(str, styleType) { 171- var style = inspect.styles[styleType]; 172- 173- if (style) { 174- return '\u001b[' + inspect.colors[style][0] + 'm' + str + 175- '\u001b[' + inspect.colors[style][1] + 'm'; 176- } else { 177- return str; 178- } 179-} 180- 181- 182-function stylizeNoColor(str, styleType) { 183- return str; 184-} 185- 186- 187-function arrayToHash(array) { 188- var hash = {}; 189- 190- array.forEach(function(val, idx) { 191- hash[val] = true; 192- }); 193- 194- return hash; 195-} 196- 197- 198-function formatValue(ctx, value, recurseTimes) { 199- // Provide a hook for user-specified inspect functions. 200- // Check that value is an object with an inspect function on it 201- if (ctx.customInspect && 202- value && 203- isFunction(value.inspect) && 204- // Filter out the util module, it's inspect function is special 205- value.inspect !== exports.inspect && 206- // Also filter out any prototype objects using the circular check. 207- !(value.constructor && value.constructor.prototype === value)) { 208- var ret = value.inspect(recurseTimes, ctx); 209- if (!isString(ret)) { 210- ret = formatValue(ctx, ret, recurseTimes); 211- } 212- return ret; 213- } 214- 215- // Primitive types cannot have properties 216- var primitive = formatPrimitive(ctx, value); 217- if (primitive) { 218- return primitive; 219- } 220- 221- // Look up the keys of the object. 222- var keys = Object.keys(value); 223- var visibleKeys = arrayToHash(keys); 224- 225- if (ctx.showHidden) { 226- keys = Object.getOwnPropertyNames(value); 227- } 228- 229- // Some type of object without properties can be shortcutted. 230- if (keys.length === 0) { 231- if (isFunction(value)) { 232- var name = value.name ? ': ' + value.name : ''; 233- return ctx.stylize('[Function' + name + ']', 'special'); 234- } 235- if (isRegExp(value)) { 236- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); 237- } 238- if (isDate(value)) { 239- return ctx.stylize(Date.prototype.toString.call(value), 'date'); 240- } 241- if (isError(value)) { 242- return formatError(value); 243- } 244- } 245- 246- var base = '', array = false, braces = ['{', '}']; 247- 248- // Make Array say that they are Array 249- if (isArray(value)) { 250- array = true; 251- braces = ['[', ']']; 252- } 253- 254- // Make functions say that they are functions 255- if (isFunction(value)) { 256- var n = value.name ? ': ' + value.name : ''; 257- base = ' [Function' + n + ']'; 258- } 259- 260- // Make RegExps say that they are RegExps 261- if (isRegExp(value)) { 262- base = ' ' + RegExp.prototype.toString.call(value); 263- } 264- 265- // Make dates with properties first say the date 266- if (isDate(value)) { 267- base = ' ' + Date.prototype.toUTCString.call(value); 268- } 269- 270- // Make error with message first say the error 271- if (isError(value)) { 272- base = ' ' + formatError(value); 273- } 274- 275- if (keys.length === 0 && (!array || value.length == 0)) { 276- return braces[0] + base + braces[1]; 277- } 278- 279- if (recurseTimes < 0) { 280- if (isRegExp(value)) { 281- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); 282- } else { 283- return ctx.stylize('[Object]', 'special'); 284- } 285- } 286- 287- ctx.seen.push(value); 288- 289- var output; 290- if (array) { 291- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); 292- } else { 293- output = keys.map(function(key) { 294- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); 295- }); 296- } 297- 298- ctx.seen.pop(); 299- 300- return reduceToSingleString(output, base, braces); 301-} 302- 303- 304-function formatPrimitive(ctx, value) { 305- if (isUndefined(value)) 306- return ctx.stylize('undefined', 'undefined'); 307- if (isString(value)) { 308- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') 309- .replace(/'/g, "\\'") 310- .replace(/\\"/g, '"') + '\''; 311- return ctx.stylize(simple, 'string'); 312- } 313- if (isNumber(value)) { 314- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, 315- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . 316- if (value === 0 && 1 / value < 0) 317- return ctx.stylize('-0', 'number'); 318- return ctx.stylize('' + value, 'number'); 319- } 320- if (isBoolean(value)) 321- return ctx.stylize('' + value, 'boolean'); 322- // For some reason typeof null is "object", so special case here. 323- if (isNull(value)) 324- return ctx.stylize('null', 'null'); 325-} 326- 327- 328-function formatError(value) { 329- return '[' + Error.prototype.toString.call(value) + ']'; 330-} 331- 332- 333-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { 334- var output = []; 335- for (var i = 0, l = value.length; i < l; ++i) { 336- if (hasOwnProperty(value, String(i))) { 337- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, 338- String(i), true)); 339- } else { 340- output.push(''); 341- } 342- } 343- keys.forEach(function(key) { 344- if (!key.match(/^\d+$/)) { 345- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, 346- key, true)); 347- } 348- }); 349- return output; 350-} 351- 352- 353-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { 354- var name, str, desc; 355- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; 356- if (desc.get) { 357- if (desc.set) { 358- str = ctx.stylize('[Getter/Setter]', 'special'); 359- } else { 360- str = ctx.stylize('[Getter]', 'special'); 361- } 362- } else { 363- if (desc.set) { 364- str = ctx.stylize('[Setter]', 'special'); 365- } 366- } 367- if (!hasOwnProperty(visibleKeys, key)) { 368- name = '[' + key + ']'; 369- } 370- if (!str) { 371- if (ctx.seen.indexOf(desc.value) < 0) { 372- if (isNull(recurseTimes)) { 373- str = formatValue(ctx, desc.value, null); 374- } else { 375- str = formatValue(ctx, desc.value, recurseTimes - 1); 376- } 377- if (str.indexOf('\n') > -1) { 378- if (array) { 379- str = str.split('\n').map(function(line) { 380- return ' ' + line; 381- }).join('\n').substr(2); 382- } else { 383- str = '\n' + str.split('\n').map(function(line) { 384- return ' ' + line; 385- }).join('\n'); 386- } 387- } 388- } else { 389- str = ctx.stylize('[Circular]', 'special'); 390- } 391- } 392- if (isUndefined(name)) { 393- if (array && key.match(/^\d+$/)) { 394- return str; 395- } 396- name = JSON.stringify('' + key); 397- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { 398- name = name.substr(1, name.length - 2); 399- name = ctx.stylize(name, 'name'); 400- } else { 401- name = name.replace(/'/g, "\\'") 402- .replace(/\\"/g, '"') 403- .replace(/(^"|"$)/g, "'"); 404- name = ctx.stylize(name, 'string'); 405- } 406- } 407- 408- return name + ': ' + str; 409-} 410- 411- 412-function reduceToSingleString(output, base, braces) { 413- var numLinesEst = 0; 414- var length = output.reduce(function(prev, cur) { 415- numLinesEst++; 416- if (cur.indexOf('\n') >= 0) numLinesEst++; 417- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; 418- }, 0); 419- 420- if (length > 60) { 421- return braces[0] + 422- (base === '' ? '' : base + '\n ') + 423- ' ' + 424- output.join(',\n ') + 425- ' ' + 426- braces[1]; 427- } 428- 429- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; 430-} 431- 432- 433 // NOTE: These type checking functions intentionally don't use `instanceof` 434 // because it is fragile and can be easily faked with `Object.create()`. 435 function isArray(ar) { 436@@ -522,166 +98,10 @@ function isPrimitive(arg) { 437 exports.isPrimitive = isPrimitive; 438 439 function isBuffer(arg) { 440- return arg instanceof Buffer; 441+ return Buffer.isBuffer(arg); 442 } 443 exports.isBuffer = isBuffer; 444 445 function objectToString(o) { 446 return Object.prototype.toString.call(o); 447-} 448- 449- 450-function pad(n) { 451- return n < 10 ? '0' + n.toString(10) : n.toString(10); 452-} 453- 454- 455-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 456- 'Oct', 'Nov', 'Dec']; 457- 458-// 26 Feb 16:19:34 459-function timestamp() { 460- var d = new Date(); 461- var time = [pad(d.getHours()), 462- pad(d.getMinutes()), 463- pad(d.getSeconds())].join(':'); 464- return [d.getDate(), months[d.getMonth()], time].join(' '); 465-} 466- 467- 468-// log is just a thin wrapper to console.log that prepends a timestamp 469-exports.log = function() { 470- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); 471-}; 472- 473- 474-/** 475- * Inherit the prototype methods from one constructor into another. 476- * 477- * The Function.prototype.inherits from lang.js rewritten as a standalone 478- * function (not on Function.prototype). NOTE: If this file is to be loaded 479- * during bootstrapping this function needs to be rewritten using some native 480- * functions as prototype setup using normal JavaScript does not work as 481- * expected during bootstrapping (see mirror.js in r114903). 482- * 483- * @param {function} ctor Constructor function which needs to inherit the 484- * prototype. 485- * @param {function} superCtor Constructor function to inherit prototype from. 486- */ 487-exports.inherits = function(ctor, superCtor) { 488- ctor.super_ = superCtor; 489- ctor.prototype = Object.create(superCtor.prototype, { 490- constructor: { 491- value: ctor, 492- enumerable: false, 493- writable: true, 494- configurable: true 495- } 496- }); 497-}; 498- 499-exports._extend = function(origin, add) { 500- // Don't do anything if add isn't an object 501- if (!add || !isObject(add)) return origin; 502- 503- var keys = Object.keys(add); 504- var i = keys.length; 505- while (i--) { 506- origin[keys[i]] = add[keys[i]]; 507- } 508- return origin; 509-}; 510- 511-function hasOwnProperty(obj, prop) { 512- return Object.prototype.hasOwnProperty.call(obj, prop); 513-} 514- 515- 516-// Deprecated old stuff. 517- 518-exports.p = exports.deprecate(function() { 519- for (var i = 0, len = arguments.length; i < len; ++i) { 520- console.error(exports.inspect(arguments[i])); 521- } 522-}, 'util.p: Use console.error() instead'); 523- 524- 525-exports.exec = exports.deprecate(function() { 526- return require('child_process').exec.apply(this, arguments); 527-}, 'util.exec is now called `child_process.exec`.'); 528- 529- 530-exports.print = exports.deprecate(function() { 531- for (var i = 0, len = arguments.length; i < len; ++i) { 532- process.stdout.write(String(arguments[i])); 533- } 534-}, 'util.print: Use console.log instead'); 535- 536- 537-exports.puts = exports.deprecate(function() { 538- for (var i = 0, len = arguments.length; i < len; ++i) { 539- process.stdout.write(arguments[i] + '\n'); 540- } 541-}, 'util.puts: Use console.log instead'); 542- 543- 544-exports.debug = exports.deprecate(function(x) { 545- process.stderr.write('DEBUG: ' + x + '\n'); 546-}, 'util.debug: Use console.error instead'); 547- 548- 549-exports.error = exports.deprecate(function(x) { 550- for (var i = 0, len = arguments.length; i < len; ++i) { 551- process.stderr.write(arguments[i] + '\n'); 552- } 553-}, 'util.error: Use console.error instead'); 554- 555- 556-exports.pump = exports.deprecate(function(readStream, writeStream, callback) { 557- var callbackCalled = false; 558- 559- function call(a, b, c) { 560- if (callback && !callbackCalled) { 561- callback(a, b, c); 562- callbackCalled = true; 563- } 564- } 565- 566- readStream.addListener('data', function(chunk) { 567- if (writeStream.write(chunk) === false) readStream.pause(); 568- }); 569- 570- writeStream.addListener('drain', function() { 571- readStream.resume(); 572- }); 573- 574- readStream.addListener('end', function() { 575- writeStream.end(); 576- }); 577- 578- readStream.addListener('close', function() { 579- call(); 580- }); 581- 582- readStream.addListener('error', function(err) { 583- writeStream.end(); 584- call(err); 585- }); 586- 587- writeStream.addListener('error', function(err) { 588- readStream.destroy(); 589- call(err); 590- }); 591-}, 'util.pump(): Use readableStream.pipe() instead'); 592- 593- 594-var uv; 595-exports._errnoException = function(err, syscall) { 596- if (isUndefined(uv)) uv = process.binding('uv'); 597- var errname = uv.errname(err); 598- var e = new Error(syscall + ' ' + errname); 599- e.code = errname; 600- e.errno = errname; 601- e.syscall = syscall; 602- return e; 603-}; 604+}