From a0d91b85a1975714ff6a411a32a2a7cfffb9c1ca Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Sat, 7 Apr 2018 16:20:20 +0300 Subject: [PATCH 01/14] Change forever script, ready check script --- Dockerfile.windows | 78 ++++++++++++++++++++++++++++++++++++++++++++++ lib/forever.ps1 | 4 +++ lib/isReady.ps1 | 10 ++++++ lib/isReady.sh | 13 -------- 4 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 Dockerfile.windows create mode 100644 lib/forever.ps1 create mode 100755 lib/isReady.ps1 delete mode 100755 lib/isReady.sh diff --git a/Dockerfile.windows b/Dockerfile.windows new file mode 100644 index 00000000..eff632e8 --- /dev/null +++ b/Dockerfile.windows @@ -0,0 +1,78 @@ + +FROM microsoft/windowsservercore:1709 as download + +SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] + +ENV GPG_VERSION 2.3.4 + +RUN Invoke-WebRequest $('https://files.gpg4win.org/gpg4win-vanilla-{0}.exe' -f $env:GPG_VERSION) -OutFile 'gpg4win.exe' -UseBasicParsing ; \ + Start-Process .\gpg4win.exe -ArgumentList '/S' -NoNewWindow -Wait + +RUN @( \ + '94AE36675C464D64BAFA68DD7434390BDBE9B9C5', \ + 'FD3A5288F042B6850C66B31F09FE44734EB7990E', \ + '71DCFD284A79C3B38668286BC97EC7A07EDE3FC1', \ + 'DD8F2338BAE7501E3DD5AC78C273792F7D83545D', \ + 'C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8', \ + 'B9AE9905FFD7803F25714661B63B535A4C206CA9', \ + '56730D5401028683275BD23C23EFEFE93C4CFFFE', \ + '77984A986EBC2AA786BC0F66B01FBB92821C587A' \ + ) | foreach { \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys $_ ; \ + } + +ENV NODE_VERSION 8.1.4 + +RUN Invoke-WebRequest $('https://nodejs.org/dist/v{0}/SHASUMS256.txt.asc' -f $env:NODE_VERSION) -OutFile 'SHASUMS256.txt.asc' -UseBasicParsing ; \ + gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc + +RUN Invoke-WebRequest $('https://nodejs.org/dist/v{0}/node-v{0}-win-x64.zip' -f $env:NODE_VERSION) -OutFile 'node.zip' -UseBasicParsing ; \ + $sum = $(cat SHASUMS256.txt.asc | sls $(' node-v{0}-win-x64.zip' -f $env:NODE_VERSION)) -Split ' ' ; \ + if ((Get-FileHash node.zip -Algorithm sha256).Hash -ne $sum[0]) { Write-Error 'SHA256 mismatch' } ; \ + Expand-Archive node.zip -DestinationPath C:\ ; \ + Rename-Item -Path $('C:\node-v{0}-win-x64' -f $env:NODE_VERSION) -NewName 'C:\nodejs' + +ENV YARN_VERSION 0.24.6 + +RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 ; \ + Invoke-WebRequest $('https://yarnpkg.com/downloads/{0}/yarn-{0}.msi' -f $env:YARN_VERSION) -OutFile yarn.msi -UseBasicParsing ; \ + $sig = Get-AuthenticodeSignature yarn.msi ; \ + if ($sig.Status -ne 'Valid') { Write-Error 'Authenticode signature is not valid' } ; \ + Write-Output $sig.SignerCertificate.Thumbprint ; \ + if (@( \ + '7E253367F8A102A91D04829E37F3410F14B68A5F', \ + 'AF764E1EA56C762617BDC757C8B0F3780A0CF5F9' \ + ) -notcontains $sig.SignerCertificate.Thumbprint) { Write-Error 'Unknown signer certificate' } ; \ + Start-Process msiexec.exe -ArgumentList '/i', 'yarn.msi', '/quiet', '/norestart' -NoNewWindow -Wait + +FROM download as build + +SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] + +ENV NPM_CONFIG_LOGLEVEL info + +COPY --from=download /nodejs /nodejs +COPY --from=download [ "/Program Files (x86)/yarn", "/yarn" ] + +RUN $env:PATH = 'C:\nodejs;C:\yarn\bin;{0}' -f $env:PATH ; \ + [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine) + +CMD [ "node.exe" ] + +FROM build + +WORKDIR C:/tmp + +RUN Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) +RUN choco install git -y +RUN choco install cygwin -y + +COPY package.json ./ + +COPY yarn.lock ./ + +RUN yarn install --frozen-lockfile --production + +COPY . ./ + +CMD ["powershell", "./lib/forever.ps1"] \ No newline at end of file diff --git a/lib/forever.ps1 b/lib/forever.ps1 new file mode 100644 index 00000000..c472f358 --- /dev/null +++ b/lib/forever.ps1 @@ -0,0 +1,4 @@ +while ($true) { + Start-Sleep -s 1 + & node lib/index.js +} \ No newline at end of file diff --git a/lib/isReady.ps1 b/lib/isReady.ps1 new file mode 100755 index 00000000..78190670 --- /dev/null +++ b/lib/isReady.ps1 @@ -0,0 +1,10 @@ + +CONTAINER_ID=$args[0] + +echo "checking if container:$CONTAINER_ID exists" +if ( !$CONTAINER_ID ) { + select-string -Pattern $CONTAINER_ID -Path ./lib/state.json +} +else { + select-string -Pattern "ready" -Path ./lib/state.json +} \ No newline at end of file diff --git a/lib/isReady.sh b/lib/isReady.sh deleted file mode 100755 index 4ad494b3..00000000 --- a/lib/isReady.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# - -CONTAINER_ID=$1 - -echo "checking if container:$CONTAINER_ID exists" -if [ -n "$CONTAINER_ID" ]; then - grep -q $CONTAINER_ID ./lib/state.json -else - grep -q "ready" ./lib/state.json -fi - - From ccb727c8d80b2d452ae63b7c0a4d4b2675b1faea Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Sat, 7 Apr 2018 16:23:32 +0300 Subject: [PATCH 02/14] Fix the docker socket path --- lib/logger.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/logger.js b/lib/logger.js index bae0ebeb..dd5b9b4c 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -22,12 +22,10 @@ class Logger { this.findExistingContainers = findExistingContainers === 'true'; let dockerSockPath; - if (fs.existsSync('/var/run/codefresh/docker.sock')) { - dockerSockPath = '/var/run/codefresh/docker.sock'; - //console.log('Using /var/run/codefresh/docker.sock'); + if (fs.existsSync('//./pipe/codefresh/docker_engine')) { + dockerSockPath = '//./pipe/codefresh/docker_engine'; } else { - dockerSockPath = '/var/run/docker.sock'; - //console.log('Using /var/run/docker.sock'); + dockerSockPath = '//./pipe/docker_engine'; } this.docker = new Docker({ From b2e3ced1feb3b75eac5b005b5456a2f21a222a93 Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Wed, 18 Jul 2018 09:40:53 +0000 Subject: [PATCH 03/14] Windows Server v1803 --- Dockerfile.windows | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index eff632e8..4889b8d1 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -1,5 +1,5 @@ -FROM microsoft/windowsservercore:1709 as download +FROM microsoft/windowsservercore:1803 as download SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] From 115c0d1076834f4a6a60f8dcf8aa60d286493279 Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Tue, 11 Dec 2018 11:58:38 +0000 Subject: [PATCH 04/14] Windows 1809 --- Dockerfile.windows | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index 4889b8d1..cd8199fc 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -1,5 +1,4 @@ - -FROM microsoft/windowsservercore:1803 as download +FROM mcr.microsoft.com/windows/servercore:1809 as download SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] From 33bb22cef9903ccd71c5e6fb495509cd32ff190b Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Wed, 13 Mar 2019 15:50:37 +0300 Subject: [PATCH 05/14] Update Dockerfile --- Dockerfile.windows | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index cd8199fc..40402783 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -14,13 +14,16 @@ RUN @( \ 'DD8F2338BAE7501E3DD5AC78C273792F7D83545D', \ 'C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8', \ 'B9AE9905FFD7803F25714661B63B535A4C206CA9', \ - '56730D5401028683275BD23C23EFEFE93C4CFFFE', \ - '77984A986EBC2AA786BC0F66B01FBB92821C587A' \ + '77984A986EBC2AA786BC0F66B01FBB92821C587A', \ + '8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600', \ + '4ED778F539E3634C779C87C6D7062848A1AB005C', \ + 'A48C2BEE680E841632CD4E44F07496B3EB3C1762', \ + 'B9E2F5981AA6E0CD28160D9FF13993A75599653C' \ ) | foreach { \ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys $_ ; \ } -ENV NODE_VERSION 8.1.4 +ENV NODE_VERSION 11.10.0 RUN Invoke-WebRequest $('https://nodejs.org/dist/v{0}/SHASUMS256.txt.asc' -f $env:NODE_VERSION) -OutFile 'SHASUMS256.txt.asc' -UseBasicParsing ; \ gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc From dd2ab4ee5ff7ca9e396639eab8569244b759e20a Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Wed, 3 Apr 2019 14:49:34 +0300 Subject: [PATCH 06/14] Merge changes from master --- Dockerfile | 2 +- Dockerfile.aarch64 | 43 +- codefresh.yml | 9 +- gulpfile.js | 2 +- lib/ContainerLogger.js | 72 +- lib/index.js | 15 +- lib/logger.js | 143 ++- package.json | 19 +- test/ContainerLogger.unit.spec.js | 470 +++++-- test/logger.unit.spec.js | 751 ++++++++---- yarn.lock | 1906 ++++++++++++++++++++++++----- 11 files changed, 2710 insertions(+), 722 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3f5c65e0..39e5b5df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.1.4-alpine +FROM node:11.10.0-alpine WORKDIR /root/cf-runtime diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index a582e29b..3246c3c6 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -1,7 +1,7 @@ FROM multiarch/alpine:aarch64-v3.6 ENV NPM_CONFIG_LOGLEVEL info -ENV NODE_VERSION 8.1.4 +ENV NODE_VERSION 11.10.0 RUN addgroup -g 1000 node \ && adduser -u 1000 -G node -s /bin/sh -D node \ @@ -17,25 +17,26 @@ RUN addgroup -g 1000 node \ linux-headers \ make \ python \ - # gpg keys listed at https://github.com/nodejs/node#release-team - && for key in \ - 9554F04D7259F04124DE6B476D5A82AC7E37093B \ - 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ - FD3A5288F042B6850C66B31F09FE44734EB7990E \ - 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ - DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ - B9AE9905FFD7803F25714661B63B535A4C206CA9 \ - C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ - 56730D5401028683275BD23C23EFEFE93C4CFFFE \ - ; do \ - gpg --keyserver pgp.mit.edu --recv-keys "$key" || \ - gpg --keyserver keyserver.pgp.com --recv-keys "$key" || \ - gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ; \ - done \ +# gpg keys listed at https://github.com/nodejs/node#release-team +# && for key in \ +# 9554F04D7259F04124DE6B476D5A82AC7E37093B \ +# 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ +# FD3A5288F042B6850C66B31F09FE44734EB7990E \ +# 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ +# DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ +# B9AE9905FFD7803F25714661B63B535A4C206CA9 \ +# C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ +# 56730D5401028683275BD23C23EFEFE93C4CFFFE \ +# +# ; do \ +# gpg --keyserver pgp.mit.edu --recv-keys "$key" || \ +# gpg --keyserver keyserver.pgp.com --recv-keys "$key" || \ +# gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ; \ +# done \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION.tar.xz" \ - && curl -SLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ - && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ - && grep " node-v$NODE_VERSION.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ +# && curl -SLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ +# && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ +# && grep " node-v$NODE_VERSION.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ && tar -xf "node-v$NODE_VERSION.tar.xz" \ && cd "node-v$NODE_VERSION" \ && ./configure \ @@ -44,8 +45,8 @@ RUN addgroup -g 1000 node \ && apk del .build-deps \ && cd .. \ && rm -Rf "node-v$NODE_VERSION" \ - && rm "node-v$NODE_VERSION.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt - +# && rm "node-v$NODE_VERSION.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt + && rm "node-v$NODE_VERSION.tar.xz" WORKDIR /root/cf-runtime diff --git a/codefresh.yml b/codefresh.yml index 6070845b..eb146a0b 100644 --- a/codefresh.yml +++ b/codefresh.yml @@ -5,24 +5,23 @@ steps: install_dependencies: title: 'Installing testing dependencies' - image: codefresh/node-tester-image:8.1.4 + image: node:11.10.0 commands: - yarn install --frozen-lockfile - eslint: title: 'Running linting logic' - image: codefresh/node-tester-image:8.1.4 + image: node:11.10.0 commands: - yarn lint - yarn no-onlys unit_test_step: - image: codefresh/node-tester-image:8.1.4 + image: node:11.10.0 environment: - COVERALLS_TOKEN=${{COVERALLS_TOKEN}} commands: - - yarn test:ci + - yarn test build_step: title: "Building production image" diff --git a/gulpfile.js b/gulpfile.js index 8db549b8..59bc956c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -19,7 +19,7 @@ gulp.task('no.onlys', function (callback) { gulp.task('lint', ['clean'], function () { - return gulp.src(['**/*.js', '!**/node_modules/**', '!**/server/migration/**', '!coverage/**/*.js']) + return gulp.src(['**/*.js', '!**/node_modules/**', '!**/server/migration/**', '!coverage/**/*.js', '!test/logger.unit.spec.js']) .pipe(jshint({lookup: true})) .pipe(jshint.reporter('default')) .pipe(jshint.reporter('fail')); diff --git a/lib/ContainerLogger.js b/lib/ContainerLogger.js index 109471b2..fc0545ae 100644 --- a/lib/ContainerLogger.js +++ b/lib/ContainerLogger.js @@ -1,19 +1,31 @@ 'use strict'; +const EventEmitter = require('events'); const Q = require('q'); const logger = require('cf-logs').Logger('codefresh:containerLogger'); const CFError = require('cf-errors'); const LoggerStrategy = require('./enums').LoggerStrategy; -class ContainerLogger { +class ContainerLogger extends EventEmitter { - constructor(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy) { - this.containerId = containerId; - this.containerInterface = containerInterface; - this.firebaseLogger = firebaseLogger; - this.firebaseLastUpdate = firebaseLastUpdate; - this.loggerStrategy = loggerStrategy; - this.tty = false; + constructor({ + containerId, + containerInterface, + stepLogger, + logSizeLimit, + isWorkflowLogSizeExceeded, // eslint-disable-line + loggerStrategy + }) { + super(); + this.containerId = containerId; + this.containerInterface = containerInterface; + this.stepLogger = stepLogger; + this.loggerStrategy = loggerStrategy; + this.tty = false; + this.logSizeLimit = logSizeLimit; + this.logSize = 0; + this.isWorkflowLogSizeExceeded = isWorkflowLogSizeExceeded; + this.stepFinished = false; } start() { @@ -34,18 +46,24 @@ class ContainerLogger { // See documentation of the docker api here: https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/attach-to-a-container if (this.tty) { this._handleTtyStream(stdout, false); - this._handleTtyStream(stderr, true); + if (stderr) { + this._handleTtyStream(stderr, true); + } } else { this._handleNonTtyStream(stdout, false); } stdout.on('end', () => { + this.stepFinished = true; logger.info(`stdout end event was fired for container: ${this.containerId}`); }); - stderr.on('end', () => { - logger.info(`stderr end event was fired for container: ${this.containerId}`); - }); + if (stderr) { + stderr.on('end', () => { + this.stepFinished = true; + logger.info(`stderr end event was fired for container: ${this.containerId}`); + }); + } }, (err) => { return Q.reject(new CFError({ cause: err, @@ -85,7 +103,7 @@ class ContainerLogger { stream.on('data', (chunk) => { const buf = new Buffer(chunk); const message = buf.toString('utf8'); - this._logMessageToFirebase(message, isError); + this._logMessage(message, isError); }); logger.info(`Listening on stream 'data' event for container: ${this.containerId}`); } @@ -98,20 +116,38 @@ class ContainerLogger { if (payload === null) { break; } - this._logMessageToFirebase(new Buffer(payload).toString('utf8'), isError); + this._logMessage(new Buffer(payload).toString('utf8'), isError); header = stream.read(8); } }); logger.info(`Listening on stream 'readable' event for container: ${this.containerId}`); } - _logMessageToFirebase(message, isError) { + _stepLogSizeExceeded() { + return this.logSize > this.logSizeLimit; + } + + _logMessage(message, isError) { + if (this.logSizeLimit && (this._stepLogSizeExceeded() || this.isWorkflowLogSizeExceeded()) && !isError) { + if (!this.logExceededLimitsNotified) { + this.logExceededLimitsNotified = true; + message = `\x1B[01;93mLog size exceeded for ${this._stepLogSizeExceeded() ? 'this step' : 'the workflow'}.\nThe step will continue to execute until it finished but new logs will not be stored.\x1B[0m\r\n`; + } else { + return; + } + } + if (isError) { message = `\x1B[31m${message}\x1B[0m`; } - - this.firebaseLogger.push(message); - this.firebaseLastUpdate.set(new Date().getTime()); + + this.stepLogger.write(message); + + if (this.logSizeLimit) { + this.logSize += Buffer.byteLength(message); + this.stepLogger.setLogSize(this.logSize); + } + this.emit('message.logged'); } } diff --git a/lib/index.js b/lib/index.js index c4a7c544..8b55a0eb 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,14 +5,23 @@ const cflogs = require('cf-logs'); const loggerOptions = { filePath: path.join(__dirname, '../logs', 'logs.log'), - console: process.env.LOG_TO_CONSOLE || false + console: process.env.LOG_TO_CONSOLE || false, + consoleOptions: { + timestamp() { + return new Date().toISOString(); + } + } }; cflogs.init(loggerOptions); const Logger = require('./logger'); - -const logger = new Logger(process.env.LOGGER_ID, process.env.FIREBASE_AUTH_URL, process.env.FIREBASE_SECRET, process.env.LISTEN_ON_EXISTING); +const logger = new Logger({ + loggerId: process.env.LOGGER_ID, + taskLoggerConfig: JSON.parse(process.env.TASK_LOGGER_CONFIG), + findExistingContainers: process.env.LISTEN_ON_EXISTING, + logSizeLimit: process.env.LOG_SIZE_LIMIT ? (parseInt(process.env.LOG_SIZE_LIMIT) * 1000000) : undefined, +}); logger.validate(); logger.start(); diff --git a/lib/logger.js b/lib/logger.js index dd5b9b4c..9bd9bb11 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -2,7 +2,6 @@ const fs = require('fs'); const _ = require('lodash'); -const Firebase = require('firebase'); const Docker = require('dockerode'); const DockerEvents = require('docker-events'); const CFError = require('cf-errors'); @@ -11,15 +10,24 @@ const ContainerStatus = require('./enums').ContainerStatus; const LoggerStrategy = require('./enums').LoggerStrategy; const ContainerHandlingStatus = require('./enums').ContainerHandlingStatus; const ContainerLogger = require('./ContainerLogger'); +const { TaskLogger } = require('@codefresh-io/task-logger'); class Logger { - constructor(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers) { + constructor({ + loggerId, + taskLoggerConfig, + findExistingContainers, + logSizeLimit + }) { this.state = { status: 'init' }; - this.firebaseAuthUrl = firebaseAuthUrl; - this.firebaseSecret = firebaseSecret; + this.taskLoggerConfig = taskLoggerConfig; this.loggerId = loggerId; this.findExistingContainers = findExistingContainers === 'true'; + this.logSizeLimit = logSizeLimit; + this.containerLoggers = []; + this.logSize = 0; + this.taskLogger = undefined; let dockerSockPath; if (fs.existsSync('//./pipe/codefresh/docker_engine')) { @@ -38,11 +46,8 @@ class Logger { * @returns {*} */ validate() { - if (!this.firebaseAuthUrl) { - return this._error(new CFError('firebase auth url is missing')); - } - if (!this.firebaseSecret) { - return this._error(new CFError('firebase secret is missing')); + if (!this.taskLoggerConfig) { + return this._error(new CFError('taskLogger configuration is missing')); } if (!this.loggerId) { return this._error(new CFError('logger id is missing')); @@ -54,37 +59,36 @@ class Logger { * will attach it self to all created containers that their ids in their labels equals loggerId * will attach it self to all existing containers if requested * the container label should be 'io.codefresh.loggerId' - * the path to write the containers logs will be passed through 'io.codefresh.firebaseUrl' label - * @param loggerId - * @param firebaseAuthUrl - * @param firebaseSecret */ start() { logger.info(`Logging container created for logger id: ${this.loggerId}`); - const authRef = new Firebase(this.firebaseAuthUrl); - authRef.authWithCustomToken(this.firebaseSecret, (err) => { - if (err) { - this._error(new CFError({ - cause: err, - message: `Failed to authenticate to firebase url ${this.firebaseAuthUrl}` - })); - return; - } - logger.info(`Authenticated to firebase url: ${this.firebaseAuthUrl}`); + TaskLogger(this.taskLoggerConfig.task, this.taskLoggerConfig.opts) + .then((taskLogger) => { + taskLogger.on('error', (err) => { + logger.error(err.stack); + }); - this._listenForNewContainers(); + this.taskLogger = taskLogger; + logger.info(`taskLogger successfully created`); - this.state.status = 'ready'; - this._writeNewState(); + this._listenForNewContainers(); - if (this.findExistingContainers) { - this._listenForExistingContainers(); - } - - }); + this.state.status = 'ready'; + this._writeNewState(); + if (this.findExistingContainers) { + this._listenForExistingContainers(); + } + }) + .catch((err) => { + this._error(new CFError({ + cause: err, + message: `Failed to create taskLogger` + })); + return; + }); } /** @@ -116,22 +120,34 @@ class Logger { }); } + + logLimitExceeded() { + // TODO in the future when we allow a workflow to use multuple dinds, this will not be correct + // we need to get the total size of logs from all dinds + return this.logSizeLimit && this._getTotalLogSize() > this.logSizeLimit; + } + + _getTotalLogSize() { + return _.reduce(this.containerLoggers, (sum, containerLogger) => { + return sum + containerLogger.logSize; + }, 0); + } + /** * receives a container and decides if to start listening on it * @param loggerId * @param docker * @param newContainer */ - _handleContainer(container) { + async _handleContainer(container) { // jshint ignore:line const containerId = container.Id || container.id; const containerStatus = container.Status || container.status; const receivedLoggerId = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.id']; - const receivedFirebaseLogsUrl = _.get(container, - 'Labels', - _.get(container, 'Actor.Attributes'))['io.codefresh.logger.firebase.logsUrl']; - const receivedFirebaseLastUpdateUrl = _.get(container, + const runCreationLogic = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.runCreationLogic']; + const stepName = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.stepName']; + const receivedLogSizeLimit = _.get(container, 'Labels', - _.get(container, 'Actor.Attributes'))['io.codefresh.logger.firebase.lastUpdateUrl']; + _.get(container, 'Actor.Attributes'))['io.codefresh.logger.logSizeLimit']; const loggerStrategy = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.strategy']; if (!containerId) { @@ -155,18 +171,13 @@ class Logger { return; } - if (!receivedFirebaseLogsUrl) { - logger.error(`Container: ${containerId} does contain a firebaseUrl label`); - return; - } - - if (!receivedFirebaseLastUpdateUrl) { - logger.error(`Container: ${containerId} does contain a loggerFirebaseLastUpdateUrl label`); + if (!stepName) { + logger.error(`Container: ${containerId} does not contain a stepName label`); return; } if (!loggerStrategy) { - logger.error(`Container: ${containerId} does contain a loggerStrategy label`); + logger.error(`Container: ${containerId} does not contain a loggerStrategy label`); return; } @@ -184,32 +195,23 @@ class Logger { this.state[containerId] = { status: ContainerHandlingStatus.INITIALIZING }; logger.info(`Handling container: ${containerId}, status: '${containerStatus}'`); - let firebaseLogger; - try { - firebaseLogger = new Firebase(receivedFirebaseLogsUrl); - } catch (err) { - const error = new CFError({ - cause: err, - message: `Failed to create a new firebase logger ref` - }); - logger.error(error.toString()); - return; - } + const stepLogger = this.taskLogger.create(stepName, undefined, runCreationLogic); + logger.info(`Brought step logger for container: ${containerId}`); - let firebaseLastUpdate; - try { - firebaseLastUpdate = new Firebase(receivedFirebaseLastUpdateUrl); - } catch (err) { - const error = new CFError({ - cause: err, - message: `Failed to create a new firebase lastUpdate ref` - }); - logger.error(error.toString()); - return; - } + + const logSizeLimit = receivedLogSizeLimit ? (parseInt(receivedLogSizeLimit) * 1000000) : undefined; const containerInterface = this.docker.getContainer(containerId); - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + logSizeLimit, + isWorkflowLogSizeExceeded: this.logLimitExceeded.bind(this), + loggerStrategy + }); + this.containerLoggers.push(containerLogger); + containerLogger.on('message.logged', this._updateTotalLogSize.bind(this)); containerLogger.start() .done(() => { @@ -225,6 +227,11 @@ class Logger { }); } + _updateTotalLogSize() { + this.logSize = this._getTotalLogSize(); + this.taskLogger.setLogSize(this.logSize); + } + /** * Will check if a container was already handled (no matter what the handling status is) * @param containerId diff --git a/package.json b/package.json index 2f081484..c67e3bf9 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,44 @@ { "name": "cf-container-logger", "version": "0.0.4", - "description": "codefresh container logger to firebase", + "description": "codefresh container logger", "keywords": [ "cf-container-logger" ], "dependencies": { + "@codefresh-io/task-logger": "^0.0.11", "cf-errors": "^0.1.11", - "cf-logs": "git+https://github.com/codefresh-io/cf-logs.git#ceba4f309e52a077747a0c6bf9c3ad02e762dc4b", - "dockerode": "^2.3.0", + "cf-logs": "^1.1.0", "docker-events": "0.0.2", - "firebase": "git+https://github.com/codefresh-io/firebase.git#80b2ed883ff281cd67b53bd0f6a0bbd6f330fed5", + "dockerode": "^2.3.0", "forever": "^0.15.3", "lodash": "^4.15.0", "q": "^1.4.1" }, "devDependencies": { - "chai": "^3.0.0", + "chai": "^4.2.0", "gulp": "^3.9.1", "gulp-coveralls": "^0.1.4", "gulp-env": "^0.2.0", "gulp-istanbul": "^0.10.4", "gulp-jshint": "^1.11.0", + "gulp-mocha": "^6.0.0", "gulp-mocha-co": "^0.4.1-co.3", "gulp-rimraf": "^0.1.1", "isparta": "^4.0.0", "proxyquire": "^1.7.4", "run-sequence": "^1.1.0", "shelljs": "^0.6.0", - "sinon": "^1.17.4", - "sinon-chai": "^2.8.0" + "sinon": "^7.2.4", + "sinon-chai": "^3.3.0" }, "engines": { - "node": "8.1.4" + "node": ">8.8.0" }, "scripts": { "lint": "gulp lint", "no-onlys": "gulp no.onlys", - "test": "gulp unit_test", + "test": "mocha './{,!(node_modules)/**/}*.spec.js'", "test:integration": "gulp integ_test", "test:ci": "gulp unit_test && gulp coveralls && gulp clean", "coveralls": "gulp coveralls", diff --git a/test/ContainerLogger.unit.spec.js b/test/ContainerLogger.unit.spec.js index c709dbd9..2ca31f40 100644 --- a/test/ContainerLogger.unit.spec.js +++ b/test/ContainerLogger.unit.spec.js @@ -15,41 +15,7 @@ describe('Container Logger tests', () => { describe('positive', () => { - it('should separate the stdout from stderr', () => { - const containerInspect = { - Config: { - Tty: true - } - }; - let receivedEvent; - const stream = { - on: (event, callback) => { - if (event !== 'end') { - receivedEvent = event; - callback('message'); - } - } - }; - const containerId = 'containerId'; - const containerInterface = { - inspect: (callback) => { - callback(null, containerInspect); - }, - logs: (options, callback) => { - expect(options.stdout ^ options.stderr).to.be.trusty; // jshint ignore:line - callback(null, stream); - } - }; - const firebaseLogger = {}; - const firebaseLastUpdate = {}; - const loggerStrategy = LoggerStrategy.LOGS; - - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - containerLogger._logMessageToFirebase = sinon.spy(); - return containerLogger.start(); - }); - - it('should handle a send message from stderr as error', () => { + it('should handle a send message from stderr as error', (done) => { const containerInspect = { Config: { Tty: true @@ -87,20 +53,23 @@ describe('Container Logger tests', () => { } } }; - const firebaseLogger = {}; - const firebaseLastUpdate = {}; + const stepLogger = { + write: sinon.spy() + }; const loggerStrategy = LoggerStrategy.LOGS; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - containerLogger._logMessageToFirebase = sinon.spy(); - return containerLogger.start() + const containerLogger = new ContainerLogger({ + containerId, containerInterface, stepLogger, loggerStrategy + }); + containerLogger._logMessage = sinon.spy(); + containerLogger.start() .then(() => { - expect(containerLogger._logMessageToFirebase).to.have.been.calledWith('message', false); // jshint ignore:line - expect(containerLogger._logMessageToFirebase).to.have.been.calledWith('error', true); // jshint ignore:line - }); + expect(containerLogger._logMessage).to.have.been.calledWith('message', false); // jshint ignore:line + }) + .done(done, done); }); - it('should handle a received message on data stream event in case tty is true', () => { + it('should handle a received message on data stream event in case tty is true', (done) => { const containerInspect = { Config: { Tty: true @@ -138,22 +107,25 @@ describe('Container Logger tests', () => { } } }; - const firebaseLogger = {}; - const firebaseLastUpdate = {}; + const stepLogger = { + write: sinon.spy() + }; const loggerStrategy = LoggerStrategy.LOGS; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - containerLogger._logMessageToFirebase = sinon.spy(); - return containerLogger.start() + const containerLogger = new ContainerLogger({ + containerId, containerInterface, stepLogger, loggerStrategy + }); + containerLogger._logMessage = sinon.spy(); + containerLogger.start() .then(() => { expect(receivedStdoutEvent).to.equal('data'); - expect(receivedStderrEvent).to.equal('data'); - expect(containerLogger._logMessageToFirebase).to.have.been.calledTwice; // jshint ignore:line - }); + expect(containerLogger._logMessage).to.have.been.calledOnce; // jshint ignore:line + }) + .done(done, done); }); it('should handle a received message on readable stream event in case tty is false', - () => { + (done) => { const containerInspect = { Config: { Tty: false @@ -178,18 +150,22 @@ describe('Container Logger tests', () => { }; const firebaseLogger = {}; const firebaseLastUpdate = {}; + const firebaseMetricsLogSize = {}; const loggerStrategy = LoggerStrategy.LOGS; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, firebaseMetricsLogSize, loggerStrategy + }); containerLogger._logMessageToFirebase = sinon.spy(); - return containerLogger.start(); + containerLogger.start() + .done(done, done); }); }); describe('negative', () => { - it('should fail in case the provided strategy is not supported', () => { + it('should fail in case the provided strategy is not supported', (done) => { const containerInspect = { Config: { Tty: true @@ -203,20 +179,24 @@ describe('Container Logger tests', () => { }; const firebaseLogger = {}; const firebaseLastUpdate = {}; + const firebaseMetricsLogSize = {}; const loggerStrategy = 'non-existing-strategy'; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - return containerLogger.start() + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, firebaseMetricsLogSize, loggerStrategy + }); + containerLogger.start() .then(() => { return Q.reject(new Error('should have failed')); }, (err) => { expect(err.toString()) .to .contain('Strategy: non-existing-strategy is not supported'); - }); + }) + .done(done, done); }); - it('should fail in case inspect of the container failes', () => { + it('should fail in case inspect of the container failes', (done) => { const containerId = 'containerId'; const containerInterface = { inspect: (callback) => { @@ -227,16 +207,19 @@ describe('Container Logger tests', () => { const firebaseLastUpdate = {}; const loggerStrategy = LoggerStrategy.LOGS; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - return containerLogger.start() + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy + }); + containerLogger.start() .then(() => { return Q.reject(new Error('should have failed')); }, (err) => { expect(err.toString()).to.contain('inspect error'); - }); + }) + .done(done, done); }); - it('should fail in case strategy is attach and attach failed', () => { + it('should fail in case strategy is attach and attach failed', (done) => { const containerInspect = { Config: { Tty: true @@ -255,10 +238,13 @@ describe('Container Logger tests', () => { }; const firebaseLogger = {}; const firebaseLastUpdate = {}; + const firebaseMetricsLogSize = {}; const loggerStrategy = LoggerStrategy.ATTACH; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - return containerLogger.start() + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, firebaseMetricsLogSize, loggerStrategy + }); + containerLogger.start() .then(() => { return Q.reject(new Error('should have failed')); }, (err) => { @@ -268,10 +254,11 @@ describe('Container Logger tests', () => { expect(options.tty).to.equal(true); }); expect(err.toString()).to.contain('attach error'); - }); + }) + .done(done, done); }); - it('should fail in case strategy is logs and logs failed', () => { + it('should fail in case strategy is logs and logs failed', (done) => { const containerInspect = { Config: { Tty: true @@ -290,19 +277,22 @@ describe('Container Logger tests', () => { }; const firebaseLogger = {}; const firebaseLastUpdate = {}; + const firebaseMetricsLogSize = {}; const loggerStrategy = LoggerStrategy.LOGS; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - return containerLogger.start() + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, firebaseMetricsLogSize, loggerStrategy + }); + containerLogger.start() .then(() => { return Q.reject(new Error('should have failed')); }, (err) => { receivedLogsOptions.forEach((options) => { - expect(options.stdout ^ options.stderr).to.equal(1); expect(options.follow).to.equal(1); }); expect(err.toString()).to.contain('logs error'); - }); + }) + .done(done, done); }); }); @@ -316,6 +306,250 @@ describe('Container Logger tests', () => { const containerId = 'containerId'; const containerInterface = {}; + const loggerStrategy = LoggerStrategy.LOGS; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + const stepLogger = { + write: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, containerInterface, stepLogger, loggerStrategy, isWorkflowLogSizeExceeded + }); + containerLogger._logMessage('message'); + expect(stepLogger.write).to.have.been.calledOnce; // jshint ignore:line + expect(stepLogger.write).to.have.been.calledWith('message'); // jshint ignore:line + }); + + it('should log error to firebase with red decoration', () => { + + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + + const stepLogger = { + write: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, containerInterface, stepLogger, loggerStrategy, isWorkflowLogSizeExceeded + }); + containerLogger._logMessage('message', true); + expect(stepLogger.write).to.have.been.calledOnce; // jshint ignore:line + expect(stepLogger.write).to.have.been.calledWith('\x1B[31mmessage\x1B[0m'); // jshint ignore:line + }); + + it('should not log message to firebase in case limit of step reached', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + + const stepLogger = { + write: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 10001; + containerLogger.logExceededLimitsNotified = true; + containerLogger._logMessage('message'); + expect(stepLogger.write).to.not.have.been.called; // jshint ignore:line + }); + + it('should not log message to firebase in case limit of workflow reached and step not yet', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return true; + }); + + const stepLogger = { + write: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 900; + containerLogger.logExceededLimitsNotified = true; + containerLogger._logMessage('message'); + expect(stepLogger.write).to.not.have.been.called; // jshint ignore:line + }); + + it('should print warning message to user in case of reaching the limit of step', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 10001; + containerLogger._logMessage('message'); + expect(stepLogger.write).to.have.been.calledWith(`\x1B[01;93mLog size exceeded for this step.\nThe step will continue to execute until it finished but new logs will not be stored.\x1B[0m\r\n`); // jshint ignore:line + }); + + it('should print warning message to user in case of reaching the limit of workflow', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return true; + }); + + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 900; + containerLogger._logMessage('message'); + expect(stepLogger.write).to.have.been.calledWith(`\x1B[01;93mLog size exceeded for the workflow.\nThe step will continue to execute until it finished but new logs will not be stored.\x1B[0m\r\n`); // jshint ignore:line + }); + + it('should not print the warning message more than once', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return true; + }); + + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 900; + containerLogger._logMessage('message'); + containerLogger._logMessage('message'); + expect(stepLogger.write).to.have.been.calledOnce; // jshint ignore:line + }); + + it('should print error messages even if reached the limit', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 10001; + containerLogger._logMessage('message'); + containerLogger._logMessage('message', true); + expect(stepLogger.write).to.have.been.calledTwice; // jshint ignore:line + }); + + it('should emit an event each time a log is registered', () => { + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger.logSize = 900; + containerLogger.emit = sinon.spy(containerLogger.emit); + containerLogger._logMessage('message'); + expect(containerLogger.emit).to.have.been.calledOnce; // jshint ignore:line + }); + + }); + + describe('log size', () => { + it('log size should stay 0 in case of not passing logSizeLimit param', () => { + + const containerId = 'containerId'; + const containerInterface = {}; + const pushSpy = sinon.spy(); const setSpy = sinon.spy(); const firebaseLogger = { @@ -324,16 +558,22 @@ describe('Container Logger tests', () => { const firebaseLastUpdate = { set: setSpy }; + const firebaseMetricsLogs = { + child: sinon.spy(() => { + return { + set: sinon.spy() + }; + }) + }; const loggerStrategy = LoggerStrategy.LOGS; - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - containerLogger._logMessageToFirebase('message'); - expect(pushSpy).to.have.been.calledOnce; // jshint ignore:line - expect(pushSpy).to.have.been.calledWith('message'); // jshint ignore:line - expect(setSpy).to.have.been.calledOnce; // jshint ignore:line + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, firebaseMetricsLogs, loggerStrategy + }); + expect(containerLogger.logSize).to.equal(0); }); - - it('should log error to firebase with red decoration', () => { + + it('log size should be 0 before any messages', () => { const containerId = 'containerId'; const containerInterface = {}; @@ -346,15 +586,77 @@ describe('Container Logger tests', () => { const firebaseLastUpdate = { set: setSpy }; + const firebaseMetricsLogs = { + child: sinon.spy(() => { + return { + set: sinon.spy() + }; + }) + }; + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + + const containerLogger = new ContainerLogger({ + containerId, containerInterface, firebaseLogger, firebaseLastUpdate, firebaseMetricsLogs, loggerStrategy, logSizeLimit + }); + expect(containerLogger.logSize).to.equal(0); + }); + + it('log size should increase after adding a message', () => { + + const containerId = 'containerId'; + const containerInterface = {}; + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); - const containerLogger = new ContainerLogger(containerId, containerInterface, firebaseLogger, firebaseLastUpdate, loggerStrategy); - containerLogger._logMessageToFirebase('message', true); - expect(pushSpy).to.have.been.calledOnce; // jshint ignore:line - expect(pushSpy).to.have.been.calledWith('\x1B[31mmessage\x1B[0m'); // jshint ignore:line - expect(setSpy).to.have.been.calledOnce; // jshint ignore:line + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger._logMessage('message'); + expect(containerLogger.logSize).to.equal(7); }); + it('total log size should be updated in firebase', () => { + + const containerId = 'containerId'; + const containerInterface = {}; + + const loggerStrategy = LoggerStrategy.LOGS; + const logSizeLimit = 1000; + const isWorkflowLogSizeExceeded = sinon.spy(() => { + return false; + }); + + const stepLogger = { + write: sinon.spy(), + setLogSize: sinon.spy() + }; + + const containerLogger = new ContainerLogger({ + containerId, + containerInterface, + stepLogger, + loggerStrategy, + logSizeLimit, + isWorkflowLogSizeExceeded + }); + containerLogger._logMessage('message'); + expect(stepLogger.setLogSize).to.have.been.calledWith(7); + }); }); diff --git a/test/logger.unit.spec.js b/test/logger.unit.spec.js index ed30aebd..4d7348da 100644 --- a/test/logger.unit.spec.js +++ b/test/logger.unit.spec.js @@ -1,5 +1,6 @@ 'use strict'; +const EventEmitter = require('events'); const Q = require('q'); const proxyquire = require('proxyquire').noCallThru(); const chai = require('chai'); @@ -23,90 +24,116 @@ describe('Logger tests', () => { process.exit = processExit; }); + describe('constructor', () => { + + it('should define workflow log size limit default in case of non provided value', () => { + const Logger = proxyquire('../lib/logger', {}); + + const loggerId = 'loggerId'; + const firebaseAuthUrl = 'firebaseAuthUrl'; + const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; + const findExistingContainers = false; + + const logger = new Logger({ + loggerId, + firebaseAuthUrl, + firebaseSecret, + findExistingContainers, + firebaseMetricsLogsUrl + }); + expect(logger.logSizeLimit).to.equal(Logger.WORKFLOW_LOG_SIZE_LIMIT); + }); + + it('should use passed workflow log size limit in case passed', () => { + const Logger = proxyquire('../lib/logger', {}); + + const loggerId = 'loggerId'; + const firebaseAuthUrl = 'firebaseAuthUrl'; + const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; + const findExistingContainers = false; + const logSizeLimit = 5000; + + const logger = new Logger({ + loggerId, + firebaseAuthUrl, + firebaseSecret, + findExistingContainers, + firebaseMetricsLogsUrl, + logSizeLimit + }); + expect(logger.logSizeLimit).to.equal(logSizeLimit); + }); + }); + describe('start', () => { describe('positive', () => { - it('should start and not listen for existing container in case findExistingContainers param is false', () => { - - const authWithCustomTokenSpy = sinon.spy((secret, callback) => { // jshint ignore:line - expect(secret).to.equal('firebaseSecret'); - callback(); + it('should start and not listen for existing container in case findExistingContainers param is false', async () => { // jshint ignore:line + const taskLogger = { // jshint ignore:line + on: sinon.spy(), + restore: sinon.spy(() => Q.resolve()) + }; + const TaskLoggerFactory = sinon.spy(() => { + return Q.resolve(taskLogger); }); const Logger = proxyquire('../lib/logger', { - 'firebase': function (authUrl) { - expect(authUrl).to.equal('firebaseAuthUrl'); - return { - authWithCustomToken: authWithCustomTokenSpy, - child(child) { - if (child === 'logs') { - return { - push: sinon.spy() - }; - } else if (child === 'lastUpdate') { - return { - set: sinon.spy() - }; - } - } - }; - } + '@codefresh-io/task-logger': { TaskLogger: TaskLoggerFactory } }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; + const taskLoggerConfig = {task: {}, opts: {}}; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, + taskLoggerConfig, + findExistingContainers, + }); logger._listenForNewContainers = sinon.spy(); logger._writeNewState = sinon.spy(); logger._listenForExistingContainers = sinon.spy(); logger.start(); + + await Q.delay(10); + expect(TaskLoggerFactory).to.have.been.calledWith(taskLoggerConfig.task, taskLoggerConfig.opts); expect(logger._listenForNewContainers).to.have.been.calledOnce; // jshint ignore:line expect(logger._writeNewState).to.have.been.calledOnce; // jshint ignore:line expect(logger._listenForExistingContainers).to.not.have.been.called; // jshint ignore:line }); - it('should start and listen for existing container in case findExistingContainers param is "true"', () => { + it('should start and listen for existing container in case findExistingContainers param is "true"', async () => { - const authWithCustomTokenSpy = sinon.spy((secret, callback) => { // jshint ignore:line - expect(secret).to.equal('firebaseSecret'); - callback(); + const taskLogger = { + on: sinon.spy(), + restore: sinon.spy(() => Q.resolve()) + }; + const TaskLoggerFactory = sinon.spy(() => { + return Q.resolve(taskLogger); }); const Logger = proxyquire('../lib/logger', { - 'firebase': function (authUrl) { - expect(authUrl).to.equal('firebaseAuthUrl'); - return { - authWithCustomToken: authWithCustomTokenSpy, - child(child) { - if (child === 'logs') { - return { - push: sinon.spy() - }; - } else if (child === 'lastUpdate') { - return { - set: sinon.spy() - }; - } - } - }; - } + '@codefresh-io/task-logger': { TaskLogger: TaskLoggerFactory } }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; + const taskLoggerConfig = {task: {}, opts: {}}; const findExistingContainers = 'true'; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, + taskLoggerConfig, + findExistingContainers + }); logger._listenForNewContainers = sinon.spy(); logger._writeNewState = sinon.spy(); logger._listenForExistingContainers = sinon.spy(); logger.start(); + await Q.delay(10); expect(logger._listenForNewContainers).to.have.been.calledOnce; // jshint ignore:line expect(logger._writeNewState).to.have.been.calledOnce; // jshint ignore:line expect(logger._listenForExistingContainers).to.have.been.calledOnce; // jshint ignore:line @@ -117,46 +144,37 @@ describe('Logger tests', () => { describe('negative', () => { - it('should call process exit in case authentication against firebase failed', (done) => { + it('should call process exit in case creation of task logger failed', (done) => { + let exited = false; const processExitSpy = sinon.spy((exitCode) => { + if (exited) { + return + } else { + exited = true; + } expect(exitCode).to.equal(1); done(); }); process.exit = processExitSpy; - const authWithCustomTokenSpy = sinon.spy((secret, callback) => { // jshint ignore:line - expect(secret).to.equal('firebaseSecret'); - callback(new Error('firebase failure')); + const TaskLoggerFactory = sinon.spy(() => { + return Q.reject(new Error('my error')); }); const Logger = proxyquire('../lib/logger', { - 'firebase': function (authUrl) { - expect(authUrl).to.equal('firebaseAuthUrl'); - return { - authWithCustomToken: authWithCustomTokenSpy, - child(child) { - if (child === 'logs') { - return { - push: sinon.spy() - }; - } else if (child === 'lastUpdate') { - return { - set: sinon.spy() - }; - } - } - }; - } + '@codefresh-io/task-logger': { TaskLogger: TaskLoggerFactory } }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; + const taskLoggerConfig = {task: {}, opts: {}}; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, + taskLoggerConfig, + findExistingContainers, + }); logger.start(); - }); }); @@ -180,7 +198,7 @@ describe('Logger tests', () => { } }); - const logger = new Logger(); + const logger = new Logger({}); logger._handleContainer = sinon.spy(); logger._listenForExistingContainers(); setTimeout(() => { @@ -203,7 +221,7 @@ describe('Logger tests', () => { } }); - const logger = new Logger(); + const logger = new Logger({}); logger._handleContainer = sinon.spy(); logger._listenForExistingContainers(); setTimeout(() => { @@ -230,7 +248,7 @@ describe('Logger tests', () => { } }); - const logger = new Logger(); + const logger = new Logger({}); logger._error = sinon.spy((err) => { expect(err.toString()).to.equal('Error: Query of existing containers failed; caused by Error: getting containers error'); }); @@ -263,7 +281,7 @@ describe('Logger tests', () => { } }); - const logger = new Logger(); + const logger = new Logger({}); logger._listenForNewContainers(); expect(startSpy).to.have.been.calledOnce; // jshint ignore:line expect(onSpy.callCount).to.equal(2); // jshint ignore:line @@ -285,7 +303,7 @@ describe('Logger tests', () => { } }); - const logger = new Logger(); + const logger = new Logger({}); logger._writeNewState(); expect(writeFileSpy).to.have.been.calledOnce; // jshint ignore:line }); @@ -302,7 +320,7 @@ describe('Logger tests', () => { } }); - const logger = new Logger(); + const logger = new Logger({}); logger._writeNewState(); expect(writeFileSpy).to.have.been.calledOnce; // jshint ignore:line }); @@ -317,8 +335,11 @@ describe('Logger tests', () => { const loggerId = 'loggerId'; const firebaseAuthUrl = 'firebaseAuthUrl'; const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers, firebaseMetricsLogsUrl + }); logger.validate(); }); @@ -335,8 +356,11 @@ describe('Logger tests', () => { const loggerId = 'loggerId'; const firebaseAuthUrl = ''; const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers, firebaseMetricsLogsUrl + }); logger.validate(); }); @@ -352,9 +376,12 @@ describe('Logger tests', () => { const loggerId = 'loggerId'; const firebaseAuthUrl = 'firebaseAuthUrl'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; const firebaseSecret = ''; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers, firebaseMetricsLogsUrl + }); logger.validate(); }); @@ -371,13 +398,15 @@ describe('Logger tests', () => { const loggerId = ''; const firebaseAuthUrl = 'firebaseAuthUrl'; const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers, firebaseMetricsLogsUrl + }); logger.validate(); }); - }); describe('handle', () => { @@ -394,6 +423,11 @@ describe('Logger tests', () => { }); const infoSpy = sinon.spy(); const errorSpy = sinon.spy(); + const ContainerLoggerSpy = sinon.spy(() => { + const emitter = new EventEmitter(); + emitter.start = startSpy; + return emitter; + }); const Logger = proxyquire('../lib/logger', { 'cf-logs': { Logger: () => { @@ -404,49 +438,42 @@ describe('Logger tests', () => { } }, - 'firebase': function () { - return {}; - }, - './ContainerLogger': function () { - return { - start: startSpy - }; - } + './ContainerLogger': ContainerLoggerSpy }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + } + }; const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'firebaseUrl', + 'io.codefresh.logger.stepName': 'name', 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' } }; logger._handleContainer(container); - expect(startSpy).to.have.been.calledOnce; // jshint ignore:line setTimeout(() => { + expect(startSpy).to.have.been.calledOnce; // jshint ignore:line expect(logger._writeNewState).to.have.been.calledOnce; // jshint ignore:line done(); }, 10); }); - }); - - describe('should print an error in case firebase ref fails', () => { - - it('error while create firebase logger ref', () => { - const startSpy = sinon.spy(() => { - return Q.resolve(); - }); + it('should pass received step log size limit to ContainerLogger', async () => { const infoSpy = sinon.spy(); const errorSpy = sinon.spy(); const Logger = proxyquire('../lib/logger', { @@ -460,45 +487,40 @@ describe('Logger tests', () => { } }, 'firebase': function () { - throw new Error('firebase error'); - }, - './ContainerLogger': function () { - return { - start: startSpy - }; + return {}; } }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + } + }; const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'firebaseUrl', + 'io.codefresh.logger.stepName': 'name', 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' + 'io.codefresh.logger.logSizeLimit': '20', } }; logger._handleContainer(container); - expect(errorSpy).to.have.been.calledOnce; // jshint ignore:line - expect(errorSpy) - .to - .have - .been - .calledWith('Error: Failed to create a new firebase logger ref; caused by Error: firebase error'); // jshint ignore:line - + await Q.delay(10); + expect(logger.containerLoggers[0].logSizeLimit).to.equal(20000000); }); - it('error while create firebase lastUpdate ref', () => { - const startSpy = sinon.spy(() => { - return Q.resolve(); - }); + it('should pass undefined step log size limit to ContainerLogger in case of no label', async () => { const infoSpy = sinon.spy(); const errorSpy = sinon.spy(); const Logger = proxyquire('../lib/logger', { @@ -510,47 +532,92 @@ describe('Logger tests', () => { }; } - }, - 'firebase': function (url) { - if (url === 'firebaseUrl') { - return; - } else if (url === 'lastUpdateUrl') { - throw new Error('firebase error'); + } + }); + + const loggerId = 'loggerId'; + const findExistingContainers = false; + const logger = new Logger({ + loggerId, findExistingContainers + }); + logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + } + }; + const container = { + Id: 'containerId', + Status: ContainerStatus.CREATE, + Labels: { + 'io.codefresh.logger.id': 'loggerId', + 'io.codefresh.logger.stepName': 'name', + 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, + } + }; + logger._handleContainer(container); + await Q.delay(10); + expect(logger.containerLoggers[0].logSizeLimit).to.equal(undefined); + }); + + it('should update total log size when new log message event was sent', async () => { + const infoSpy = sinon.spy(); + const errorSpy = sinon.spy(); + const Logger = proxyquire('../lib/logger', { + 'cf-logs': { + Logger: () => { + return { + info: infoSpy, + error: errorSpy + }; + } }, - './ContainerLogger': function () { - return { - start: startSpy - }; + 'firebase': function () { + return {}; } }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; + const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'firebaseUrl', + 'io.codefresh.logger.stepName': 'name', 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' } }; logger._handleContainer(container); - expect(errorSpy).to.have.been.calledOnce; // jshint ignore:line - expect(errorSpy) - .to - .have - .been - .calledWith('Error: Failed to create a new firebase lastUpdate ref; caused by Error: firebase error'); // jshint ignore:line - + await Q.delay(10); + expect(logger.logSize).to.equal(0); + logger.containerLoggers[0].logSize = 1000; + logger.containerLoggers[0].emit('message.logged'); + expect(logger.logSize).to.equal(1000); + expect(logger.taskLogger.setLogSize).to.have.been.calledWith(1000); }); + }); + + describe('should print an error in case firebase ref fails', () => { it('error while starting the container logger instance', (done) => { const startSpy = sinon.spy(() => { @@ -572,26 +639,34 @@ describe('Logger tests', () => { return {}; }, './ContainerLogger': function () { - return { - start: startSpy - }; + const emitter = new EventEmitter(); + emitter.start = startSpy; + return emitter; } }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'firebaseUrl', + 'io.codefresh.logger.stepName': 'name', 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' } }; logger._handleContainer(container); @@ -634,8 +709,11 @@ describe('Logger tests', () => { const loggerId = 'loggerId'; const firebaseAuthUrl = 'firebaseAuthUrl'; const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers, firebaseMetricsLogsUrl + }); const container = { Id: 'containerId', Status: 'start', @@ -676,8 +754,11 @@ describe('Logger tests', () => { const loggerId = 'loggerId'; const firebaseAuthUrl = 'firebaseAuthUrl'; const firebaseSecret = 'firebaseSecret'; + const firebaseMetricsLogsUrl = 'firebaseMetricsLogsUrl'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers, firebaseMetricsLogsUrl + }); const container = { Id: 'containerId', Status: ContainerStatus.CREATE, @@ -711,15 +792,14 @@ describe('Logger tests', () => { }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); const container = { Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'firebaseUrl', 'io.codefresh.logger.strategy': LoggerStrategy.LOGS } }; @@ -745,15 +825,14 @@ describe('Logger tests', () => { }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); const container = { Id: 'containerId', Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'firebaseUrl', 'io.codefresh.logger.strategy': LoggerStrategy.LOGS } }; @@ -763,7 +842,7 @@ describe('Logger tests', () => { }); - it('logger id provided but no firebase url', () => { + it('no step name', () => { const infoSpy = sinon.spy(); const errorSpy = sinon.spy(); const Logger = proxyquire('../lib/logger', { @@ -779,56 +858,20 @@ describe('Logger tests', () => { }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); - const container = { - Id: 'containerId', - Status: ContainerStatus.CREATE, - Labels: { - 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.strategy': LoggerStrategy.LOGS - } - }; - logger._handleContainer(container); - expect(errorSpy).to.have.been.calledOnce; // jshint ignore:line - expect(errorSpy).to.have.been.calledWith('Container: containerId does contain a firebaseUrl label'); - - }); - - it('logger id provided but no firebase lastUpdate url', () => { - const infoSpy = sinon.spy(); - const errorSpy = sinon.spy(); - const Logger = proxyquire('../lib/logger', { - 'cf-logs': { - Logger: () => { - return { - info: infoSpy, - error: errorSpy - }; - - } - } + const logger = new Logger({ + loggerId, findExistingContainers }); - - const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; - const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'logsUrl', - 'io.codefresh.logger.strategy': LoggerStrategy.LOGS } }; logger._handleContainer(container); expect(errorSpy).to.have.been.calledOnce; // jshint ignore:line - expect(errorSpy).to.have.been.calledWith('Container: containerId does contain a loggerFirebaseLastUpdateUrl label'); + expect(errorSpy).to.have.been.calledWith('Container: containerId does not contain a stepName label'); }); @@ -848,22 +891,21 @@ describe('Logger tests', () => { }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'loggerFirebaseUrl', - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' + 'io.codefresh.logger.stepName': 'name', } }; logger._handleContainer(container); expect(errorSpy).to.have.been.calledOnce; // jshint ignore:line - expect(errorSpy).to.have.been.calledWith('Container: containerId does contain a loggerStrategy label'); + expect(errorSpy).to.have.been.calledWith('Container: containerId does not contain a loggerStrategy label'); }); @@ -883,18 +925,17 @@ describe('Logger tests', () => { }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'loggerFirebaseUrl', + 'io.codefresh.logger.stepName': 'name', 'io.codefresh.logger.strategy': 'non-existing-strategy', - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' } }; logger._handleContainer(container); @@ -919,18 +960,17 @@ describe('Logger tests', () => { }); const loggerId = 'loggerId'; - const firebaseAuthUrl = 'firebaseAuthUrl'; - const firebaseSecret = 'firebaseSecret'; const findExistingContainers = false; - const logger = new Logger(loggerId, firebaseAuthUrl, firebaseSecret, findExistingContainers); + const logger = new Logger({ + loggerId, findExistingContainers + }); const container = { Id: 'containerId', Status: ContainerStatus.CREATE, Labels: { 'io.codefresh.logger.id': 'loggerId', - 'io.codefresh.logger.firebase.logsUrl': 'loggerFirebaseUrl', + 'io.codefresh.logger.stepName': 'name', 'io.codefresh.logger.strategy': LoggerStrategy.LOGS, - 'io.codefresh.logger.firebase.lastUpdateUrl': 'lastUpdateUrl' } }; logger._handleContainer(container); @@ -948,4 +988,265 @@ describe('Logger tests', () => { }); + describe('log limit exceeded', () => { + + it('should return true in case log limit exceeded', async () => { + const infoSpy = sinon.spy(); + const errorSpy = sinon.spy(); + const Logger = proxyquire('../lib/logger', { + 'cf-logs': { + Logger: () => { + return { + info: infoSpy, + error: errorSpy + }; + + } + } + }); + + const loggerId = 'loggerId'; + const findExistingContainers = false; + const logger = new Logger({ + loggerId, findExistingContainers + }); + logger._writeNewState = sinon.spy(); + + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; + + const container = { + Id: 'containerId', + Status: ContainerStatus.CREATE, + Labels: { + 'io.codefresh.logger.id': 'loggerId', + 'io.codefresh.logger.stepName': 'name', + 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, + } + }; + logger.logSizeLimit = 100; + logger._handleContainer(container); + await Q.delay(10); + logger.containerLoggers[0].logSize = logger.logSizeLimit + 1; + expect(logger.logLimitExceeded()).to.equal(true); + }); + + it('should return false in case log limit not exceeded', async () => { + const infoSpy = sinon.spy(); + const errorSpy = sinon.spy(); + const Logger = proxyquire('../lib/logger', { + 'cf-logs': { + Logger: () => { + return { + info: infoSpy, + error: errorSpy + }; + + } + } + }); + + const loggerId = 'loggerId'; + const findExistingContainers = false; + const logger = new Logger({ + loggerId, findExistingContainers + }); + logger._writeNewState = sinon.spy(); + const setSpy = sinon.spy(); + logger.firebaseMetricsLogs = { + child: () => { + return { + set: setSpy + }; + } + }; + + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; + + const container = { + Id: 'containerId', + Status: ContainerStatus.CREATE, + Labels: { + 'io.codefresh.logger.id': 'loggerId', + 'io.codefresh.logger.stepName': 'name', + 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, + } + }; + logger.logSizeLimit = 11; + logger._handleContainer(container); + await Q.delay(10); + logger.containerLoggers[0].logSize = 10; + expect(logger.logLimitExceeded()).to.equal(false); + }); + + it('should return false in case log limit was not defined', async () => { + const infoSpy = sinon.spy(); + const errorSpy = sinon.spy(); + const Logger = proxyquire('../lib/logger', { + 'cf-logs': { + Logger: () => { + return { + info: infoSpy, + error: errorSpy + }; + + } + } + }); + + const loggerId = 'loggerId'; + const findExistingContainers = false; + const logger = new Logger({ + loggerId, findExistingContainers + }); + logger._writeNewState = sinon.spy(); + + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; + + const container = { + Id: 'containerId', + Status: ContainerStatus.CREATE, + Labels: { + 'io.codefresh.logger.id': 'loggerId', + 'io.codefresh.logger.stepName': 'name', + 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, + } + }; + logger._handleContainer(container); + await Q.delay(10); + logger.containerLoggers[0].logSize = 10; + expect(logger.logLimitExceeded()).to.equal(undefined); + }); + + }); + + describe('total log size', () => { + + it('should return true in case log limit exceeded for one container logger', async () => { + const infoSpy = sinon.spy(); + const errorSpy = sinon.spy(); + const Logger = proxyquire('../lib/logger', { + 'cf-logs': { + Logger: () => { + return { + info: infoSpy, + error: errorSpy + }; + + } + } + }); + + const loggerId = 'loggerId'; + const findExistingContainers = false; + const logger = new Logger({ + loggerId, findExistingContainers + }); + logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; + + const container = { + Id: 'containerId', + Status: ContainerStatus.CREATE, + Labels: { + 'io.codefresh.logger.id': 'loggerId', + 'io.codefresh.logger.stepName': 'name', + 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, + } + }; + logger._handleContainer(container); + await Q.delay(10); + logger.containerLoggers[0].logSize = 1000; + expect(logger._getTotalLogSize()).to.equal(1000); + }); + + it('should return true in case log limit exceeded for two container loggers', async () => { + const infoSpy = sinon.spy(); + const errorSpy = sinon.spy(); + const ContainerLoggerSpy = sinon.spy(() => { + const emitter = new EventEmitter(); + emitter.start = sinon.spy(() => Q.resolve()); + return emitter; + }); + const Logger = proxyquire('../lib/logger', { + 'cf-logs': { + Logger: () => { + return { + info: infoSpy, + error: errorSpy + }; + + } + }, + './ContainerLogger': ContainerLoggerSpy + }); + + const loggerId = 'loggerId'; + const findExistingContainers = false; + const logger = new Logger({ + loggerId, findExistingContainers + }); + logger._writeNewState = sinon.spy(); + logger.taskLogger = { + on: sinon.spy(), + create: function () { + return { + restore: sinon.spy(() => Q.resolve()) + } + }, + setLogSize: sinon.spy() + }; + + const container = { + Id: 'containerId', + Status: ContainerStatus.CREATE, + Labels: { + 'io.codefresh.logger.id': 'loggerId', + 'io.codefresh.logger.stepName': 'name', + 'io.codefresh.logger.strategy': LoggerStrategy.ATTACH, + } + }; + logger._handleContainer(container); + container.Id = 'newid'; + logger._handleContainer(container); + await Q.delay(10); + logger.containerLoggers[0].logSize = 1000; + logger.containerLoggers[1].logSize = 1000; + expect(logger._getTotalLogSize()).to.equal(2000); + }); + + }); + + }); diff --git a/yarn.lock b/yarn.lock index 1db46974..8a29efc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,52 @@ # yarn lockfile v1 +"@codefresh-io/task-logger@^0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@codefresh-io/task-logger/-/task-logger-0.0.11.tgz#cb439a6555a9499bb5a2dcd6a2b4408fe8c82b34" + integrity sha512-P5x/6fXTPcIziiGxaK2x00c8s/azOq/q2do3Mnviily7YmxsZwXPbHr35IxVhPXSST7RYZ8Phg5t1CpzkIlMzw== + dependencies: + cf-errors "^0.1.11" + crypto "0.0.3" + debug "^4.1.1" + firebase "git+https://github.com/codefresh-io/firebase.git#80b2ed883ff281cd67b53bd0f6a0bbd6f330fed5" + jsonwebtoken "^8.4.0" + lodash "^3.10.1" + mongodb "^3.1.13" + node-redis-pubsub "^4.0.0" + q "^1.4.1" + redis "^2.8.0" + request "^2.88.0" + retry "^0.12.0" + +"@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849" + integrity sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.1.0.tgz#6ac9d1eb1821984d84c4996726e45d1646d8cce5" + integrity sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg== + dependencies: + "@sinonjs/samsam" "^2 || ^3" + +"@sinonjs/samsam@^2 || ^3", "@sinonjs/samsam@^3.1.1": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.2.0.tgz#58c62b5f1f42e46d039d073d0ae2753da676bf0c" + integrity sha512-j5F1rScewLtx6pbTK0UAjA3jJj4RYiSKOix53YWv+Jzy/AZ69qHxUpU8fwVLjyKbEEud9QrLpv6Ggs7WqTimYw== + dependencies: + "@sinonjs/commons" "^1.0.2" + array-from "^2.1.1" + lodash "^4.17.11" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + JSONStream@0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.10.0.tgz#74349d0d89522b71f30f0a03ff9bd20ca6f12ac0" @@ -13,12 +59,15 @@ abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +ajv@^6.5.5: + version "6.9.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.2.tgz#4927adb83e7f48e5a32b45729744c71ec39c9c7b" + integrity sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" @@ -32,6 +81,12 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-colors@^1.0.1: + version "1.1.0" + resolved "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + dependencies: + ansi-wrap "^0.1.0" + ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" @@ -40,6 +95,11 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" @@ -52,24 +112,31 @@ ansi-styles@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" +ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" aproba@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -86,10 +153,18 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -102,6 +177,11 @@ array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + array-slice@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" @@ -114,6 +194,11 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -126,17 +211,29 @@ assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= -async@0.2.9, async@0.2.x, async@~0.2.9: +async@0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/async/-/async-0.2.9.tgz#df63060fbf3d33286a76aaf6d55a2986d9ff8619" + integrity sha1-32MGD789Myhqdqr21Vophtn/hhk= + +async@0.2.x, async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= async@1.x, async@~1.0.0: version "1.0.0" @@ -156,14 +253,29 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -282,6 +394,19 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -293,8 +418,9 @@ beeper@^1.0.0: resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== bl@^1.0.0: version "1.2.1" @@ -308,12 +434,6 @@ bl@~1.0.0: dependencies: readable-stream "~2.0.5" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -335,9 +455,26 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + broadway@~0.3.2, broadway@~0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/broadway/-/broadway-0.3.6.tgz#7dbef068b954b7907925fd544963b578a902ba7a" + integrity sha1-fb7waLlUt5B5Jf1USWO1eKkCuno= dependencies: cliff "0.1.9" eventemitter2 "0.4.14" @@ -345,13 +482,43 @@ broadway@~0.3.2, broadway@~0.3.6: utile "0.2.1" winston "0.8.0" +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + +bson@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.1.tgz#4330f5e99104c4e751e7351859e2d408279f2f13" + integrity sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + caller@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/caller/-/caller-0.0.1.tgz#f37a1d6ea10e829d94721ae29a90bb4fb52ab767" + integrity sha1-83odbqEOgp2UchrimpC7T7Uqt2c= dependencies: tape "~2.3.2" @@ -391,21 +558,27 @@ cf-errors@^0.1.11: dependencies: lodash "4.15.0" -"cf-logs@git+https://github.com/codefresh-io/cf-logs.git#ceba4f309e52a077747a0c6bf9c3ad02e762dc4b": - version "0.0.3" - resolved "git+https://github.com/codefresh-io/cf-logs.git#ceba4f309e52a077747a0c6bf9c3ad02e762dc4b" +cf-logs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cf-logs/-/cf-logs-1.1.0.tgz#2ea2dae43c71a2a06579b82a287a4d91a86db3f5" + integrity sha512-dUcIw2K6PjHouhaiTbJTSN2iPoja+diS0vTcv3+ENcq9o1Ow2AziYAWqYW0MtUJxrdKDiowyZxIQvJ54cCBPTA== dependencies: lodash "^3.10.1" + q "^1.5.1" winston "2.1.1" winston-loggly "1.2.0" -chai@^3.0.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" +chai@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" chalk@*, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -435,9 +608,15 @@ chalk@~0.4.0: has-color "~0.1.0" strip-ansi "~0.1.0" +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + chokidar@^1.0.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -450,9 +629,25 @@ chokidar@^1.0.1: optionalDependencies: fsevents "^1.0.0" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + clarinet@~0.7.0: version "0.7.3" resolved "https://registry.yarnpkg.com/clarinet/-/clarinet-0.7.3.tgz#3512ffcac21a693b2ab778809e592403e76862b0" + integrity sha1-NRL/ysIaaTsqt3iAnlkkA+doYrA= + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" cli@~1.0.0: version "1.0.1" @@ -464,6 +659,7 @@ cli@~1.0.0: cliff@0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/cliff/-/cliff-0.1.9.tgz#a211e09c6a3de3ba1af27d049d301250d18812bc" + integrity sha1-ohHgnGo947oa8n0EnTASUNGIErw= dependencies: colors "0.x.x" eyes "0.1.x" @@ -472,6 +668,7 @@ cliff@0.1.9: cliff@~0.1.9: version "0.1.10" resolved "https://registry.yarnpkg.com/cliff/-/cliff-0.1.10.tgz#53be33ea9f59bec85609ee300ac4207603e52013" + integrity sha1-U74z6p9ZvshWCe4wCsQgdgPlIBM= dependencies: colors "~1.0.3" eyes "~0.1.8" @@ -492,15 +689,12 @@ clone-stats@^0.0.1, clone-stats@~0.0.1: clone@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= clone@^1.0.0, clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - co@~3.0.2: version "3.0.6" resolved "https://registry.yarnpkg.com/co/-/co-3.0.6.tgz#1445f226c5eb956138e68c9ac30167ea7d2e6bda" @@ -508,18 +702,29 @@ co@~3.0.2: code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" colors@0.6.x, colors@0.x.x, colors@~0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= colors@1.0.x, colors@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" colors@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" @@ -527,6 +732,13 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + commander@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" @@ -535,10 +747,19 @@ commander@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" +commander@2.15.1: + version "2.15.1" + resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + commander@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -560,11 +781,17 @@ console-browserify@1.1.x: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + core-js@^2.4.0, core-js@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" @@ -583,12 +810,27 @@ coveralls@^2.11.2: minimist "1.2.0" request "2.79.0" +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" dependencies: boom "2.x.x" +crypto@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/crypto/-/crypto-0.0.3.tgz#470a81b86be4c5ee17acc8207a1f5315ae20dbb0" + integrity sha1-RwqBuGvkxe4XrMggeh9TFa4g27A= + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -599,6 +841,10 @@ cycle@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" +dargs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -620,33 +866,62 @@ dateformat@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" -debug@*, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: +debug@*, debug@^2.6.0, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-eql@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: - type-detect "0.1.1" + type-detect "^4.0.0" deep-equal@*: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= deep-equal@~0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce" + integrity sha1-skbCuApXCkfBG+HZvRBw7IeLh84= -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.2, deep-is@~0.1.3: version "0.1.3" @@ -655,12 +930,36 @@ deep-is@~0.1.2, deep-is@~0.1.3: defaults@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + defined@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + integrity sha1-817qfXBekzuvE7LwOz+D2SFAOz4= delayed-stream@~1.0.0: version "1.0.0" @@ -669,16 +968,17 @@ delayed-stream@~1.0.0: delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= deprecated@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - dependencies: - fs-exists-sync "^0.1.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" @@ -686,17 +986,28 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + diff@1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/diff/-/diff-1.0.7.tgz#24bbb001c4a7d5522169e7cabdb2c2814ed91cf4" +diff@3.5.0, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + director@1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/director/-/director-1.2.7.tgz#bfd3741075fd7fb1a5b2e13658c5f4bec77736f3" + integrity sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM= docker-events@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/docker-events/-/docker-events-0.0.2.tgz#c001f998f5bccb2d92d7b6c5c0f7f9b8d4001e90" + integrity sha1-wAH5mPW8yy2S17bFwPf5uNQAHpA= dependencies: jsuck "0.0.4" @@ -745,6 +1056,11 @@ domutils@1.5: dom-serializer "0" domelementtype "1" +double-ended-queue@^2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= + duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -757,6 +1073,13 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" @@ -766,6 +1089,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: end-of-stream@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= dependencies: once "~1.3.0" @@ -783,7 +1107,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -832,12 +1156,26 @@ esutils@^2.0.2: event-stream@~0.5: version "0.5.3" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-0.5.3.tgz#b77b9309f7107addfeab63f0c0eafd8db0bd8c1c" + integrity sha1-t3uTCfcQet3+q2PwwOr9jbC9jBw= dependencies: optimist "0.2" eventemitter2@0.4.14, eventemitter2@~0.4.14: version "0.4.14" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" + integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" exit@0.1.2, exit@0.1.x: version "0.1.2" @@ -849,34 +1187,74 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - dependencies: - os-homedir "^1.0.1" - -expand-tilde@^2.0.2: +expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" dependencies: homedir-polyfill "^1.0.1" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@^3.0.0, extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -892,6 +1270,16 @@ fancy-log@^1.1.0: chalk "^1.1.1" time-stamp "^1.0.0" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + fast-levenshtein@~1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" @@ -903,6 +1291,7 @@ fast-levenshtein@~2.0.4: faye-websocket@>=0.6.0: version "0.11.1" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= dependencies: websocket-driver ">=0.5.1" @@ -934,9 +1323,20 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= find-up@^1.0.0: version "1.1.2" @@ -945,14 +1345,15 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" fined@^1.0.1: version "1.1.0" @@ -973,21 +1374,24 @@ fined@^1.0.1: first-chunk-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== flatiron@~0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/flatiron/-/flatiron-0.4.3.tgz#248cf79a3da7d7dc379e2a11c92a2719cbb540f6" + integrity sha1-JIz3mj2n19w3nioRySonGcu1QPY= dependencies: broadway "~0.3.2" director "1.2.7" optimist "0.6.0" prompt "0.2.14" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1010,6 +1414,7 @@ forever-agent@~0.6.1: forever-monitor@~1.7.0: version "1.7.1" resolved "https://registry.yarnpkg.com/forever-monitor/-/forever-monitor-1.7.1.tgz#5d820f4a3a78db2d81ae2671f158b9e86a091bb8" + integrity sha1-XYIPSjp42y2BriZx8Vi56GoJG7g= dependencies: broadway "~0.3.6" chokidar "^1.0.1" @@ -1020,6 +1425,7 @@ forever-monitor@~1.7.0: forever@^0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/forever/-/forever-0.15.3.tgz#77d9d7e15fd2f511ad9d84a110c7dd8fc8ecebc2" + integrity sha1-d9nX4V/S9RGtnYShEMfdj8js68I= dependencies: cliff "~0.1.9" clone "^1.0.2" @@ -1053,47 +1459,45 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -formatio@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: - samsam "~1.1" + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.36" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + nan "^2.9.2" + node-pre-gyp "^0.10.0" gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1107,6 +1511,7 @@ gauge@~2.7.3: gaze@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= dependencies: globule "~0.1.0" @@ -1120,10 +1525,24 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^3.0.0: + version "3.0.0" + resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1146,6 +1565,7 @@ glob-parent@^2.0.0: glob-stream@^3.1.5: version "3.1.18" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= dependencies: glob "^4.3.1" glob2base "^0.0.12" @@ -1157,12 +1577,14 @@ glob-stream@^3.1.5: glob-watcher@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= dependencies: gaze "^0.5.1" glob2base@^0.0.12: version "0.0.12" resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= dependencies: find-index "^0.1.1" @@ -1184,18 +1606,31 @@ glob@5.x, glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.1.2, glob@^7.0.5, glob@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + 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" + glob@^4.3.1: version "4.5.3" resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= dependencies: inflight "^1.0.4" inherits "2" minimatch "^2.0.1" once "^1.3.0" -glob@^7.0.5, glob@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1207,26 +1642,31 @@ glob@^7.0.5, glob@^7.1.1: glob@~3.1.21: version "3.1.21" resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= dependencies: graceful-fs "~1.2.0" inherits "1" minimatch "~0.2.11" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: - homedir-polyfill "^1.0.0" + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" + is-windows "^1.0.1" + which "^1.2.14" globals@^9.18.0: version "9.18.0" @@ -1235,6 +1675,7 @@ globals@^9.18.0: globule@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= dependencies: glob "~3.1.21" lodash "~1.0.1" @@ -1249,9 +1690,15 @@ glogg@^1.0.0: graceful-fs@^3.0.0: version "3.0.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg= dependencies: natives "^1.1.0" +graceful-fs@^4.1.11: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1259,11 +1706,16 @@ graceful-fs@^4.1.2: graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= graceful-fs@~2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + growl@1.7.x: version "1.7.0" resolved "https://registry.yarnpkg.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da" @@ -1309,6 +1761,18 @@ gulp-mocha-co@^0.4.1-co.3: mocha-co "^1.17.1-co.1" through2 "~0.4.0" +gulp-mocha@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-6.0.0.tgz#80f32bc705ce30747f355ddb8ccd96a1c73bef13" + dependencies: + dargs "^5.1.0" + execa "^0.10.0" + mocha "^5.2.0" + npm-run-path "^2.0.2" + plugin-error "^1.0.1" + supports-color "^5.4.0" + through2 "^2.0.3" + gulp-rimraf@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/gulp-rimraf/-/gulp-rimraf-0.1.1.tgz#5aaba8f870559ca4885c044385f9926c0f863f10" @@ -1356,6 +1820,7 @@ gulp-util@~2.2.0: gulp@^3.9.1: version "3.9.1" resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= dependencies: archy "^1.0.0" chalk "^1.0.0" @@ -1387,9 +1852,10 @@ handlebars@^4.0.1: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~2.0.2, har-validator@~2.0.6: version "2.0.6" @@ -1400,12 +1866,13 @@ har-validator@~2.0.2, har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" + ajv "^6.5.5" + har-schema "^2.0.0" has-ansi@^0.1.0: version "0.1.0" @@ -1427,6 +1894,10 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -1436,6 +1907,38 @@ has-gulplog@^0.1.0: has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" hawk@~3.1.0, hawk@~3.1.3: version "3.1.3" @@ -1446,6 +1949,10 @@ hawk@~3.1.0, hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -1457,7 +1964,7 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: @@ -1477,6 +1984,11 @@ htmlparser2@3.8.x: entities "1.0" readable-stream "1.1" +http-parser-js@>=0.4.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" + integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -1485,9 +1997,33 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + i@0.3.x: - version "0.3.5" - resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" + version "0.3.6" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" + integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" indent-string@^2.1.0: version "2.1.0" @@ -1505,22 +2041,25 @@ inflight@^1.0.4: inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" +ini@1.x.x, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -ini@1.x.x, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== invariant@^2.2.2: version "2.2.2" @@ -1535,13 +2074,28 @@ is-absolute@^0.2.3: is-relative "^0.2.1" is-windows "^0.2.0" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" @@ -1555,6 +2109,38 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -1565,14 +2151,25 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -1582,15 +2179,28 @@ is-finite@^1.0.0: is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + is-my-json-valid@^2.12.4: version "2.16.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" @@ -1616,7 +2226,7 @@ is-object@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" -is-plain-object@^2.0.3: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" dependencies: @@ -1640,6 +2250,10 @@ is-relative@^0.2.1: dependencies: is-unc-path "^0.1.1" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1658,6 +2272,11 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -1782,16 +2401,15 @@ jshint@^2.7.0: shelljs "0.3.x" strip-json-comments "1.0.x" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@5.0.x, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -1803,6 +2421,7 @@ json5@^0.5.1: jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsonparse@0.0.5: version "0.0.5" @@ -1812,6 +2431,22 @@ jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" +jsonwebtoken@^8.4.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#ebd0ca2a69797816e1c5af65b6c759787252947e" + integrity sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA== + dependencies: + jws "^3.2.1" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -1824,10 +2459,33 @@ jsprim@^1.2.2: jsuck@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/jsuck/-/jsuck-0.0.4.tgz#e0f4071f7809e72682d1ecd39292739c78d15f15" + integrity sha1-4PQHH3gJ5yaC0ezTkpJznHjRXxU= dependencies: clarinet "~0.7.0" -kind-of@^3.0.2: +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + +jwa@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.3.0.tgz#061a7c3bb8ab2b3434bb2f432005a8bb7fca0efa" + integrity sha512-SxObIyzv9a6MYuZYaSN6DhSm9j3+qkokwvCB0/OTSV5ylPq1wUQiygZQcHT5Qlux0I5kmISx3J86TxKhuefItg== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.1.tgz#d79d4216a62c9afa0a3d5e8b5356d75abdeb2be5" + integrity sha512-bGA2omSrFUkd72dhh05bIAN832znP4wOU3lfuXtRBuGTbsmNmDXMQg28f0Vsxaxgk4myF5YkKQpz6qeRpMgX9g== + dependencies: + jwa "^1.2.0" + safe-buffer "^5.0.1" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -1839,6 +2497,16 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -1846,6 +2514,7 @@ lazy-cache@^1.0.3: lazy@~1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" + integrity sha1-2qBoIGKCVCwIgojpdcKXwa53tpA= lcov-parse@0.0.10: version "0.0.10" @@ -1866,16 +2535,16 @@ levn@~0.3.0: type-check "~0.3.2" liftoff@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= dependencies: extend "^3.0.0" - findup-sync "^0.4.2" + findup-sync "^2.0.0" fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" rechoir "^0.6.2" resolve "^1.1.7" @@ -1989,6 +2658,11 @@ lodash.escape@~2.4.1: lodash._reunescapedhtml "~2.4.1" lodash.keys "~2.4.1" +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -1997,13 +2671,28 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + lodash.isobject@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" dependencies: lodash._objecttypes "~2.4.1" -lodash.isplainobject@^4.0.4: +lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -2027,9 +2716,10 @@ lodash.keys@~2.4.1: lodash._shimkeys "~2.4.1" lodash.isobject "~2.4.1" -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= lodash.restparam@^3.0.0: version "3.6.1" @@ -2101,9 +2791,15 @@ lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + lodash@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= lodash@~2.4.1: version "2.4.2" @@ -2121,9 +2817,15 @@ loggly@1.0.x: request "2.67.x" timespan "2.3.x" -lolex@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" +lolex@^2.3.2: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== + +lolex@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.1.0.tgz#1a7feb2fefd75b3e3a7f79f0e110d9476e294434" + integrity sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw== longest@^1.0.1: version "1.0.1" @@ -2146,7 +2848,14 @@ lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" -map-cache@^0.2.0: +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -2154,6 +2863,18 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -2173,7 +2894,7 @@ merge-descriptors@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" -micromatch@^2.1.5, micromatch@^2.3.7: +micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -2191,17 +2912,48 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.0.4, micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + mime-db@~1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" +mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== + mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: version "2.1.16" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" dependencies: mime-db "~1.29.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +mime-types@~2.1.19: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + dependencies: + mime-db "~1.38.0" + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -2236,6 +2988,29 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" @@ -2244,7 +3019,7 @@ mkdirp@0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" -mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2263,14 +3038,54 @@ mocha-co@^1.17.1-co.1: jade "0.26.3" mkdirp "0.3.5" +mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + module-not-found-error@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" +mongodb-core@3.1.11: + version "3.1.11" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.1.11.tgz#b253038dbb4d7329f3d1c2ee5400bb0c9221fde5" + integrity sha512-rD2US2s5qk/ckbiiGFHeu+yKYDXdJ1G87F6CG3YdaZpzdOm5zpoAZd/EKbPmFO6cQZ+XVXBXBJ660sSI0gc6qg== + dependencies: + bson "^1.1.0" + require_optional "^1.0.1" + safe-buffer "^5.1.2" + optionalDependencies: + saslprep "^1.0.0" + +mongodb@^3.1.13: + version "3.1.13" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.1.13.tgz#f8cdcbb36ad7a08b570bd1271c8525753f75f9f4" + integrity sha512-sz2dhvBZQWf3LRNDhbd30KHVzdjZx9IKC0L+kSZ/gzYquCF5zPOgGqRz6sSCqYZtKP2ekB4nfLxhGtzGHnIKxA== + dependencies: + mongodb-core "3.1.11" + safe-buffer "^5.1.2" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + multipipe@^0.1.0, multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" @@ -2278,20 +3093,41 @@ multipipe@^0.1.0, multipipe@^0.1.2: duplexer2 "0.0.2" mute-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -nan@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" natives@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== nconf@0.6.9, nconf@~0.6.9: version "0.6.9" resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.6.9.tgz#9570ef15ed6f9ae6b2b3c8d5e71b66d3193cd661" + integrity sha1-lXDvFe1vmuays8jV5xtm0xk81mE= dependencies: async "0.2.9" ini "1.x.x" @@ -2300,20 +3136,54 @@ nconf@0.6.9, nconf@~0.6.9: ncp@0.4.x: version "0.4.2" resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" + integrity sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ= + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" -node-pre-gyp@^0.6.36: - version "0.6.36" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" +nise@^1.4.10: + version "1.4.10" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" + integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== dependencies: + "@sinonjs/formatio" "^3.1.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^2.3.2" + path-to-regexp "^1.7.0" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" mkdirp "^0.5.1" + needle "^2.2.1" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "^2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" + +node-redis-pubsub@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/node-redis-pubsub/-/node-redis-pubsub-4.0.0.tgz#1d067ed22ce01cdc5e8cde3aaa826c46b65c9968" + integrity sha512-sAUOzisio/8UYCRbjPo6+u7aTpBmxSBjTJYwu49x9KruIQgi//wbEnvbqGSH5JWViP7HyQSMtkHUcZXH7qGsOQ== + dependencies: + redis "^2.7.1" node-uuid@~1.4.7: version "1.4.8" @@ -2335,6 +3205,7 @@ nopt@3.x: nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -2354,9 +3225,29 @@ normalize-path@^2.0.0, normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0, npm-run-path@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -2366,6 +3257,7 @@ npmlog@^4.0.2: nssocket@~0.5.1: version "0.5.3" resolved "https://registry.yarnpkg.com/nssocket/-/nssocket-0.5.3.tgz#883ca2ec605f5ed64a4d5190b2625401928f8f8d" + integrity sha1-iDyi7GBfXtZKTVGQsmJUAZKPj40= dependencies: eventemitter2 "~0.4.14" lazy "~1.0.11" @@ -2378,6 +3270,11 @@ oauth-sign@~0.8.0, oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" @@ -2386,10 +3283,26 @@ object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" @@ -2399,6 +3312,14 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -2406,13 +3327,13 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.pick@^1.2.0: +object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: isobject "^3.0.1" -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -2421,18 +3342,21 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: once@~1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= dependencies: wrappy "1" optimist@0.2: version "0.2.8" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.2.8.tgz#e981ab7e268b457948593b55674c099a815cac31" + integrity sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE= dependencies: wordwrap ">=0.0.1 <0.1.0" optimist@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.0.tgz#69424826f3405f79f142e6fc3d9ae58d4dbb9200" + integrity sha1-aUJIJvNAX3nxQub8PZrljU27kgA= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -2469,6 +3393,7 @@ optionator@^0.8.1: orchestrator@^0.3.0: version "0.3.8" resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= dependencies: end-of-stream "~0.1.5" sequencify "~0.0.7" @@ -2477,8 +3402,9 @@ orchestrator@^0.3.0: ordered-read-streams@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -2487,12 +3413,17 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + parse-filepath@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" @@ -2520,6 +3451,11 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -2530,6 +3466,10 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -2540,6 +3480,13 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -2548,9 +3495,15 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" @@ -2566,10 +3519,29 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkginfo@0.3.x, pkginfo@0.x.x: +pkginfo@0.3.x: version "0.3.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" +pkginfo@0.x.x: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -2585,6 +3557,7 @@ pretty-hrtime@^1.0.0: prettyjson@^1.1.2: version "1.2.1" resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + integrity sha1-/P+rQdGcq0365eV15kJGYZsS0ok= dependencies: colors "^1.1.2" minimist "^1.2.0" @@ -2597,9 +3570,14 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + prompt@0.2.14: version "0.2.14" resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc" + integrity sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w= dependencies: pkginfo "0.x.x" read "1.0.x" @@ -2618,9 +3596,15 @@ proxyquire@^1.7.4: ps-tree@0.0.x: version "0.0.3" resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-0.0.3.tgz#dbf8d752a7fe22fa7d58635689499610e9276ddc" + integrity sha1-2/jXUqf+Ivp9WGNWiUmWEOknbdw= dependencies: event-stream "~0.5" +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + pump@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" @@ -2632,10 +3616,20 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + q@^1.4.1: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" @@ -2644,9 +3638,10 @@ qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== randomatic@^1.1.3: version "1.1.7" @@ -2655,11 +3650,12 @@ randomatic@^1.1.3: is-number "^3.0.0" kind-of "^4.0.0" -rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -2695,6 +3691,7 @@ read-pkg@^1.0.0: read@1.0.x: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" @@ -2716,7 +3713,7 @@ readable-stream@1.1, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1 isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5: +readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.1.5: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -2728,6 +3725,18 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + 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" + readable-stream@~2.0.0, readable-stream@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -2740,13 +3749,13 @@ readable-stream@~2.0.0, readable-stream@~2.0.5: util-deprecate "~1.0.1" readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" rechoir@^0.6.2: version "0.6.2" @@ -2761,6 +3770,25 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redis-commands@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz#52f9cf99153efcce56a8f86af986bd04e988602f" + integrity sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw== + +redis-parser@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" + integrity sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs= + +redis@^2.7.1, redis@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" + integrity sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A== + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.6.0" + regenerator-runtime@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" @@ -2772,6 +3800,14 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -2780,7 +3816,7 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -2844,39 +3880,57 @@ request@2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -request@^2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" +request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" + aws-sign2 "~0.7.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.0.0" + uuid "^3.3.2" -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" +require_optional@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" + resolve-from "^2.0.0" + semver "^5.1.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@~1.1.7: version "1.1.7" @@ -2885,12 +3939,24 @@ resolve@1.1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@~1.1.7: resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= dependencies: through "~2.3.4" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + revalidator@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= right-align@^0.1.1: version "0.1.3" @@ -2898,7 +3964,14 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@2.x.x, rimraf@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -2915,29 +3988,87 @@ safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -samsam@1.1.2, samsam@~1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" +safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -"semver@2 || 3 || 4 || 5", semver@^5.3.0: +saslprep@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.2.tgz#da5ab936e6ea0bbae911ffec77534be370c9f52d" + integrity sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw== + dependencies: + sparse-bitfield "^3.0.3" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5": version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= + +semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" sequencify@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" shelljs@0.3.x: version "0.3.0" @@ -2950,6 +4081,7 @@ shelljs@^0.6.0: shush@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shush/-/shush-1.0.0.tgz#c27415a9e458f2fed39b27cf8eb37c003782b431" + integrity sha1-wnQVqeRY8v7TmyfPjrN8ADeCtDE= dependencies: caller "~0.0.1" strip-json-comments "~0.1.1" @@ -2962,35 +4094,86 @@ signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -sinon-chai@^2.8.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.13.0.tgz#b9a42e801c20234bfc2f43b29e6f4f61b60990c4" +sinon-chai@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.3.0.tgz#8084ff99451064910fbe2c2cb8ab540c00b740ea" + integrity sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA== -sinon@^1.17.4: - version "1.17.7" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" +sinon@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.2.4.tgz#d834b9a38d8533b4ca3274a9a9ffa8e54c95d10c" + integrity sha512-FGlcfrkiBRfaEIKRw8s/9mk4nP4AMGswvKFixLo+AzsOhskjaBCHAHGLMd8pCJpQGS+9ZI71px6qoQUyvADeyA== dependencies: - formatio "1.1.1" - lolex "1.3.2" - samsam "1.1.2" - util ">=0.10.3 <1" + "@sinonjs/commons" "^1.3.0" + "@sinonjs/formatio" "^3.1.0" + "@sinonjs/samsam" "^3.1.1" + diff "^3.5.0" + lolex "^3.1.0" + nise "^1.4.10" + supports-color "^5.5.0" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@^0.4.15: version "0.4.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.16.tgz#16fecf98212467d017d586a2af68d628b9421cd8" dependencies: source-map "^0.5.6" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -3011,6 +4194,13 @@ sparkles@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= + dependencies: + memory-pager "^1.0.2" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -3029,6 +4219,13 @@ split-ca@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -3051,18 +4248,36 @@ stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + stream-consume@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -3073,6 +4288,12 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3089,6 +4310,13 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" @@ -3096,6 +4324,7 @@ strip-ansi@~0.1.0: strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= dependencies: first-chunk-stream "^1.0.0" is-utf8 "^0.2.0" @@ -3106,6 +4335,10 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -3119,10 +4352,18 @@ strip-json-comments@1.0.x: strip-json-comments@~0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-0.1.3.tgz#164c64e370a8a3cc00c9e01b539e569823f0ee54" + integrity sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ= strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" supports-color@^0.2.0: version "0.2.0" @@ -3138,9 +4379,16 @@ supports-color@^3.1.0: dependencies: has-flag "^1.0.0" +supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + tape@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/tape/-/tape-2.3.3.tgz#2e7ce0a31df09f8d6851664a71842e0ca5057af7" + integrity sha1-Lnzgox3wn41oUWZKcYQuDKUFevc= dependencies: deep-equal "~0.1.0" defined "~0.0.0" @@ -3157,19 +4405,6 @@ tar-fs@~1.12.0: pump "^1.0.0" tar-stream "^1.1.2" -tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - tar-stream@^1.1.2: version "1.5.4" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" @@ -3179,13 +4414,18 @@ tar-stream@^1.1.2: readable-stream "^2.0.0" xtend "^4.0.0" -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" through2@^0.5.0: version "0.5.1" @@ -3197,6 +4437,7 @@ through2@^0.5.0: through2@^0.6.1, through2@~0.6.1, through2@~0.6.2: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= dependencies: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" @@ -3215,6 +4456,13 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" +through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + through2@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" @@ -3229,6 +4477,7 @@ through2@~0.4.0: tildify@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= dependencies: os-homedir "^1.0.0" @@ -3244,6 +4493,31 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + tough-cookie@~2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" @@ -3254,6 +4528,14 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -3282,13 +4564,10 @@ type-check@~0.3.1, type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" - -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== typedarray@~0.0.5: version "0.0.6" @@ -3307,10 +4586,6 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - unc-path-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -3319,27 +4594,59 @@ underscore@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + unique-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -"util@>=0.10.3 <1": - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - utile@0.2.1, utile@0.2.x, utile@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7" + integrity sha1-kwyI6ZCY1iIINMNWy9mncFItkNc= dependencies: async "~0.2.9" deep-equal "*" @@ -3352,9 +4659,15 @@ uuid@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + v8flags@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= dependencies: user-home "^1.1.1" @@ -3376,6 +4689,7 @@ verror@1.10.0: vinyl-fs@^0.3.0: version "0.3.14" resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= dependencies: defaults "^1.0.0" glob-stream "^3.1.5" @@ -3395,6 +4709,7 @@ vinyl@^0.2.1: vinyl@^0.4.0: version "0.4.6" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= dependencies: clone "^0.2.0" clone-stats "^0.0.1" @@ -3408,26 +4723,36 @@ vinyl@^0.5.0: replace-ext "0.0.1" websocket-driver@>=0.5.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: + http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -which@^1.0.9, which@^1.1.1, which@^1.2.12: +which@^1.0.9, which@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" +which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" window-size@0.1.0: version "0.1.0" @@ -3442,6 +4767,7 @@ winston-loggly@1.2.0: winston@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.0.tgz#61d0830fa699706212206b0a2b5ca69a93043668" + integrity sha1-YdCDD6aZcGISIGsKK1ymmpMENmg= dependencies: async "0.2.x" colors "0.6.x" @@ -3453,6 +4779,7 @@ winston@0.8.0: winston@0.8.x, winston@~0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + integrity sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA= dependencies: async "0.2.x" colors "0.6.x" @@ -3504,6 +4831,11 @@ xtend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From f3957e793ba7ebe7f4fffa753194a6880d836b37 Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Wed, 3 Apr 2019 14:41:02 +0300 Subject: [PATCH 07/14] Add codefresh label to Dockerfile --- Dockerfile.windows | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile.windows b/Dockerfile.windows index 40402783..31d1d926 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -77,4 +77,6 @@ RUN yarn install --frozen-lockfile --production COPY . ./ +LABEL owner="codefresh.io" + CMD ["powershell", "./lib/forever.ps1"] \ No newline at end of file From 438b95d663a75c84bb4252fcd559a3d21e3c0e40 Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Thu, 2 May 2019 11:26:35 +0300 Subject: [PATCH 08/14] Tty setting fix (SAAS-2597) --- lib/ContainerLogger.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ContainerLogger.js b/lib/ContainerLogger.js index fc0545ae..8eb50d65 100644 --- a/lib/ContainerLogger.js +++ b/lib/ContainerLogger.js @@ -46,11 +46,11 @@ class ContainerLogger extends EventEmitter { // See documentation of the docker api here: https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/attach-to-a-container if (this.tty) { this._handleTtyStream(stdout, false); - if (stderr) { - this._handleTtyStream(stderr, true); - } } else { this._handleNonTtyStream(stdout, false); + if (stderr) { + this._handleNonTtyStream(stderr, true); + } } stdout.on('end', () => { From 89bb2920c83983539e4c99c8505f7246fa5c71de Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Fri, 24 May 2019 12:52:36 +0300 Subject: [PATCH 09/14] Use latest task logger --- package.json | 4 ++-- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c67e3bf9..45fe991c 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "cf-container-logger", - "version": "0.0.4", + "version": "0.0.6", "description": "codefresh container logger", "keywords": [ "cf-container-logger" ], "dependencies": { - "@codefresh-io/task-logger": "^0.0.11", + "@codefresh-io/task-logger": "^0.0.18", "cf-errors": "^0.1.11", "cf-logs": "^1.1.0", "docker-events": "0.0.2", diff --git a/yarn.lock b/yarn.lock index 8a29efc4..37514e6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@codefresh-io/task-logger@^0.0.11": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@codefresh-io/task-logger/-/task-logger-0.0.11.tgz#cb439a6555a9499bb5a2dcd6a2b4408fe8c82b34" - integrity sha512-P5x/6fXTPcIziiGxaK2x00c8s/azOq/q2do3Mnviily7YmxsZwXPbHr35IxVhPXSST7RYZ8Phg5t1CpzkIlMzw== +"@codefresh-io/task-logger@^0.0.18": + version "0.0.18" + resolved "https://registry.yarnpkg.com/@codefresh-io/task-logger/-/task-logger-0.0.18.tgz#d7d69d4eeeaf9fc4d7ca78abf3a208a951d5f297" + integrity sha512-qDFO88Lkco5zHKGxV4YTNgHwfX5vgODleTgXyHuj1xdCuuZTsOvYmnm/qZcPVkiSb6tKSqKv3QBvMePKi6Ej8g== dependencies: cf-errors "^0.1.11" crypto "0.0.3" From 497b7b788c12288e3815af21e3a14d618002902d Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Wed, 6 May 2020 15:56:59 +0300 Subject: [PATCH 10/14] update Dockerfile.windows --- Dockerfile.windows | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index 31d1d926..80c47f49 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/windows/servercore:1809 as download +FROM mcr.microsoft.com/windows/servercore:1909 as download SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] From 7f4bc67014ffb6d4a89aace7f197a612b493f840 Mon Sep 17 00:00:00 2001 From: alex-codefresh <33512662+alex-codefresh@users.noreply.github.com> Date: Fri, 17 Jul 2020 17:05:17 +0300 Subject: [PATCH 11/14] SAAS-7852 (#51) --- lib/ContainerLogger.js | 7 ++++--- lib/logger.js | 27 ++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lib/ContainerLogger.js b/lib/ContainerLogger.js index b5869f72..d32065fd 100644 --- a/lib/ContainerLogger.js +++ b/lib/ContainerLogger.js @@ -96,9 +96,10 @@ class ContainerLogger extends EventEmitter { _getLogsStrategyStream() { return Q.all([ Q.ninvoke(this.containerInterface, 'logs', { - follow: 1, - stdout: 1, - stderr: 1 + follow: true, + stdout: true, + stderr: true, + tail: 1000 }) ]); } diff --git a/lib/logger.js b/lib/logger.js index d711676b..291f0b50 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -180,7 +180,7 @@ class Logger { * @param docker * @param newContainer */ - async _handleContainer(container) { // jshint ignore:line + async _handleContainer(container, loggerStrategy) { // jshint ignore:line const containerId = container.Id || container.id; const containerStatus = container.Status || container.status; const receivedLoggerId = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.id']; @@ -189,7 +189,13 @@ class Logger { const receivedLogSizeLimit = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.logSizeLimit']; - const loggerStrategy = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.strategy']; + const maxRetryAttempts = 10; + const retryInterval = 1000; + var retryCount = 0; + + if (!loggerStrategy) { + loggerStrategy = _.get(container, 'Labels', _.get(container, 'Actor.Attributes'))['io.codefresh.logger.strategy']; + } if (!containerId) { logger.error(`Not handling container because id is missing`); @@ -256,16 +262,27 @@ class Logger { containerLogger.once('end', this._handleContainerStreamEnd.bind(this)); containerLogger.start() - .done(() => { - this.state.containers[containerId] = { status: ContainerHandlingStatus.LISTENING }; + .then(() => { + this.state[containerId] = { status: ContainerHandlingStatus.LISTENING }; this._writeNewState(); - }, (err) => { + }) + .catch(async (err) => { const error = new CFError({ cause: err, message: `Failed to start logging for container:${containerId}`, containerId }); logger.error(error.toString()); + + if (retryCount !== maxRetryAttempts) { + retryCount++; + logger.warn(`Making another attempt switching to the "${LoggerStrategy.LOGS}" logging strategy`); + + await new Promise(r => setTimeout(r, retryInterval)); + + delete this.state.containers[containerId]; + await this._handleContainer(container, LoggerStrategy.LOGS); + } }); } From 131cf08f9b6ee503a23d491dfa2529fa28a5a19f Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Sat, 16 Jan 2021 10:43:59 +0300 Subject: [PATCH 12/14] Use OS_RELEASE build arg --- Dockerfile.windows | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index 80c47f49..0f50c59f 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -1,4 +1,6 @@ -FROM mcr.microsoft.com/windows/servercore:1909 as download +ARG OS_RELEASE + +FROM mcr.microsoft.com/windows/servercore:${OS_RELEASE} as download SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] From ab2a813025c0431ba6503ec5687f4a9b4f0a7369 Mon Sep 17 00:00:00 2001 From: alex-codefresh Date: Mon, 18 Jan 2021 10:20:29 +0300 Subject: [PATCH 13/14] Install cygwin differently, because installation via choco is broken --- Dockerfile.windows | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index 0f50c59f..bfc7e1a4 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -65,11 +65,17 @@ CMD [ "node.exe" ] FROM build -WORKDIR C:/tmp - RUN Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) RUN choco install git -y -RUN choco install cygwin -y + +RUN $url = 'https://cygwin.com/setup-x86_64.exe'; \ + Invoke-WebRequest -Uri $url -OutFile 'C:/setup-x86_64.exe'; \ + New-Item -ItemType directory -Path 'C:/tmp'; \ + Start-Process "C:/setup-x86_64.exe" -NoNewWindow -Wait -PassThru -ArgumentList @('-q','-v','-n','-B','-R','C:/cygwin64','-l','C:/tmp','-s','http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2019/03/06/161558','-X','-P', 'default'); \ + Start-Process "C:/cygwin64/bin/cygcheck.exe" -NoNewWindow -Wait -PassThru -ArgumentList @('-c'); \ + Remove-Item -Path 'C:/tmp' -Force -Recurse -ErrorAction Ignore; + +WORKDIR C:/cf-container-logger COPY package.json ./ From d06f2f0730edf7d813a076372d72898c6cd497e3 Mon Sep 17 00:00:00 2001 From: mikhail-klimko <67968402+mikhail-klimko@users.noreply.github.com> Date: Tue, 22 Feb 2022 13:53:18 +0300 Subject: [PATCH 14/14] upd gpg keys (#88) --- Dockerfile.windows | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Dockerfile.windows b/Dockerfile.windows index bfc7e1a4..1a6a7fc3 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -10,19 +10,23 @@ RUN Invoke-WebRequest $('https://files.gpg4win.org/gpg4win-vanilla-{0}.exe' -f $ Start-Process .\gpg4win.exe -ArgumentList '/S' -NoNewWindow -Wait RUN @( \ + '4ED778F539E3634C779C87C6D7062848A1AB005C', \ '94AE36675C464D64BAFA68DD7434390BDBE9B9C5', \ - 'FD3A5288F042B6850C66B31F09FE44734EB7990E', \ + '74F12602B6F1C4E913FAA37AD3A89613643B6201', \ '71DCFD284A79C3B38668286BC97EC7A07EDE3FC1', \ - 'DD8F2338BAE7501E3DD5AC78C273792F7D83545D', \ - 'C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8', \ - 'B9AE9905FFD7803F25714661B63B535A4C206CA9', \ - '77984A986EBC2AA786BC0F66B01FBB92821C587A', \ '8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600', \ - '4ED778F539E3634C779C87C6D7062848A1AB005C', \ + 'C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8', \ + 'C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C', \ + 'DD8F2338BAE7501E3DD5AC78C273792F7D83545D', \ 'A48C2BEE680E841632CD4E44F07496B3EB3C1762', \ - 'B9E2F5981AA6E0CD28160D9FF13993A75599653C' \ + '108F52B48DB57BB0CC439B2997B01419BD92F80A', \ + 'B9E2F5981AA6E0CD28160D9FF13993A75599653C', \ + '9554F04D7259F04124DE6B476D5A82AC7E37093B', \ + '1C050899334244A8AF75E53792EF661D867B9DFA', \ + 'B9AE9905FFD7803F25714661B63B535A4C206CA9' \ ) | foreach { \ - gpg --keyserver ha.pool.sks-keyservers.net --recv-keys $_ ; \ + gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys $_ ; \ + gpg --batch --keyserver keyserver.ubuntu.com --recv-keys $_ ; \ } ENV NODE_VERSION 11.10.0