diff --git a/lib/console.js b/lib/console.js index 54a4d811fe5..873d27c4e89 100644 --- a/lib/console.js +++ b/lib/console.js @@ -20,45 +20,10 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. var writeError = process.binding('stdio').writeError; - -// console object -var formatRegExp = /%[sdj]/g; -function format(f) { - var util = require('util'); - - if (typeof f !== 'string') { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(util.inspect(arguments[i])); - } - return objects.join(' '); - } - - - var i = 1; - var args = arguments; - var str = String(f).replace(formatRegExp, function(x) { - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': return JSON.stringify(args[i++]); - default: - return x; - } - }); - for (var len = args.length, x = args[i]; i < len; x = args[++i]) { - if (x === null || typeof x !== 'object') { - str += ' ' + x; - } else { - str += ' ' + util.inspect(x); - } - } - return str; -} - +var util = require('util'); exports.log = function() { - process.stdout.write(format.apply(this, arguments) + '\n'); + process.stdout.write(util.format.apply(this, arguments) + '\n'); }; @@ -66,7 +31,7 @@ exports.info = exports.log; exports.warn = function() { - writeError(format.apply(this, arguments) + '\n'); + writeError(util.format.apply(this, arguments) + '\n'); }; @@ -74,7 +39,6 @@ exports.error = exports.warn; exports.dir = function(object) { - var util = require('util'); process.stdout.write(util.inspect(object) + '\n'); }; @@ -105,6 +69,6 @@ exports.trace = function(label) { exports.assert = function(expression) { if (!expression) { var arr = Array.prototype.slice.call(arguments, 1); - require('assert').ok(false, format.apply(this, arr)); + require('assert').ok(false, util.format.apply(this, arr)); } }; diff --git a/lib/util.js b/lib/util.js index ae6cc2da6aa..0630d94b895 100644 --- a/lib/util.js +++ b/lib/util.js @@ -22,6 +22,38 @@ var events = require('events'); +var formatRegExp = /%[sdj]/g; +exports.format = function(f) { + if (typeof f !== 'string') { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var str = String(f).replace(formatRegExp, function(x) { + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': return JSON.stringify(args[i++]); + default: + return x; + } + }); + for (var len = args.length, x = args[i]; i < len; x = args[++i]) { + if (x === null || typeof x !== 'object') { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +} + + exports.print = function() { for (var i = 0, len = arguments.length; i < len; ++i) { process.stdout.write(String(arguments[i])); @@ -59,7 +91,7 @@ var error = exports.error = function(x) { * @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) { +function inspect(obj, showHidden, depth, colors) { var seen = []; var stylize = function(str, styleType) { @@ -279,7 +311,8 @@ exports.inspect = function(obj, showHidden, depth, colors) { return output; } return format(obj, (typeof depth === 'undefined' ? 2 : depth)); -}; +} +exports.inspect = inspect; function isArray(ar) { diff --git a/test/simple/test-util-format.js b/test/simple/test-util-format.js new file mode 100644 index 00000000000..2f6998cf712 --- /dev/null +++ b/test/simple/test-util-format.js @@ -0,0 +1,46 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var common = require('../common'); +var assert = require('assert'); +var util = require('util'); + +assert.equal('', util.format()); +assert.equal('', util.format('')); +assert.equal('[]', util.format([])); +assert.equal('{}', util.format({})); +assert.equal('null', util.format(null)); +assert.equal('true', util.format(true)); +assert.equal('false', util.format(false)); +assert.equal('test', util.format('test')); + +// CHECKME this is for console.log() compatibility - but is it *right*? +assert.equal('foo bar baz', util.format('foo', 'bar', 'baz')); + +assert.equal('42', util.format('%d', 42.0)); +assert.equal('42', util.format('%d', 42)); +assert.equal('42', util.format('%s', 42)); +assert.equal('42', util.format('%j', 42)); + +assert.equal('42', util.format('%d', '42.0')); +assert.equal('42', util.format('%d', '42')); +assert.equal('42', util.format('%s', '42')); +assert.equal('"42"', util.format('%j', '42')); \ No newline at end of file