Comparing version 2.8.0 to 2.9.0
@@ -17,2 +17,3 @@ "use strict"; | ||
* @param {Array} [opts.argv] Arguments array (Default: `process.argv`) | ||
* @param {Array} [opts.msgs] Array of log messages (`{ level, type, msg }`) | ||
* @param {Function} callback Callback `(err)` | ||
@@ -34,2 +35,13 @@ * @returns {void} | ||
// Set up logger state. | ||
log.setLevel({ | ||
env: env, | ||
argv: opts.argv | ||
}); | ||
// Drain outer `builder` messages manually (may be global or locally-sourced). | ||
(opts.msgs || []).forEach(function (obj) { | ||
log[obj.level](obj.type, obj.msg); | ||
}); | ||
// Infer task to run | ||
@@ -36,0 +48,0 @@ var task = new Task({ |
@@ -5,4 +5,14 @@ #!/usr/bin/env node | ||
var path = require("path"); | ||
var log = require("../lib/log"); | ||
// Buffer up log messages to pass on. | ||
// | ||
// **Scenario**: We can't import `log` here and use it's internal queue because | ||
// this might be the _global_ builder in this script, which if we then switch | ||
// to _local_ builder below, we'll import a different (local) `log` and when | ||
// that gets called, it wouldn't have any internal queue / notion of these log | ||
// events here. So, instead of using the internal log queue, we manually create | ||
// an array of messages in the same format and drain in `builder-core` | ||
// explicitly. | ||
var msgs = []; | ||
// Infer if we are global and there is a local version available. | ||
@@ -16,6 +26,15 @@ var builderPath = require.resolve("./builder-core"); | ||
builderPath = require.resolve(localPath); | ||
log.info("local-detect", "Switched to local builder at: " + localPath); | ||
msgs.push({ | ||
level: "info", type: "local-detect", | ||
msg: "Switched to local builder at: " + localPath | ||
}); | ||
} catch (err) { | ||
log.warn("local-detect", "Error importing local builder: " + err.message); | ||
log.info("local-detect", "Using global builder at: " + builderPath); | ||
msgs.push({ | ||
level: "warn", type: "local-detect", | ||
msg: "Error importing local builder: " + err.message | ||
}); | ||
msgs.push({ | ||
level: "info", type: "local-detect", | ||
msg: "Using global builder at: " + builderPath | ||
}); | ||
} | ||
@@ -26,5 +45,7 @@ } | ||
var builder = require(builderPath); | ||
builder(function (err) { | ||
builder({ | ||
msgs: msgs | ||
}, function (err) { | ||
/*eslint-disable no-process-exit*/ | ||
process.exit(err ? err.code || 1 : 0); | ||
}); |
History | ||
======= | ||
## 2.9.0 | ||
* Add configurable log levels via `--log-level=LEVEL` and `--quiet`. | ||
[#6](https://github.com/FormidableLabs/builder/issues/6) | ||
## 2.8.0 | ||
@@ -5,0 +10,0 @@ |
@@ -64,3 +64,13 @@ "use strict"; | ||
help: FLAG_HELP, | ||
version: FLAG_VERSION | ||
version: FLAG_VERSION, | ||
quiet: { | ||
desc: "Silence logging", | ||
types: [Boolean], | ||
default: false | ||
}, | ||
"log-level": { | ||
desc: "Level to log at (`info`, `warn`, `error`, `none`)", | ||
types: [String], | ||
default: "info" | ||
} | ||
}, | ||
@@ -67,0 +77,0 @@ |
"use strict"; | ||
var chalk = require("chalk"); | ||
var args = require("./args"); | ||
@@ -10,23 +11,96 @@ // Wrap "type". | ||
// Levels | ||
var LEVELS = { | ||
info: 0, | ||
warn: 1, | ||
error: 2, | ||
none: 3 | ||
}; | ||
/** | ||
* A super-small logger. | ||
*/ | ||
module.exports = { | ||
// TODO(6): Configurable log levels. | ||
// https://github.com/FormidableLabs/builder/issues/6 | ||
_logger: function () { | ||
return console; | ||
var log = module.exports = { | ||
/** | ||
* Set log level from command flags or environment. | ||
* | ||
* **NOTE - Side Effects**: Mutates environment. | ||
* | ||
* @param {Object} opts Options object | ||
* @param {Object} opts.argv Arguments array. | ||
* @param {Object} opts.env Environment object to mutate (Default `process.env`) | ||
* @returns {void} | ||
*/ | ||
setLevel: function (opts) { | ||
opts = opts || {}; | ||
var env = opts.env && opts.env.env || process.env; | ||
// Try to determine log level from environment. | ||
var level = env._BUILDER_ARGS_LOG_LEVEL; | ||
// If not, determine log level from command line. | ||
if (!level) { | ||
var parsed = args.general(opts.argv); | ||
level = parsed.quiet === true ? "none" : parsed.logLevel; | ||
} | ||
// Statefully set level. | ||
env._BUILDER_ARGS_LOG_LEVEL = level; | ||
log._level = LEVELS[level]; | ||
if (typeof log._level === "undefined") { | ||
throw new Error("Unknown log level: " + level); | ||
} | ||
// Drain message queue. | ||
log._drainQueue(); | ||
}, | ||
info: function (type, msg) { | ||
this._logger().info([chalk.green(wrapType(type)), msg].join(" ")); | ||
// Nuke everything for test runs. | ||
_unsetLevel: function () { | ||
delete process.env._BUILDER_ARGS_LOG_LEVEL; | ||
delete log._level; | ||
delete log._queue; | ||
}, | ||
warn: function (type, msg) { | ||
this._logger().warn([chalk.yellow(wrapType(type)), msg].join(" ")); | ||
// Drain internal queue and emit log events. | ||
_drainQueue: function () { | ||
(log._queue || []).forEach(function (obj) { | ||
log[obj.level](obj.type, obj.msg); | ||
}); | ||
log._queue = null; | ||
}, | ||
error: function (type, msg) { | ||
this._logger().error([chalk.red(wrapType(type)), msg].join(" ")); | ||
_logger: function () { | ||
return console; | ||
}, | ||
_wrapper: function (level, color, type, msg) { // eslint-disable-line max-params | ||
// Queue if level is unset. | ||
// | ||
// **Scenario**: This queue is used when `log` has been imported from the | ||
// actual builder instance that is running. However, we have calls to log | ||
// events before we can call `log.setLevel`, so need to queue until that | ||
// happens. | ||
if (typeof log._level === "undefined") { | ||
log._queue = log._queue || []; | ||
log._queue.push({ level: level, type: type, msg: msg }); | ||
return; | ||
} | ||
// Should only get to here, _after_ `log.setlevel()` is imported. | ||
// Check if logging at this integer level. | ||
if (LEVELS[level] < log._level) { | ||
return; | ||
} | ||
// Call directly once level is set. | ||
// This is also used to drain the queue. | ||
var formattedMsg = [chalk[color](wrapType(type)), msg].join(" "); | ||
log._logger()[level](formattedMsg); | ||
} | ||
}; | ||
// Actual implementation methods. | ||
log.info = log._wrapper.bind(log, "info", "green"); | ||
log.warn = log._wrapper.bind(log, "warn", "yellow"); | ||
log.error = log._wrapper.bind(log, "error", "red"); |
{ | ||
"name": "builder", | ||
"version": "2.8.0", | ||
"version": "2.9.0", | ||
"description": "An NPM-based task runner", | ||
@@ -5,0 +5,0 @@ "repository": { |
@@ -222,6 +222,8 @@ [![Travis Status][trav_img]][trav_site] | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of `<action>` | ||
* `--quiet`: Silence logging | ||
* `--log-level`: Level to log at (`info`, `warn`, `error`, `none`) | ||
* `--expand-archetype`: Expand `node_modules/<archetype>` with full path (default: `false`) | ||
* `--builderrc`: Path to builder config file (default: `.builderrc`) | ||
* `--expand-archetype`: Expand `node_modules/<archetype>` with full path (default: `false`) | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of `<action>`. | ||
@@ -241,9 +243,11 @@ ##### builder concurrent | ||
* `--builderrc`: Path to builder config file (default: `.builderrc`) | ||
* `--expand-archetype`: Expand `node_modules/<archetype>` with full path (default: `false`) | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of `<action>`. | ||
* `--setup`: Single task to run for the entirety of `<action>` | ||
* `--queue`: Number of concurrent processes to run (default: unlimited - `0|null`) | ||
* `--[no-]buffer`: Buffer output until process end (default: `false`) | ||
* `--[no-]bail`: End all processes after the first failure (default: `true`) | ||
* `--quiet`: Silence logging | ||
* `--log-level`: Level to log at (`info`, `warn`, `error`, `none`) | ||
* `--expand-archetype`: Expand `node_modules/<archetype>` with full path (default: `false`) | ||
* `--builderrc`: Path to builder config file (default: `.builderrc`) | ||
@@ -281,6 +285,4 @@ Note that `tries` will retry _individual_ tasks that are part of the concurrent | ||
* `--builderrc`: Path to builder config file (default: `.builderrc`) | ||
* `--expand-archetype`: Expand `node_modules/<archetype>` with full path (default: `false`) | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of `<action>`. | ||
* `--setup`: Single task to run for the entirety of `<action>` | ||
* `--queue`: Number of concurrent processes to run (default: unlimited - `0|null`) | ||
@@ -290,2 +292,6 @@ * `--[no-]buffer`: Buffer output until process end (default: `false`) | ||
* `--envs-path`: Path to JSON env variable array file (default: `null`) | ||
* `--quiet`: Silence logging | ||
* `--log-level`: Level to log at (`info`, `warn`, `error`, `none`) | ||
* `--expand-archetype`: Expand `node_modules/<archetype>` with full path (default: `false`) | ||
* `--builderrc`: Path to builder config file (default: `.builderrc`) | ||
@@ -292,0 +298,0 @@ _Note_: The environments JSON array will overwrite **existing** values in the |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
89833
1454
1152
10