Skip to content

Commit

Permalink
console: allow options object as constructor arg
Browse files Browse the repository at this point in the history
PR-URL: #19372
Reviewed-By: Luigi Pinca <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
addaleax authored and jasnell committed Apr 16, 2018
1 parent 63565e1 commit 4fe5175
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 12 deletions.
17 changes: 11 additions & 6 deletions doc/api/console.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,17 +79,22 @@ const { Console } = console;
```

### new Console(stdout[, stderr][, ignoreErrors])
### new Console(options)
<!-- YAML
changes:
- version: v8.0.0
pr-url: https://github.com/nodejs/node/pull/9744
description: The `ignoreErrors` option was introduced.
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/19372
description: The `Console` constructor now supports an `options` argument.
-->

* `stdout` {stream.Writable}
* `stderr` {stream.Writable}
* `ignoreErrors` {boolean} Ignore errors when writing to the underlying streams.
Defaults to `true`.
* `options` {Object}
* `stdout` {stream.Writable}
* `stderr` {stream.Writable}
* `ignoreErrors` {boolean} Ignore errors when writing to the underlying
streams. **Default:** `true`.

Creates a new `Console` with one or two writable stream instances. `stdout` is a
writable stream to print log or info output. `stderr` is used for warning or
Expand All @@ -99,7 +104,7 @@ error output. If `stderr` is not provided, `stdout` is used for `stderr`.
const output = fs.createWriteStream('./stdout.log');
const errorOutput = fs.createWriteStream('./stderr.log');
// custom simple logger
const logger = new Console(output, errorOutput);
const logger = new Console({ stdout: output, stderr: errorOutput });
// use it like console
const count = 5;
logger.log('count: %d', count);
Expand All @@ -110,7 +115,7 @@ The global `console` is a special `Console` whose output is sent to
[`process.stdout`][] and [`process.stderr`][]. It is equivalent to calling:

```js
new Console(process.stdout, process.stderr);
new Console({ stdout: process.stdout, stderr: process.stderr });
```

### console.assert(value[, ...message])
Expand Down
27 changes: 21 additions & 6 deletions lib/console.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,28 @@ const {
// Track amount of indentation required via `console.group()`.
const kGroupIndent = Symbol('groupIndent');

function Console(stdout, stderr, ignoreErrors = true) {
function Console(options /* or: stdout, stderr, ignoreErrors = true */) {
if (!(this instanceof Console)) {
return new Console(stdout, stderr, ignoreErrors);
return new Console(...arguments);
}

let stdout, stderr, ignoreErrors;
if (options && typeof options.write !== 'function') {
({
stdout,
stderr = stdout,
ignoreErrors = true
} = options);
} else {
stdout = options;
stderr = arguments[1];
ignoreErrors = arguments[2] === undefined ? true : arguments[2];
}

if (!stdout || typeof stdout.write !== 'function') {
throw new ERR_CONSOLE_WRITABLE_STREAM('stdout');
}
if (!stderr) {
stderr = stdout;
} else if (typeof stderr.write !== 'function') {
if (!stderr || typeof stderr.write !== 'function') {
throw new ERR_CONSOLE_WRITABLE_STREAM('stderr');
}

Expand Down Expand Up @@ -369,7 +381,10 @@ Console.prototype.table = function(tabularData, properties) {
return final(keys, values);
};

module.exports = new Console(process.stdout, process.stderr);
module.exports = new Console({
stdout: process.stdout,
stderr: process.stderr
});
module.exports.Console = Console;

function noop() {}

0 comments on commit 4fe5175

Please sign in to comment.