diff --git a/README.md b/README.md index eda8780..d88c7c4 100644 --- a/README.md +++ b/README.md @@ -147,8 +147,9 @@ Read this Serverless Blog post for more details: https://serverless.com/blog/ser When using `serverless deploy` to deploy the stack, you can use several environment variables to alter configuration. Note that many of these are currently overridden by a `serverless.local.yml` file, if present. -- `LOG_INFO` - set to "1" for informational log output, "0" to disable (default: "1") -- `LOG_DEBUG` - set to "1" for verbose debug log output, "0" to disable (default: "0") +- `LOG_LEVEL` - (default: "info") one of the following severity levels for log verbosity in increasing order: critical, error, warn, info, debug, verbose, trace +- `LOG_DEBUG` - (default: "0") set to "1" to debug logging itself +- `LOG_FORMAT` - (default: "heka") set to "pretty" for human-readable, "heka" for JSON format readable by Heka - `STAGE` - Stage for building and deploying - one of `dev`, `stage`, or `production` - `NODE_ENV` - Use `production` for a more optimized production build, `development` for a development build with more verbose logging and other conveniences - `PREFIX` - a prefix string used in constructing the names of resources and functions, by default a combination of service and stage names diff --git a/functions/accept.js b/functions/accept.js index 0739db3..0dc610e 100644 --- a/functions/accept.js +++ b/functions/accept.js @@ -9,11 +9,19 @@ const documentClient = new AWS.DynamoDB.DocumentClient(); const { DEV_CREDENTIALS, DEFAULT_HAWK_ALGORITHM } = require("../lib/constants"); const Sentry = require("../lib/sentry"); const Metrics = require("../lib/metrics"); -const { logDebug, logInfo, jsonPretty, md5 } = require("../lib/utils.js"); +const { md5 } = require("../lib/utils.js"); const REQUIRED_FIELDS = ["image", "negative_uri", "positive_uri"]; module.exports.post = async function(event, context) { + const log = require("../lib/logging")({ + name: "accept", + isRequest: true, + event, + context, + }); + log.info("summary"); + const { UPSTREAM_SERVICE_URL, QUEUE_NAME: QueueName, @@ -21,15 +29,11 @@ module.exports.post = async function(event, context) { } = process.env; const Raven = Sentry(); - - logDebug( - "env", - jsonPretty({ - UPSTREAM_SERVICE_URL, - QueueName, - Bucket, - }) - ); + log.verbose("env", { + UPSTREAM_SERVICE_URL, + QueueName, + Bucket, + }); const { headers, @@ -37,8 +41,7 @@ module.exports.post = async function(event, context) { requestContext: { path, requestId }, } = event; - logInfo("Accepting job", requestId); - logDebug("event", jsonPretty({ headers, params, path, requestId })); + log.verbose("event", { headers, params, path, requestId }); const { Host: host, @@ -46,8 +49,6 @@ module.exports.post = async function(event, context) { "X-Forwarded-Port": port = 80, } = headers; - logDebug("headers", jsonPretty({ host, authorization, port })); - let authArtifacts; try { ({ artifacts: authArtifacts } = await Hawk.server.authenticate( @@ -61,9 +62,10 @@ module.exports.post = async function(event, context) { }, lookupCredentials )); - logDebug("auth", jsonPretty({ authArtifacts })); + log.commonFields.uid = authArtifacts.id; } catch (err) { Raven.captureException(err); + log.error("authInvalid", { authorization }); return response( 401, { error: err.message }, @@ -76,27 +78,25 @@ module.exports.post = async function(event, context) { body = await parseRequestBody(event); REQUIRED_FIELDS.forEach(name => { if (!body[name]) { + log.warn("requestInvalid", { field: name }); throw { message: `Required "${name}" is missing` }; } }); // TODO: More input validation here? ({ negative_uri, positive_uri, positive_email, notes, image } = body); - logDebug( - "body", - jsonPretty({ - negative_uri, - positive_uri, - positive_email, - notes, - image: { - filename: image.filename, - contentEncoding: image.contentEncoding, - contentType: image.contentType, - dataMD5: md5(image.data || ""), - }, - }) - ); + log.debug("body", { + negative_uri, + positive_uri, + positive_email, + notes, + image: { + filename: image.filename, + contentEncoding: image.contentEncoding, + contentType: image.contentType, + dataMD5: md5(image.data || ""), + }, + }); } catch (err) { Raven.captureException(err); return response(400, { error: err.message }); @@ -104,8 +104,6 @@ module.exports.post = async function(event, context) { const imageKey = `image-${requestId}`; - logDebug("imageKey", imageKey); - const upstreamServiceUrl = UPSTREAM_SERVICE_URL !== "__MOCK__" ? UPSTREAM_SERVICE_URL @@ -115,8 +113,6 @@ module.exports.post = async function(event, context) { event.requestContext.stage + "/mock/upstream"; - logDebug("upstreamServiceUrl", upstreamServiceUrl); - const messageData = { datestamp: new Date().toISOString(), upstreamServiceUrl, @@ -128,9 +124,9 @@ module.exports.post = async function(event, context) { notes, image: imageKey, }; - const MessageBody = JSON.stringify(messageData); + log.verbose("enqueue", messageData); - logDebug("MessageBody", MessageBody); + const MessageBody = JSON.stringify(messageData); const imagePutResult = await S3.putObject({ Bucket, @@ -139,7 +135,7 @@ module.exports.post = async function(event, context) { Body: image.data, }).promise(); - logDebug("imagePutResult", jsonPretty(imagePutResult)); + log.verbose("imagePutResult", { imagePutResult }); const requestPutResult = await S3.putObject({ Bucket, @@ -148,7 +144,7 @@ module.exports.post = async function(event, context) { Body: MessageBody, }).promise(); - logDebug("requestPutResult", jsonPretty(requestPutResult)); + log.verbose("requestPutResult", { requestPutResult }); const { QueueUrl } = await SQS.getQueueUrl({ QueueName }).promise(); const queueSendResult = await SQS.sendMessage({ @@ -156,13 +152,7 @@ module.exports.post = async function(event, context) { MessageBody, }).promise(); - logDebug( - "queueSendResult", - jsonPretty({ - QueueUrl, - queueSendResult, - }) - ); + log.verbose("queueSendResult", { QueueUrl, queueSendResult }); const metricsResult = await Metrics.newItem({ consumer_name: authArtifacts.id, @@ -170,7 +160,7 @@ module.exports.post = async function(event, context) { type: image.contentType, }); - logDebug("metricsResult", jsonPretty(metricsResult)); + log.verbose("metricsResult", { metricsResult }); const responseData = { id: requestId, @@ -178,9 +168,7 @@ module.exports.post = async function(event, context) { positive_uri, positive_email, }; - - logDebug("responseData", jsonPretty(responseData)); - + log.info("response", responseData); return response(201, responseData); }; diff --git a/functions/heartbeat-test.js b/functions/heartbeat-test.js index a3139bb..d2303e0 100644 --- a/functions/heartbeat-test.js +++ b/functions/heartbeat-test.js @@ -8,6 +8,7 @@ describe("functions/heartbeat.handler", () => { const result = await heartbeat.handler({ path: "/dev/__heartbeat__", httpMethod: "GET", + headers: {}, }); expect(result.statusCode).to.equal(200); expect(JSON.parse(result.body)).to.deep.equal({ status: "OK" }); diff --git a/functions/heartbeat.js b/functions/heartbeat.js index c8c0ece..26991a9 100644 --- a/functions/heartbeat.js +++ b/functions/heartbeat.js @@ -1,6 +1,13 @@ "use strict"; -module.exports.handler = async function(event, context) { +module.exports.handler = async function(event = {}, context = {}) { + const log = require("../lib/logging")({ + name: "heartbeat", + isRequest: true, + event, + context, + }); + log.info("summary"); return { statusCode: 200, headers: { "Content-Type": "application/json" }, diff --git a/functions/periodicMetrics.js b/functions/periodicMetrics.js index 6cf4549..66699de 100644 --- a/functions/periodicMetrics.js +++ b/functions/periodicMetrics.js @@ -4,9 +4,16 @@ const AWS = require("aws-sdk"); const SQS = new AWS.SQS({ apiVersion: "2012-11-05" }); const Sentry = require("../lib/sentry"); const Metrics = require("../lib/metrics"); -const { logDebug, logInfo, jsonPretty, wait } = require("../lib/utils.js"); +const { wait } = require("../lib/utils.js"); + +module.exports.handler = async function(event = {}, context = {}) { + const log = require("../lib/logging")({ + name: "periodicMetrics", + event, + context, + }); + log.info("summary"); -module.exports.handler = async function(event, context) { const Raven = Sentry(); const { DEFAULT_METRICS_PING_PERIOD } = require("../lib/constants"); @@ -17,28 +24,26 @@ module.exports.handler = async function(event, context) { parseInt(METRICS_PING_PERIOD, 10) || DEFAULT_METRICS_PING_PERIOD; let pingCount = 0; - logInfo("Periodic metrics monitor start"); + log.debug("start"); while (context.getRemainingTimeInMillis() > pingPeriod + 1000) { try { - await sendHeartbeatMetrics(process.env, context); + await sendHeartbeatMetrics(log, process.env, context); pingCount++; } catch (err) { Raven.captureException(err); - logInfo("Failed to send periodic metrics", err); + log.error("error", { err }); } - logDebug( - "Pausing for", + log.verbose("pause", { pingPeriod, - "ms", - context.getRemainingTimeInMillis(), - "ms remaining" - ); + remaining: context.getRemainingTimeInMillis(), + }); await wait(pingPeriod); } - logInfo(`Periodic metrics monitor exit, pingCount=${pingCount}`); + log.verbose("exit", { pingCount }); }; const sendHeartbeatMetrics = async ( + log, { QUEUE_NAME }, { awsRequestId: poller_id } ) => { @@ -55,7 +60,9 @@ const sendHeartbeatMetrics = async ( ], }).promise(); const apiEndTime = Date.now(); - logDebug("SQS.getQueueAttributes duration", apiEndTime - apiStartTime, "ms"); + log.debug("getQueueAttributesDuration", { + duration: apiEndTime - apiStartTime, + }); const { ApproximateNumberOfMessages, @@ -69,6 +76,6 @@ const sendHeartbeatMetrics = async ( items_in_progress: parseInt(ApproximateNumberOfMessagesNotVisible, 10), items_in_waiting: parseInt(ApproximateNumberOfMessagesDelayed, 10), }; - logDebug("pingData", jsonPretty(pingData)); + log.debug("pingData", { pingData }); return Metrics.pollerHeartbeat(pingData); }; diff --git a/functions/processQueueItem.js b/functions/processQueueItem.js index ed83a0b..1e607d3 100644 --- a/functions/processQueueItem.js +++ b/functions/processQueueItem.js @@ -8,22 +8,24 @@ const request = require("request-promise-native"); const { RATE_LIMIT, RATE_PERIOD, RATE_WAIT } = require("../lib/constants"); const Sentry = require("../lib/sentry"); const Metrics = require("../lib/metrics"); -const { - logDebug, - logInfo, - jsonPretty, - wait, - epochNow, -} = require("../lib/utils.js"); +const { wait, epochNow } = require("../lib/utils.js"); + +exports.handler = async function(event = {}, context = {}) { + const { Records } = event; + const log = require("../lib/logging")({ + name: "processQueueItem", + event, + context, + }); + log.info("summary", { recordCount: Records.length }); -exports.handler = async function({ Records }, context) { - logInfo("Received", Records.length, "messages to process"); const results = []; for (let idx = 0; idx < Records.length; idx++) { const result = await exports.handleOne(Records[idx], context); results.push(result); } - logInfo("Finished processing batch of", results.length, "messages"); + + log.debug("done", { resultCount: results.length }); return results; }; @@ -68,7 +70,17 @@ Response JSON: ${responseUrl} `; -exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { +exports.handleOne = async function(event, context) { + const log = require("../lib/logging")({ + name: "processQueueItem.worker", + event, + context, + }); + log.info("summary"); + + const { body } = event; + const { awsRequestId } = context; + const { HITRATE_TABLE, CONTENT_BUCKET: Bucket, @@ -80,19 +92,16 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { const Raven = Sentry(); - logDebug( - "env", - jsonPretty({ - HITRATE_TABLE, - Bucket, - EMAIL_FROM, - EMAIL_TO, - EMAIL_EXPIRES, - }) - ); + log.verbose("env", { + HITRATE_TABLE, + Bucket, + EMAIL_FROM, + EMAIL_TO, + EMAIL_EXPIRES, + }); const parsedBody = JSON.parse(body); - logDebug("parsedBody", jsonPretty(parsedBody)); + log.verbose("parsedBody", { parsedBody }); const { datestamp, @@ -121,7 +130,7 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { timing_submitted: null, }; - logInfo("Processing queue item", id); + log.info("processing", { id }); try { // Pause if we're at the rate limit for current expiration window @@ -135,10 +144,10 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { }) .promise(); - logDebug("hitRateData", jsonPretty(data)); + log.verbose("hitRateData", { data }); if (data.Count >= RATE_LIMIT) { - logInfo("Pausing for rate limit", epochNow()); + log.info("pausing"); rateLimited = true; await wait(RATE_WAIT); } else { @@ -158,7 +167,7 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { }) .promise(); - logDebug("hitRatePutResult", jsonPretty(hitRatePutResult)); + log.verbose("hitRatePutResult", { hitRatePutResult }); const imageUrl = S3.getSignedUrl("getObject", { Bucket, @@ -166,7 +175,7 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { Expires: 600, // 5 minutes }); - logDebug("imageUrl", imageUrl); + log.verbose("imageUrl", { imageUrl }); metricsPing.timing_sent = Date.now() - Date.parse(datestamp); @@ -186,7 +195,7 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { metricsPing.timing_received = Date.now() - timingReceivedStart; metricsPing.photodna_tracking_id = upstreamServiceResponse.TrackingId; - logDebug("upstreamServiceResponse", jsonPretty(upstreamServiceResponse)); + log.verbose("upstreamServiceResponse", { upstreamServiceResponse }); const { IsMatch } = upstreamServiceResponse; metricsPing.is_match = IsMatch; @@ -197,7 +206,7 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { S3.deleteObject({ Bucket, Key: `${image}` }).promise(), S3.deleteObject({ Bucket, Key: `${image}-request.json` }).promise(), ]); - logDebug("deleteResult", jsonPretty(deleteResult)); + log.verbose("deleteResult", { deleteResult }); } else { // On positive match, store the details of the match response. const putResult = await S3.putObject({ @@ -216,7 +225,7 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { }), }).promise(); - logDebug("putResult", jsonPretty(putResult)); + log.verbose("putResult", { putResult }); // Send an email alert on positive match, if addresses are available. const ToAddresses = []; @@ -276,11 +285,11 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { }, }, }; - logDebug("emailParams", jsonPretty(emailParams)); + log.verbose("emailParams", { emailParams }); const emailResult = await SES.sendEmail(emailParams).promise(); - logDebug("emailResult", jsonPretty(emailResult)); - logInfo(`Sent notification email (${emailResult.MessageId})`); + log.verbose("emailResult", { emailResult }); + log.info("sentEmail", { messageId: emailResult.MessageId }); } } @@ -304,15 +313,15 @@ exports.handleOne = async function({ receiptHandle, body }, { awsRequestId }) { }, }); metricsPing.timing_submitted = Date.now() - timingSubmittedStart; - logDebug("callbackResult", jsonPretty(callbackResult)); + log.verbose("callbackResult", { callbackResult }); } catch (err) { Raven.captureException(err); metricsPing.is_error = true; - logInfo("REQUEST ERROR", err); + log.error("callbackError", { err }); throw err; } const metricsResult = await Metrics.workerWorks(metricsPing); - logDebug("metricsResult", jsonPretty(metricsResult)); + log.verbose("metricsResult", { metricsResult }); return id; }; diff --git a/functions/version-test.js b/functions/version-test.js index d74b0be..6594c5c 100644 --- a/functions/version-test.js +++ b/functions/version-test.js @@ -11,6 +11,7 @@ describe("functions/version.handler", () => { const result = await version.handler({ path: "/dev/__version__", httpMethod: "GET", + headers: {}, }); expect(result.statusCode).to.equal(200); expect(JSON.parse(result.body)).to.deep.equal({ diff --git a/functions/version.js b/functions/version.js index 6eb149b..91b1c50 100644 --- a/functions/version.js +++ b/functions/version.js @@ -1,7 +1,14 @@ "use strict"; const packageMeta = require("../package.json"); -module.exports.handler = async function(event, context) { +module.exports.handler = async function(event = {}, context = {}) { + const log = require("../lib/logging")({ + name: "version", + isRequest: true, + event, + context, + }); + log.info("summary"); const { GIT_COMMIT: commit = "" } = process.env; return { statusCode: 200, diff --git a/lib/logging.js b/lib/logging.js new file mode 100644 index 0000000..8398d70 --- /dev/null +++ b/lib/logging.js @@ -0,0 +1,80 @@ +// Configure logging and wrap mozlog methods in decorators that automatically +// include function context and event information +module.exports = ({ name, event, context, isRequest = false }) => { + const { + LOG_LEVEL = "info", + LOG_FORMAT = "heka", + LOG_DEBUG = "0", + GIT_COMMIT = "", + } = process.env; + + const mozlog = require("mozlog")({ + app: "watchdog-proxy", + level: LOG_LEVEL, + fmt: LOG_FORMAT, + debug: LOG_DEBUG === "1", + }); + + const log = mozlog(name); + const selector = isRequest ? selectRequest : selectBase; + + const out = {}; + out.commonFields = { + version: GIT_COMMIT, + }; + LOG_LEVELS.forEach( + level => + (out[level] = (op, fields = {}) => + log[level]( + op, + selector({ event, context, fields, commonFields: out.commonFields }) + )) + ); + return out; +}; + +const LOG_LEVELS = [ + "trace", + "verbose", + "debug", + "info", + "warn", + "error", + "critical", +]; + +const selectRequest = ({ event, context, fields = {}, commonFields = {} }) => + Object.assign(selectRequestEvent(event), selectBase({ context, fields })); + +const selectBase = ({ context, fields = {}, commonFields = {} }) => + Object.assign( + { timestamp: Date.now() }, + selectContext(context), + commonFields, + fields + ); + +// https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-api-gateway-request +const selectRequestEvent = ({ + path, + httpMethod: method, + headers: { Host: hostname, "User-Agent": agent }, +}) => ({ + path, + method, + agent, + hostname, +}); + +// https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html +const selectContext = ({ + awsRequestId, + functionName, + functionVersion, + memoryLimitInMB, +}) => ({ + awsRequestId, + functionName, + functionVersion, + memoryLimitInMB, +}); diff --git a/lib/test-setup.js b/lib/test-setup.js index e0d524b..1152050 100644 --- a/lib/test-setup.js +++ b/lib/test-setup.js @@ -15,8 +15,7 @@ global.env = { EMAIL_FROM: "lorchard@mozilla.com", EMAIL_TO: "", EMAIL_EXPIRES: 600, - LOG_DEBUG: "0", - LOG_INFO: "0", + LOG_LEVEL: process.env.LOG_LEVEL || "critical", }; global.constants = { diff --git a/lib/utils.js b/lib/utils.js index 3c692a5..e4b3413 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,20 +1,5 @@ const crypto = require("crypto"); -const makeLog = (name, enable) => (...args) => { - if (!enable) { - return; - } - console.log(`[${name}]`, ...args); -}; - -const { LOG_INFO = "1", LOG_ERROR = "1", LOG_DEBUG = "0" } = process.env; - -const logError = makeLog("error", LOG_ERROR === "1"); - -const logDebug = makeLog("debug", LOG_DEBUG === "1"); - -const logInfo = makeLog("info", LOG_INFO === "1"); - const jsonPretty = data => JSON.stringify(data, null, " "); const md5 = data => @@ -28,10 +13,6 @@ const wait = delay => new Promise(resolve => setTimeout(resolve, delay)); const epochNow = () => Math.floor(Date.now() / 1000); module.exports = { - makeLog, - logDebug, - logInfo, - logError, jsonPretty, md5, wait, diff --git a/package-lock.json b/package-lock.json index a0b826e..e63d889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -165,14 +165,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "any-observable": { "version": "0.3.0", @@ -1018,6 +1016,535 @@ "upath": "^1.0.5" }, "dependencies": { + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -1636,6 +2163,11 @@ "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, + "dbug": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/dbug/-/dbug-0.4.2.tgz", + "integrity": "sha1-MrSzEF6IYQQ6b5rHVdgOVC02WzE=" + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -2092,8 +2624,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "5.6.0", @@ -2142,9 +2673,9 @@ }, "dependencies": { "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -2219,16 +2750,6 @@ "through": "^2.3.6" } }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2322,9 +2843,9 @@ } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -2823,554 +3344,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3586,7 +3559,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3888,6 +3860,41 @@ "through": "^2.3.6" } }, + "intel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", + "integrity": "sha1-EdEUfraz9Fgr31M3s31UFYTp5B4=", + "requires": { + "chalk": "^1.1.0", + "dbug": "~0.4.2", + "stack-trace": "~0.0.9", + "strftime": "~0.10.0", + "symbol": "~0.3.1", + "utcstring": "~0.1.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -4059,7 +4066,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4277,9 +4284,9 @@ "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4809,9 +4816,9 @@ } }, "lolex": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.4.tgz", - "integrity": "sha512-Gh6Vffq/piTeHwunLNFR1jFVaqlwK9GMNUxFcsO1cwHyvbRKHwX8UDkxmrDnbcPdHNmpv7z2kxtkkSx5xkNpMw==", + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", "dev": true }, "lowercase-keys": { @@ -4905,6 +4912,11 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -5334,6 +5346,15 @@ "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", "dev": true }, + "mozlog": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.2.0.tgz", + "integrity": "sha1-Rwk8XHEuKBDecnCYMFFk0SyK6SM=", + "requires": { + "intel": "^1.0.0", + "merge": "^1.2.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5744,9 +5765,9 @@ } }, "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -6580,9 +6601,9 @@ } }, "rxjs": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.0.tgz", - "integrity": "sha512-qBzf5uu6eOKiCZuAE0SgZ0/Qp+l54oeVxFfC2t+mJ2SFI6IB8gmMdJHs5DUMu5kqifqcCtsKS2XHjhZu6RKvAw==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.2.tgz", + "integrity": "sha512-hV7criqbR0pe7EeL3O66UYVg92IR0XsA97+9y+BWTePK9SKmEI5Qd3Zj6uPnGkNzXsBywBQWTvujPl+1Kn9Zjw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7207,8 +7228,7 @@ "stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", - "dev": true + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" }, "staged-git-files": { "version": "1.1.1", @@ -7262,6 +7282,11 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, + "strftime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", + "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" + }, "string-argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", @@ -7417,8 +7442,12 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "symbol": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.3.1.tgz", + "integrity": "sha1-tvmpANSWpX8CQI8iGYwQndoGMEE=" }, "symbol-observable": { "version": "1.2.0", @@ -7441,9 +7470,9 @@ }, "dependencies": { "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -7631,17 +7660,17 @@ } }, "tar-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, "requires": { "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", + "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", - "to-buffer": "^1.1.0", + "to-buffer": "^1.1.1", "xtend": "^4.0.0" }, "dependencies": { @@ -7812,9 +7841,9 @@ } }, "tslib": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", - "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, "tunnel-agent": { @@ -8102,6 +8131,11 @@ } } }, + "utcstring": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/utcstring/-/utcstring-0.1.0.tgz", + "integrity": "sha1-Qw/VEKt/yVtdWRDJAteYgMIIQ2s=" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 1bf859d..aaaad7c 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "eslint-plugin-node": "7.0.1", "hawk": "7.0.7", "raven": "2.6.4", + "mozlog": "2.2.0", "request": "2.88.0", "request-promise-native": "1.0.5" }