diff --git a/services/filestore/.dockerignore b/services/filestore/.dockerignore new file mode 100644 index 0000000000..386f26df30 --- /dev/null +++ b/services/filestore/.dockerignore @@ -0,0 +1,9 @@ +node_modules/* +gitrev +.git +.gitignore +.npm +.nvmrc +nodemon.json +app.js +**/js/* diff --git a/services/filestore/.github/ISSUE_TEMPLATE.md b/services/filestore/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..e0093aa90c --- /dev/null +++ b/services/filestore/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,38 @@ + + +## Steps to Reproduce + + + +1. +2. +3. + +## Expected Behaviour + + +## Observed Behaviour + + + +## Context + + +## Technical Info + + +* URL: +* Browser Name and version: +* Operating System and version (desktop or mobile): +* Signed in as: +* Project and/or file: + +## Analysis + + +## Who Needs to Know? + + + +- +- diff --git a/services/filestore/.github/PULL_REQUEST_TEMPLATE.md b/services/filestore/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..ed25ee83c1 --- /dev/null +++ b/services/filestore/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,45 @@ + + +### Description + + + +#### Screenshots + + + +#### Related Issues / PRs + + + +### Review + + + +#### Potential Impact + + + +#### Manual Testing Performed + +- [ ] +- [ ] + +#### Accessibility + + + +### Deployment + + + +#### Deployment Checklist + +- [ ] Update documentation not included in the PR (if any) +- [ ] + +#### Metrics and Monitoring + + + +#### Who Needs to Know? diff --git a/services/filestore/.gitignore b/services/filestore/.gitignore index d51931c976..5d1086933c 100644 --- a/services/filestore/.gitignore +++ b/services/filestore/.gitignore @@ -40,6 +40,7 @@ test/IntergrationTests/js/* data/*/* app.js +**/*.map cluster.js app/js/* test/IntergrationTests/js/* @@ -56,6 +57,7 @@ public/minjs/ test/unit/js/ test/acceptence/js cluster.js +test/acceptance/js/ user_files/* template_files/* diff --git a/services/filestore/Dockerfile b/services/filestore/Dockerfile index 49a9940d7f..2845544ae6 100644 --- a/services/filestore/Dockerfile +++ b/services/filestore/Dockerfile @@ -1,4 +1,23 @@ +FROM node:6.9.5 as app + +WORKDIR /app + +#wildcard as some files may not be in all repos +COPY package*.json npm-shrink*.json /app/ + +RUN npm install --quiet + +COPY . /app + + +RUN npm run compile:all + FROM node:6.9.5 -# we also need imagemagick but it is already in the node docker image -RUN apt-get update && apt-get install -y --no-install-recommends ghostscript optipng +COPY --from=app /app /app + +WORKDIR /app +RUN chmod 0755 ./install_deps.sh && ./install_deps.sh +USER node + +CMD ["node", "--expose-gc", "app.js"] diff --git a/services/filestore/Gruntfile.coffee b/services/filestore/Gruntfile.coffee deleted file mode 100644 index ebf94e2fc9..0000000000 --- a/services/filestore/Gruntfile.coffee +++ /dev/null @@ -1,97 +0,0 @@ -module.exports = (grunt) -> - - # Project configuration. - grunt.initConfig - forever: - app: - options: - index: "app.js" - - coffee: - server: - expand: true, - flatten: false, - cwd: 'app/coffee', - src: ['**/*.coffee'], - dest: 'app/js/', - ext: '.js' - - app_server: - expand: true, - flatten: false, - src: ['app.coffee', 'cluster.coffee'], - dest: './', - ext: '.js' - - server_tests: - expand: true, - flatten: false, - cwd: 'test/acceptence/coffee', - src: ['*.coffee', '**/*.coffee'], - dest: 'test/acceptence/js/', - ext: '.js' - - server_acc_tests: - expand: true, - flatten: false, - cwd: 'test/unit/coffee', - src: ['*.coffee', '**/*.coffee'], - dest: 'test/unit/js/', - ext: '.js' - - watch: - server_coffee: - files: ['app/*.coffee','app/**/*.coffee', 'test/unit/coffee/**/*.coffee', 'test/unit/coffee/*.coffee', "app.coffee", "cluster.coffee"] - tasks: ["clean", 'coffee', 'mochaTest'] - - clean: ["app/js", "test/unit/js", "app.js"] - - nodemon: - dev: - script: 'app.js' - options: - ext:"*.coffee" - - execute: - app: - src: "app.js" - - concurrent: - dev: - tasks: ['nodemon', 'watch'] - options: - logConcurrentOutput: true - - mochaTest: - unit: - src: ["test/unit/js/#{grunt.option('feature') or '**'}/*.js"] - options: - reporter: grunt.option('reporter') or 'spec' - grep: grunt.option("grep") - acceptence: - src: ["test/acceptence/js/#{grunt.option('feature') or '**'}/*.js"] - options: - reporter: grunt.option('reporter') or 'spec' - grep: grunt.option("grep") - - - grunt.loadNpmTasks 'grunt-contrib-coffee' - grunt.loadNpmTasks 'grunt-contrib-watch' - grunt.loadNpmTasks 'grunt-nodemon' - grunt.loadNpmTasks 'grunt-contrib-clean' - grunt.loadNpmTasks 'grunt-concurrent' - grunt.loadNpmTasks 'grunt-mocha-test' - grunt.loadNpmTasks 'grunt-forever' - grunt.loadNpmTasks 'grunt-bunyan' - grunt.loadNpmTasks 'grunt-execute' - - grunt.registerTask "test:unit", ["coffee", "mochaTest:unit"] - grunt.registerTask "test:acceptence", ["coffee", "mochaTest:acceptence"] - grunt.registerTask "test:acceptance", ["test:acceptence"] - - grunt.registerTask "ci", "test:unit" - grunt.registerTask 'default', ['coffee', 'bunyan','execute'] - - grunt.registerTask "compile", "coffee" - grunt.registerTask "install", "compile" - diff --git a/services/filestore/Jenkinsfile b/services/filestore/Jenkinsfile index 03528475d6..35bd318ab2 100644 --- a/services/filestore/Jenkinsfile +++ b/services/filestore/Jenkinsfile @@ -1,79 +1,122 @@ -pipeline { - - agent { - docker { - image 'node:6.9.5' - args "-v /var/lib/jenkins/.npm:/tmp/.npm" - } - } +String cron_string = BRANCH_NAME == "master" ? "@daily" : "" - environment { - HOME = "/tmp" +pipeline { + agent any + + environment { + GIT_PROJECT = "filestore-sharelatex" + JENKINS_WORKFLOW = "filestore-sharelatex" + TARGET_URL = "${env.JENKINS_URL}blue/organizations/jenkins/${JENKINS_WORKFLOW}/detail/$BRANCH_NAME/$BUILD_NUMBER/pipeline" + GIT_API_URL = "https://api.github.com/repos/sharelatex/${GIT_PROJECT}/statuses/$GIT_COMMIT" } triggers { pollSCM('* * * * *') - cron('@daily') + cron(cron_string) } stages { - stage('Set up') { - steps { - // we need to disable logallrefupdates, else git clones during the npm install will require git to lookup the user id - // which does not exist in the container's /etc/passwd file, causing the clone to fail. - sh 'git config --global core.logallrefupdates false' - } - } stage('Install') { steps { - sh 'rm -fr node_modules' - sh 'npm install' - sh 'npm rebuild' - sh 'npm install --quiet grunt-cli' + withCredentials([usernamePassword(credentialsId: 'GITHUB_INTEGRATION', usernameVariable: 'GH_AUTH_USERNAME', passwordVariable: 'GH_AUTH_PASSWORD')]) { + sh "curl $GIT_API_URL \ + --data '{ \ + \"state\" : \"pending\", \ + \"target_url\": \"$TARGET_URL\", \ + \"description\": \"Your build is underway\", \ + \"context\": \"ci/jenkins\" }' \ + -u $GH_AUTH_USERNAME:$GH_AUTH_PASSWORD" + } } } - stage('Compile') { + + stage('Build') { steps { - sh 'node_modules/.bin/grunt compile' + sh 'make build' } } - stage('Test') { + + stage('Unit Tests') { steps { - sh 'NODE_ENV=development node_modules/.bin/grunt test:unit' + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_unit' } } - stage('Package') { + + stage('Acceptance Tests') { + steps { + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_acceptance' + } + } + + stage('Package and docker push') { steps { sh 'echo ${BUILD_NUMBER} > build_number.txt' sh 'touch build.tar.gz' // Avoid tar warning about files changing during read - sh 'tar -czf build.tar.gz --exclude=build.tar.gz --exclude-vcs .' + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make tar' + + withCredentials([file(credentialsId: 'gcr.io_overleaf-ops', variable: 'DOCKER_REPO_KEY_PATH')]) { + sh 'docker login -u _json_key --password-stdin https://gcr.io/overleaf-ops < ${DOCKER_REPO_KEY_PATH}' + } + sh 'DOCKER_REPO=gcr.io/overleaf-ops make publish' + sh 'docker logout https://gcr.io/overleaf-ops' + } } - stage('Publish') { + + stage('Publish to s3') { steps { + sh 'echo ${BRANCH_NAME}-${BUILD_NUMBER} > build_number.txt' withAWS(credentials:'S3_CI_BUILDS_AWS_KEYS', region:"${S3_REGION_BUILD_ARTEFACTS}") { s3Upload(file:'build.tar.gz', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/${BUILD_NUMBER}.tar.gz") + } + withAWS(credentials:'S3_CI_BUILDS_AWS_KEYS', region:"${S3_REGION_BUILD_ARTEFACTS}") { // The deployment process uses this file to figure out the latest build s3Upload(file:'build_number.txt', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/latest") } } } } - + post { + always { + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_clean' + sh 'make clean' + } + + success { + withCredentials([usernamePassword(credentialsId: 'GITHUB_INTEGRATION', usernameVariable: 'GH_AUTH_USERNAME', passwordVariable: 'GH_AUTH_PASSWORD')]) { + sh "curl $GIT_API_URL \ + --data '{ \ + \"state\" : \"success\", \ + \"target_url\": \"$TARGET_URL\", \ + \"description\": \"Your build succeeded!\", \ + \"context\": \"ci/jenkins\" }' \ + -u $GH_AUTH_USERNAME:$GH_AUTH_PASSWORD" + } + } + failure { - mail(from: "${EMAIL_ALERT_FROM}", - to: "${EMAIL_ALERT_TO}", + mail(from: "${EMAIL_ALERT_FROM}", + to: "${EMAIL_ALERT_TO}", subject: "Jenkins build failed: ${JOB_NAME}:${BUILD_NUMBER}", body: "Build: ${BUILD_URL}") + withCredentials([usernamePassword(credentialsId: 'GITHUB_INTEGRATION', usernameVariable: 'GH_AUTH_USERNAME', passwordVariable: 'GH_AUTH_PASSWORD')]) { + sh "curl $GIT_API_URL \ + --data '{ \ + \"state\" : \"failure\", \ + \"target_url\": \"$TARGET_URL\", \ + \"description\": \"Your build failed\", \ + \"context\": \"ci/jenkins\" }' \ + -u $GH_AUTH_USERNAME:$GH_AUTH_PASSWORD" + } } } - + // The options directive is for configuration that applies to the whole job. options { // we'd like to make sure remove old builds, so we don't fill up our storage! buildDiscarder(logRotator(numToKeepStr:'50')) - + // And we'd really like to be sure that this build doesn't hang forever, so let's time it out after: timeout(time: 30, unit: 'MINUTES') } diff --git a/services/filestore/Makefile b/services/filestore/Makefile new file mode 100644 index 0000000000..db33518816 --- /dev/null +++ b/services/filestore/Makefile @@ -0,0 +1,49 @@ +# This file was auto-generated, do not edit it directly. +# Instead run bin/update_build_scripts from +# https://github.com/sharelatex/sharelatex-dev-environment +# Version: 1.1.12 + +BUILD_NUMBER ?= local +BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) +PROJECT_NAME = filestore +DOCKER_COMPOSE_FLAGS ?= -f docker-compose.yml +DOCKER_COMPOSE := BUILD_NUMBER=$(BUILD_NUMBER) \ + BRANCH_NAME=$(BRANCH_NAME) \ + PROJECT_NAME=$(PROJECT_NAME) \ + MOCHA_GREP=${MOCHA_GREP} \ + docker-compose ${DOCKER_COMPOSE_FLAGS} + +clean: + docker rmi ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) + docker rmi gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) + rm -f app.js + rm -rf app/js + rm -rf test/unit/js + rm -rf test/acceptance/js + +test: test_unit test_acceptance + +test_unit: + @[ ! -d test/unit ] && echo "filestore has no unit tests" || $(DOCKER_COMPOSE) run --rm test_unit + +test_acceptance: test_clean test_acceptance_pre_run # clear the database before each acceptance test run + @[ ! -d test/acceptance ] && echo "filestore has no acceptance tests" || $(DOCKER_COMPOSE) run --rm test_acceptance + +test_clean: + $(DOCKER_COMPOSE) down -v -t 0 + +test_acceptance_pre_run: + @[ ! -f test/acceptance/scripts/pre-run ] && echo "filestore has no pre acceptance tests task" || $(DOCKER_COMPOSE) run --rm test_acceptance test/acceptance/scripts/pre-run +build: + docker build --pull --tag ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \ + --tag gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \ + . + +tar: + $(DOCKER_COMPOSE) up tar + +publish: + + docker push $(DOCKER_REPO)/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) + +.PHONY: clean test test_unit test_acceptance test_clean build publish diff --git a/services/filestore/app.coffee b/services/filestore/app.coffee index 9bcf258331..b4fff5b698 100644 --- a/services/filestore/app.coffee +++ b/services/filestore/app.coffee @@ -1,4 +1,7 @@ +Metrics = require "metrics-sharelatex" +Metrics.initialize("filestore") express = require('express') +bodyParser = require "body-parser" logger = require('logger-sharelatex') logger.initialize("filestore") settings = require("settings-sharelatex") @@ -14,24 +17,11 @@ app = express() if settings.sentry?.dsn? logger.initializeErrorReporting(settings.sentry.dsn) -Metrics = require "metrics-sharelatex" -Metrics.initialize("filestore") Metrics.open_sockets.monitor(logger) Metrics.event_loop?.monitor(logger) Metrics.memory.monitor(logger) -app.configure -> - app.use Metrics.http.monitor(logger) - -app.configure 'development', -> - console.log "Development Enviroment" - app.use express.errorHandler({ dumpExceptions: true, showStack: true }) - -app.configure 'production', -> - console.log "Production Enviroment" - app.use express.errorHandler() - -Metrics.inc "startup" +app.use Metrics.http.monitor(logger) app.use (req, res, next)-> Metrics.inc "http-request" @@ -71,10 +61,12 @@ app.use (req, res, next) -> res.set 'Connection', 'close' next() +Metrics.injectMetricsRoute(app) + app.get "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.getFile app.post "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.insertFile -app.put "/project/:project_id/file/:file_id", keyBuilder.userFileKey, express.bodyParser(), fileController.copyFile +app.put "/project/:project_id/file/:file_id", keyBuilder.userFileKey, bodyParser.json(), fileController.copyFile app.del "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.deleteFile app.get "/template/:template_id/v/:version/:format", keyBuilder.templateFileKey, fileController.getFile @@ -85,7 +77,7 @@ app.post "/template/:template_id/v/:version/:format", keyBuilder.templateFileKey app.get "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, fileController.getFile app.post "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, fileController.insertFile -app.put "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, express.bodyParser(), fileController.copyFile +app.put "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, bodyParser.json(), fileController.copyFile app.del "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, fileController.deleteFile app.get "/project/:project_id/size", keyBuilder.publicProjectKey, fileController.directorySize @@ -114,9 +106,8 @@ app.get "/health_check", healthCheckController.check app.get '*', (req, res)-> res.send 404 -server = require('http').createServer(app) -port = settings.internal.filestore.port or 3009 -host = settings.internal.filestore.host or "localhost" + + beginShutdown = () -> if appIsOk @@ -126,14 +117,22 @@ beginShutdown = () -> process.exit 1 , 120*1000 killTimer.unref?() # prevent timer from keeping process alive - server.close () -> + app.close () -> logger.log "closed all connections" Metrics.close() process.disconnect?() logger.log "server will stop accepting connections" -server.listen port, host, -> - logger.info "Filestore starting up, listening on #{host}:#{port}" + +port = settings.internal.filestore.port or 3009 +host = "0.0.0.0" + +if !module.parent # Called directly + app.listen port, host, (error) -> + logger.info "Filestore starting up, listening on #{host}:#{port}" + + +module.exports = app process.on 'SIGTERM', () -> logger.log("filestore got SIGTERM, shutting down gracefully") diff --git a/services/filestore/app/coffee/FSPersistorManager.coffee b/services/filestore/app/coffee/FSPersistorManager.coffee index 733202e4cd..353e2ef099 100644 --- a/services/filestore/app/coffee/FSPersistorManager.coffee +++ b/services/filestore/app/coffee/FSPersistorManager.coffee @@ -49,13 +49,13 @@ module.exports = sourceStream.on 'error', (err) -> logger.err err:err, location:location, name:name, "Error reading from file" if err.code == 'ENOENT' - callback new Errors.NotFoundError(err.message), null + return callback new Errors.NotFoundError(err.message), null else - callback err, null + return callback err, null sourceStream.on 'readable', () -> # This can be called multiple times, but the callback wrapper # ensures the callback is only called once - callback null, sourceStream + return callback null, sourceStream copyFile: (location, fromName, toName, callback = (err)->)-> diff --git a/services/filestore/app/coffee/FileConverter.coffee b/services/filestore/app/coffee/FileConverter.coffee index 429fa7fccb..894b0e89fd 100644 --- a/services/filestore/app/coffee/FileConverter.coffee +++ b/services/filestore/app/coffee/FileConverter.coffee @@ -34,11 +34,11 @@ module.exports = callback(err, destPath) thumbnail: (sourcePath, callback)-> - logger.log sourcePath:sourcePath, "thumbnail convert file" destPath = "#{sourcePath}.png" sourcePath = "#{sourcePath}[0]" width = "260x" command = ["convert", "-flatten", "-background", "white", "-density", "300", "-define", "pdf:fit-page=#{width}", sourcePath, "-resize", width, destPath] + logger.log sourcePath:sourcePath, destPath:destPath, command:command, "thumbnail convert file" command = Settings.commands.convertCommandPrefix.concat(command) safe_exec command, childProcessOpts, (err, stdout, stderr)-> if err? diff --git a/services/filestore/app/coffee/FileHandler.coffee b/services/filestore/app/coffee/FileHandler.coffee index f1dadd315a..6189c8a906 100644 --- a/services/filestore/app/coffee/FileHandler.coffee +++ b/services/filestore/app/coffee/FileHandler.coffee @@ -95,6 +95,8 @@ module.exports = FileHandler = LocalFileWriter.deleteFile originalFsPath, -> callback(err, destPath, originalFsPath) + logger.log opts:opts, "converting file depending on opts" + if opts.format? FileConverter.convert originalFsPath, opts.format, done else if opts.style == "thumbnail" diff --git a/services/filestore/app/coffee/HealthCheckController.coffee b/services/filestore/app/coffee/HealthCheckController.coffee index db3f111c5e..643e15adb3 100644 --- a/services/filestore/app/coffee/HealthCheckController.coffee +++ b/services/filestore/app/coffee/HealthCheckController.coffee @@ -33,6 +33,8 @@ checkCanStoreFiles = (callback)-> callback(err) checkFileConvert = (callback)-> + if !settings.enableConversions + return callback() imgPath = path.join(settings.path.uploadFolder, "/tiny.pdf") async.waterfall [ (cb)-> diff --git a/services/filestore/app/coffee/ImageOptimiser.coffee b/services/filestore/app/coffee/ImageOptimiser.coffee index 4888e00224..4c4a353f21 100644 --- a/services/filestore/app/coffee/ImageOptimiser.coffee +++ b/services/filestore/app/coffee/ImageOptimiser.coffee @@ -1,5 +1,6 @@ exec = require('child_process').exec logger = require("logger-sharelatex") +Settings = require "settings-sharelatex" module.exports = @@ -10,6 +11,9 @@ module.exports = opts = timeout: 30 * 1000 killSignal: "SIGKILL" + if !Settings.enableConversions + error = new Error("Image conversions are disabled") + return callback(error) exec args, opts,(err, stdout, stderr)-> if err? and err.signal == 'SIGKILL' logger.warn {err: err, stderr: stderr, localPath: localPath}, "optimiser timeout reached" diff --git a/services/filestore/app/coffee/PersistorManager.coffee b/services/filestore/app/coffee/PersistorManager.coffee index aa5c80599d..85c9dd83cd 100644 --- a/services/filestore/app/coffee/PersistorManager.coffee +++ b/services/filestore/app/coffee/PersistorManager.coffee @@ -2,11 +2,10 @@ settings = require("settings-sharelatex") logger = require("logger-sharelatex") # assume s3 if none specified -settings.filestore.backend ||= "s3" +settings?.filestore?.backend ||= "s3" - -logger.log backend:settings.filestore.backend, "Loading backend" -module.exports = switch settings.filestore.backend +logger.log backend:settings?.filestore?.backend, "Loading backend" +module.exports = switch settings?.filestore?.backend when "aws-sdk" require "./AWSSDKPersistorManager" when "s3" diff --git a/services/filestore/app/coffee/S3PersistorManager.coffee b/services/filestore/app/coffee/S3PersistorManager.coffee index dd9aae3bf7..2b183730d6 100644 --- a/services/filestore/app/coffee/S3PersistorManager.coffee +++ b/services/filestore/app/coffee/S3PersistorManager.coffee @@ -88,10 +88,11 @@ module.exports = # permission to list the bucket contents. logger.log bucketName:bucketName, key:key, "file not found in s3" return callback new Errors.NotFoundError("File not found in S3: #{bucketName}:#{key}"), null - if res.statusCode not in [200, 206] + else if res.statusCode not in [200, 206] logger.log bucketName:bucketName, key:key, "error getting file from s3: #{res.statusCode}" return callback new Error("Got non-200 response from S3: #{res.statusCode}"), null - callback null, res + else + return callback null, res s3Stream.on 'error', (err) -> logger.err err:err, bucketName:bucketName, key:key, "error getting file stream from s3" callback err diff --git a/services/filestore/app/coffee/SafeExec.coffee b/services/filestore/app/coffee/SafeExec.coffee index aa8121a360..3559d35c95 100644 --- a/services/filestore/app/coffee/SafeExec.coffee +++ b/services/filestore/app/coffee/SafeExec.coffee @@ -1,6 +1,7 @@ _ = require("underscore") logger = require("logger-sharelatex") child_process = require('child_process') +Settings = require "settings-sharelatex" # execute a command in the same way as 'exec' but with a timeout that # kills all child processes @@ -9,6 +10,10 @@ child_process = require('child_process') # group, then we can kill everything in that process group. module.exports = (command, options, callback = (err, stdout, stderr) ->) -> + if !Settings.enableConversions + error = new Error("Image conversions are disabled") + return callback(error) + # options are {timeout: number-of-milliseconds, killSignal: signal-name} [cmd, args...] = command diff --git a/services/filestore/buildscript.txt b/services/filestore/buildscript.txt new file mode 100644 index 0000000000..0ba90519b3 --- /dev/null +++ b/services/filestore/buildscript.txt @@ -0,0 +1,8 @@ +filestore +--language=coffeescript +--node-version=6.9.5 +--acceptance-creds=None +--dependencies=mongo,redis +--docker-repos=gcr.io/overleaf-ops +--build-target=docker +--script-version=1.1.12 diff --git a/services/filestore/config/settings.defaults.coffee b/services/filestore/config/settings.defaults.coffee index 59f5d8a0a6..77bc1bfb34 100644 --- a/services/filestore/config/settings.defaults.coffee +++ b/services/filestore/config/settings.defaults.coffee @@ -1,6 +1,6 @@ Path = require "path" -module.exports = +settings = internal: filestore: port: 3009 @@ -11,31 +11,37 @@ module.exports = # Choices are # s3 - Amazon S3 # fs - local filesystem - backend: "fs" - stores: - # where to store user and template binary files + if process.env['AWS_KEY']? or process.env['S3_BUCKET_CREDENTIALS']? + backend: "s3" + s3: + key: process.env['AWS_KEY'] + secret: process.env['AWS_SECRET'] + stores: + user_files: process.env['AWS_S3_USER_FILES_BUCKET_NAME'] + template_files: process.env['AWS_S3_TEMPLATE_FILES_BUCKET_NAME'] + public_files: process.env['AWS_S3_PUBLIC_FILES_BUCKET_NAME'] + # if you are using S3, then fill in your S3 details below, + # or use env var with the same structure. + # s3: + # key: "" # default + # secret: "" # default # - # For Amazon S3 this is the bucket name to store binary files in. - # - # For local filesystem this is the directory to store the files in. - # Must contain full path, e.g. "/var/lib/sharelatex/data". - # This path must exist, not be tmpfs and be writable to by the user sharelatex is run as. - user_files: Path.resolve(__dirname + "/../user_files") - public_files: Path.resolve(__dirname + "/../public_files") - template_files: Path.resolve(__dirname + "/../template_files") - # if you are using S3, then fill in your S3 details below, - # or use env var with the same structure. - # s3: - # key: "" # default - # secret: "" # default - # - # s3BucketCreds: - # bucketname1: # secrets for bucketname1 - # auth_key: "" - # auth_secret: "" - # bucketname2: # secrets for bucketname2... - - s3BucketCreds: JSON.parse process.env['S3_BUCKET_CREDENTIALS'] if process.env['S3_BUCKET_CREDENTIALS'] + # s3BucketCreds: + # bucketname1: # secrets for bucketname1 + # auth_key: "" + # auth_secret: "" + # bucketname2: # secrets for bucketname2... + s3BucketCreds: JSON.parse process.env['S3_BUCKET_CREDENTIALS'] if process.env['S3_BUCKET_CREDENTIALS']? + else + backend: "fs" + stores: + # + # For local filesystem this is the directory to store the files in. + # Must contain full path, e.g. "/var/lib/sharelatex/data". + # This path must exist, not be tmpfs and be writable to by the user sharelatex is run as. + user_files: Path.resolve(__dirname + "/../user_files") + public_files: Path.resolve(__dirname + "/../public_files") + template_files: Path.resolve(__dirname + "/../template_files") path: uploadFolder: Path.resolve(__dirname + "/../uploads") @@ -44,9 +50,14 @@ module.exports = # Any commands to wrap the convert utility in, for example ["nice"], or ["firejail", "--profile=/etc/firejail/convert.profile"] convertCommandPrefix: [] - # Filestore health check - # ---------------------- - # Project and file details to check in persistor when calling /health_check - # health_check: - # project_id: "" - # file_id: "" + enableConversions: if process.env['ENABLE_CONVERSIONS'] == 'true' then true else false + +# Filestore health check +# ---------------------- +# Project and file details to check in persistor when calling /health_check +if process.env['HEALTH_CHECK_PROJECT_ID']? and process.env['HEALTH_CHECK_FILE_ID']? + settings.health_check = + project_id: process.env['HEALTH_CHECK_PROJECT_ID'] + file_id: process.env['HEALTH_CHECK_FILE_ID'] + +module.exports = settings diff --git a/services/filestore/docker-compose.ci.yml b/services/filestore/docker-compose.ci.yml new file mode 100644 index 0000000000..e7ac6e84a7 --- /dev/null +++ b/services/filestore/docker-compose.ci.yml @@ -0,0 +1,45 @@ +# This file was auto-generated, do not edit it directly. +# Instead run bin/update_build_scripts from +# https://github.com/sharelatex/sharelatex-dev-environment +# Version: 1.1.12 + +version: "2" + +services: + test_unit: + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + user: node + command: npm run test:unit:_run + + + test_acceptance: + build: . + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + environment: + ELASTIC_SEARCH_DSN: es:9200 + REDIS_HOST: redis + MONGO_HOST: mongo + POSTGRES_HOST: postgres + MOCHA_GREP: ${MOCHA_GREP} + ENABLE_CONVERSIONS: "true" + depends_on: + - mongo + - redis + user: node + command: npm run test:acceptance:_run + + + + tar: + build: . + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + volumes: + - ./:/tmp/build/ + command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs . + user: root + + redis: + image: redis + + mongo: + image: mongo:3.4 diff --git a/services/filestore/docker-compose.yml b/services/filestore/docker-compose.yml new file mode 100644 index 0000000000..60d387bf51 --- /dev/null +++ b/services/filestore/docker-compose.yml @@ -0,0 +1,52 @@ +# This file was auto-generated, do not edit it directly. +# Instead run bin/update_build_scripts from +# https://github.com/sharelatex/sharelatex-dev-environment +# Version: 1.1.12 + +version: "2" + +services: + test_unit: + build: . + volumes: + - .:/app + working_dir: /app + environment: + MOCHA_GREP: ${MOCHA_GREP} + command: npm run test:unit + user: node + + test_acceptance: + build: . + volumes: + - .:/app + working_dir: /app + environment: + ELASTIC_SEARCH_DSN: es:9200 + REDIS_HOST: redis + MONGO_HOST: mongo + POSTGRES_HOST: postgres + MOCHA_GREP: ${MOCHA_GREP} + ENABLE_CONVERSIONS: "true" + user: node + depends_on: + - mongo + - redis + command: npm run test:acceptance + + + + tar: + build: . + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + volumes: + - ./:/tmp/build/ + command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs . + user: root + + redis: + image: redis + + mongo: + image: mongo:3.4 + diff --git a/services/filestore/install_deps.sh b/services/filestore/install_deps.sh new file mode 100755 index 0000000000..2bf275b1cb --- /dev/null +++ b/services/filestore/install_deps.sh @@ -0,0 +1,15 @@ +#!/bin/sh +apt-get update + +apt-get install vim imagemagick optipng --yes + +wget -q https://s3.amazonaws.com/sl-public-dev-assets/ghostscript-9.15.tar.gz -O /tmp/ghostscript-9.15.tar.gz +cd /tmp +tar -xvf /tmp/ghostscript-9.15.tar.gz +cd /tmp/ghostscript-9.15 && ./configure && make && make install +npm rebuild +mkdir /app/user_files/ /app/uploads/ /app/template_files/ +chown -R node:node /app/user_files +chown -R node:node /app/uploads +chown -R node:node /app/template_files +ls -al /app \ No newline at end of file diff --git a/services/filestore/nodemon.json b/services/filestore/nodemon.json new file mode 100644 index 0000000000..98db38d71b --- /dev/null +++ b/services/filestore/nodemon.json @@ -0,0 +1,19 @@ +{ + "ignore": [ + ".git", + "node_modules/" + ], + "verbose": true, + "legacyWatch": true, + "execMap": { + "js": "npm run start" + }, + + "watch": [ + "app/coffee/", + "app.coffee", + "config/" + ], + "ext": "coffee" + +} diff --git a/services/filestore/npm-shrinkwrap.json b/services/filestore/npm-shrinkwrap.json index dcbdd2848d..7caf791bae 100644 --- a/services/filestore/npm-shrinkwrap.json +++ b/services/filestore/npm-shrinkwrap.json @@ -2,151 +2,323 @@ "name": "filestore-sharelatex", "version": "0.1.4", "dependencies": { - "abbrev": { - "version": "1.1.1", - "from": "abbrev@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "@google-cloud/common": { + "version": "0.27.0", + "from": "@google-cloud/common@>=0.27.0 <0.28.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.27.0.tgz" + }, + "@google-cloud/debug-agent": { + "version": "3.0.1", + "from": "@google-cloud/debug-agent@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/debug-agent/-/debug-agent-3.0.1.tgz", + "dependencies": { + "coffeescript": { + "version": "2.3.2", + "from": "coffeescript@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.3.2.tgz" + } + } + }, + "@google-cloud/profiler": { + "version": "0.2.3", + "from": "@google-cloud/profiler@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-0.2.3.tgz", + "dependencies": { + "@google-cloud/common": { + "version": "0.26.2", + "from": "@google-cloud/common@>=0.26.0 <0.27.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.26.2.tgz" + }, + "nan": { + "version": "2.12.1", + "from": "nan@>=2.11.1 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz" + }, + "readable-stream": { + "version": "3.1.1", + "from": "readable-stream@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz" + }, + "string_decoder": { + "version": "1.2.0", + "from": "string_decoder@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz" + }, + "through2": { + "version": "3.0.0", + "from": "through2@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz" + } + } + }, + "@google-cloud/projectify": { + "version": "0.3.2", + "from": "@google-cloud/projectify@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.2.tgz" + }, + "@google-cloud/promisify": { + "version": "0.3.1", + "from": "@google-cloud/promisify@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.3.1.tgz" + }, + "@google-cloud/trace-agent": { + "version": "3.5.2", + "from": "@google-cloud/trace-agent@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.5.2.tgz", + "dependencies": { + "@google-cloud/common": { + "version": "0.30.2", + "from": "@google-cloud/common@>=0.30.0 <0.31.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.30.2.tgz" + }, + "google-auth-library": { + "version": "3.0.1", + "from": "google-auth-library@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.0.1.tgz" + }, + "uuid": { + "version": "3.3.2", + "from": "uuid@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + } + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "from": "@protobufjs/aspromise@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "from": "@protobufjs/base64@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "from": "@protobufjs/codegen@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "from": "@protobufjs/eventemitter@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "from": "@protobufjs/fetch@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + }, + "@protobufjs/float": { + "version": "1.0.2", + "from": "@protobufjs/float@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "from": "@protobufjs/inquire@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + }, + "@protobufjs/path": { + "version": "1.1.2", + "from": "@protobufjs/path@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "from": "@protobufjs/pool@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "from": "@protobufjs/utf8@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + }, + "@sindresorhus/is": { + "version": "0.13.0", + "from": "@sindresorhus/is@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.13.0.tgz" + }, + "@types/caseless": { + "version": "0.12.1", + "from": "@types/caseless@*", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz" + }, + "@types/console-log-level": { + "version": "1.4.0", + "from": "@types/console-log-level@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.0.tgz" + }, + "@types/duplexify": { + "version": "3.6.0", + "from": "@types/duplexify@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz" + }, + "@types/form-data": { + "version": "2.2.1", + "from": "@types/form-data@*", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz" + }, + "@types/long": { + "version": "4.0.0", + "from": "@types/long@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz" + }, + "@types/node": { + "version": "10.12.20", + "from": "@types/node@*", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.20.tgz" + }, + "@types/request": { + "version": "2.48.1", + "from": "@types/request@>=2.47.0 <3.0.0", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz" + }, + "@types/semver": { + "version": "5.5.0", + "from": "@types/semver@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz" + }, + "@types/tough-cookie": { + "version": "2.3.5", + "from": "@types/tough-cookie@*", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz" }, "accept-encoding": { "version": "0.1.0", "from": "accept-encoding@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/accept-encoding/-/accept-encoding-0.1.0.tgz" }, + "accepts": { + "version": "1.3.5", + "from": "accepts@>=1.3.5 <1.4.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz" + }, + "acorn": { + "version": "5.7.3", + "from": "acorn@>=5.0.3 <6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz" + }, + "agent-base": { + "version": "4.2.1", + "from": "agent-base@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz" + }, "ajv": { - "version": "5.5.2", - "from": "ajv@>=5.3.0 <6.0.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "dev": true + "version": "6.7.0", + "from": "ajv@>=6.5.5 <7.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz" }, - "ansi-regex": { - "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "array-flatten": { + "version": "1.1.1", + "from": "array-flatten@1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, - "ansi-styles": { - "version": "1.0.0", - "from": "ansi-styles@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "dev": true - }, - "argparse": { - "version": "0.1.16", - "from": "argparse@>=0.1.11 <0.2.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "dependencies": { - "underscore": { - "version": "1.7.0", - "from": "underscore@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" - }, - "underscore.string": { - "version": "2.4.0", - "from": "underscore.string@>=2.4.0 <2.5.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" - } - } + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" }, "asn1": { "version": "0.2.4", "from": "asn1@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" }, "assert-plus": { "version": "1.0.0", "from": "assert-plus@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "dev": true - }, - "assertion-error": { - "version": "1.0.2", - "from": "assertion-error@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" }, "async": { "version": "0.2.10", "from": "async@>=0.2.10 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, + "async-listener": { + "version": "0.6.10", + "from": "async-listener@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz" + }, "asynckit": { "version": "0.4.0", "from": "asynckit@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" }, "aws-sdk": { - "version": "2.116.0", + "version": "2.315.0", "from": "aws-sdk@>=2.1.39 <3.0.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.116.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.315.0.tgz", "dependencies": { "uuid": { - "version": "3.0.1", - "from": "uuid@3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz" + "version": "3.1.0", + "from": "uuid@3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" } } }, "aws-sign": { - "version": "0.2.0", + "version": "0.2.1", "from": "aws-sign@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz" + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.1.tgz" }, "aws-sign2": { "version": "0.7.0", "from": "aws-sign2@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" }, "aws4": { "version": "1.8.0", "from": "aws4@>=1.8.0 <2.0.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz" + }, + "axios": { + "version": "0.18.0", + "from": "axios@>=0.18.0 <0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz" }, "balanced-match": { "version": "1.0.0", "from": "balanced-match@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, "base64-js": { - "version": "1.2.1", + "version": "1.3.0", "from": "base64-js@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz" - }, - "batch": { - "version": "0.5.0", - "from": "batch@0.5.0", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz" + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz" }, "bcrypt-pbkdf": { "version": "1.0.2", "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" }, "best-encoding": { "version": "0.1.1", "from": "best-encoding@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/best-encoding/-/best-encoding-0.1.1.tgz" }, + "bignumber.js": { + "version": "7.2.1", + "from": "bignumber.js@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz" + }, + "bindings": { + "version": "1.4.0", + "from": "bindings@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.4.0.tgz" + }, + "bintrees": { + "version": "1.0.1", + "from": "bintrees@1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz" + }, "bl": { "version": "0.7.0", "from": "bl@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.7.0.tgz", - "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - } - } + "resolved": "https://registry.npmjs.org/bl/-/bl-0.7.0.tgz" + }, + "body-parser": { + "version": "1.18.3", + "from": "body-parser@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz" }, "boom": { "version": "0.3.8", @@ -154,166 +326,84 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz" }, "brace-expansion": { - "version": "1.1.8", + "version": "1.1.11", "from": "brace-expansion@>=1.1.7 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" }, - "broadway": { - "version": "0.3.6", - "from": "broadway@>=0.3.2 <0.4.0", - "resolved": "https://registry.npmjs.org/broadway/-/broadway-0.3.6.tgz", - "dev": true, - "dependencies": { - "cliff": { - "version": "0.1.9", - "from": "cliff@0.1.9", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.9.tgz", - "dev": true - }, - "winston": { - "version": "0.8.0", - "from": "winston@0.8.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.0.tgz", - "dev": true - } - } + "browser-stdout": { + "version": "1.3.1", + "from": "browser-stdout@1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" }, "buffer": { "version": "4.9.1", "from": "buffer@4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz" }, - "buffer-crc32": { - "version": "0.2.1", - "from": "buffer-crc32@0.2.1", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" + "buffer-equal-constant-time": { + "version": "1.0.1", + "from": "buffer-equal-constant-time@1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + }, + "builtin-modules": { + "version": "3.0.0", + "from": "builtin-modules@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz" }, "bunyan": { - "version": "1.3.6", - "from": "bunyan@1.3.6", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.3.6.tgz", - "dev": true + "version": "1.5.1", + "from": "bunyan@1.5.1", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz" }, "bytes": { - "version": "0.2.1", - "from": "bytes@0.2.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz" + "version": "3.0.0", + "from": "bytes@3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" }, "caseless": { "version": "0.3.0", "from": "caseless@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.3.0.tgz" }, - "chai": { - "version": "4.1.2", - "from": "chai@latest", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz" - }, - "chalk": { - "version": "0.4.0", - "from": "chalk@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "from": "check-error@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - }, - "cliff": { - "version": "0.1.10", - "from": "cliff@>=0.1.9 <0.2.0", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz", - "dev": true, - "dependencies": { - "colors": { - "version": "1.0.3", - "from": "colors@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "dev": true - } - } - }, - "co": { - "version": "4.6.0", - "from": "co@>=4.6.0 <5.0.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "dev": true - }, "coffee-script": { - "version": "1.7.1", - "from": "coffee-script@>=1.7.1 <1.8.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" - }, - "colors": { - "version": "0.6.2", - "from": "colors@>=0.6.0-1 <0.7.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + "version": "1.12.4", + "from": "coffee-script@1.12.4", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" }, "combined-stream": { "version": "0.0.7", "from": "combined-stream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz" }, - "commander": { - "version": "1.3.2", - "from": "commander@1.3.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-1.3.2.tgz" - }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" }, - "configstore": { - "version": "0.3.2", - "from": "configstore@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", - "dev": true, - "dependencies": { - "argparse": { - "version": "1.0.10", - "from": "argparse@>=1.0.7 <2.0.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "from": "esprima@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "dev": true - }, - "graceful-fs": { - "version": "3.0.11", - "from": "graceful-fs@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "from": "js-yaml@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dev": true - } - } + "console-log-level": { + "version": "1.4.0", + "from": "console-log-level@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/console-log-level/-/console-log-level-1.4.0.tgz" }, - "connect": { - "version": "2.12.0", - "from": "connect@2.12.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz" + "content-disposition": { + "version": "0.5.2", + "from": "content-disposition@0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + }, + "content-type": { + "version": "1.0.4", + "from": "content-type@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + }, + "continuation-local-storage": { + "version": "3.2.1", + "from": "continuation-local-storage@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz" }, "cookie": { - "version": "0.1.0", - "from": "cookie@0.1.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz" + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" }, "cookie-jar": { "version": "0.2.0", @@ -321,9 +411,9 @@ "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz" }, "cookie-signature": { - "version": "1.0.1", - "from": "cookie-signature@1.0.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" + "version": "1.0.6", + "from": "cookie-signature@1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "core-util-is": { "version": "1.0.2", @@ -335,263 +425,283 @@ "from": "cryptiles@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz" }, - "crypto-browserify": { - "version": "1.0.9", - "from": "crypto-browserify@1.0.9", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz" - }, - "cycle": { - "version": "1.0.3", - "from": "cycle@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "dev": true - }, "dashdash": { "version": "1.14.1", "from": "dashdash@>=1.12.0 <2.0.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "dev": true - }, - "dateformat": { - "version": "1.0.2-1.2.3", - "from": "dateformat@1.0.2-1.2.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" }, "debug": { - "version": "0.8.1", - "from": "debug@>=0.7.3 <1.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz" + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" }, - "deep-eql": { - "version": "3.0.1", - "from": "deep-eql@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - }, - "deep-equal": { - "version": "1.0.1", - "from": "deep-equal@*", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "dev": true + "delay": { + "version": "4.1.0", + "from": "delay@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.1.0.tgz" }, "delayed-stream": { "version": "0.0.5", "from": "delayed-stream@0.0.5", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" }, - "diff": { - "version": "1.0.7", - "from": "diff@1.0.7", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" + "depd": { + "version": "1.1.2", + "from": "depd@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" }, - "director": { - "version": "1.2.7", - "from": "director@1.2.7", - "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz", - "dev": true + "destroy": { + "version": "1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "dtrace-provider": { - "version": "0.4.0", - "from": "dtrace-provider@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.4.0.tgz", - "dev": true, + "version": "0.6.0", + "from": "dtrace-provider@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz", "optional": true }, + "duplexify": { + "version": "3.6.1", + "from": "duplexify@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@>=2.0.0 <3.0.0", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + } + } + }, "ecc-jsbn": { "version": "0.1.2", "from": "ecc-jsbn@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + }, + "ecdsa-sig-formatter": { + "version": "1.0.10", + "from": "ecdsa-sig-formatter@1.0.10", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz" + }, + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + }, + "emitter-listener": { + "version": "1.1.2", + "from": "emitter-listener@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz" + }, + "encodeurl": { + "version": "1.0.2", + "from": "encodeurl@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + }, + "end-of-stream": { + "version": "1.4.1", + "from": "end-of-stream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz" + }, + "ent": { + "version": "2.2.0", + "from": "ent@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" + }, + "es6-promise": { + "version": "4.2.5", + "from": "es6-promise@>=4.0.3 <5.0.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz" + }, + "es6-promisify": { + "version": "5.0.0", + "from": "es6-promisify@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "escape-string-regexp": { "version": "1.0.5", "from": "escape-string-regexp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, - "esprima": { - "version": "1.0.4", - "from": "esprima@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" - }, - "event-stream": { - "version": "0.5.3", - "from": "event-stream@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.5.3.tgz", - "dev": true, - "dependencies": { - "optimist": { - "version": "0.2.8", - "from": "optimist@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", - "dev": true - } - } - }, - "eventemitter2": { - "version": "0.4.14", - "from": "eventemitter2@>=0.4.9 <0.5.0", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" + "etag": { + "version": "1.8.1", + "from": "etag@>=1.8.1 <1.9.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" }, "events": { "version": "1.1.1", - "from": "events@>=1.1.1 <2.0.0", + "from": "events@1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" }, - "exit": { - "version": "0.1.2", - "from": "exit@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - }, "express": { - "version": "3.4.8", - "from": "express@>=3.4.8 <3.5.0", - "resolved": "https://registry.npmjs.org/express/-/express-3.4.8.tgz", + "version": "4.16.3", + "from": "express@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "dependencies": { - "range-parser": { - "version": "0.0.4", - "from": "range-parser@0.0.4", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + "body-parser": { + "version": "1.18.2", + "from": "body-parser@1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz" + }, + "iconv-lite": { + "version": "0.4.19", + "from": "iconv-lite@0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz" + }, + "qs": { + "version": "6.5.1", + "from": "qs@6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz" + }, + "raw-body": { + "version": "2.3.2", + "from": "raw-body@2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "dependencies": { + "depd": { + "version": "1.1.1", + "from": "depd@1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz" + }, + "http-errors": { + "version": "1.6.2", + "from": "http-errors@1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz" + }, + "setprototypeof": { + "version": "1.0.3", + "from": "setprototypeof@1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz" + } + } + }, + "statuses": { + "version": "1.4.0", + "from": "statuses@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" } } }, "extend": { "version": "3.0.2", "from": "extend@>=3.0.2 <3.1.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" }, "extsprintf": { "version": "1.3.0", "from": "extsprintf@1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "from": "eyes@>=0.1.8 <0.2.0", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" }, "fast-deep-equal": { - "version": "1.1.0", - "from": "fast-deep-equal@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "dev": true + "version": "2.0.1", + "from": "fast-deep-equal@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz" }, "fast-json-stable-stringify": { "version": "2.0.0", "from": "fast-json-stable-stringify@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz" }, - "faye-websocket": { - "version": "0.4.4", - "from": "faye-websocket@>=0.4.3 <0.5.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", - "dev": true + "fast-text-encoding": { + "version": "1.0.0", + "from": "fast-text-encoding@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz" }, - "findup-sync": { - "version": "0.1.3", - "from": "findup-sync@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "file-uri-to-path": { + "version": "1.0.0", + "from": "file-uri-to-path@1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + }, + "finalhandler": { + "version": "1.1.1", + "from": "finalhandler@1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "dependencies": { - "glob": { - "version": "3.2.11", - "from": "glob@>=3.2.9 <3.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "minimatch": { - "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" + "statuses": { + "version": "1.4.0", + "from": "statuses@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" } } }, - "flatiron": { - "version": "0.4.3", - "from": "flatiron@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/flatiron/-/flatiron-0.4.3.tgz", - "dev": true, + "findit2": { + "version": "2.2.3", + "from": "findit2@>=2.2.3 <3.0.0", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz" + }, + "follow-redirects": { + "version": "1.6.1", + "from": "follow-redirects@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", "dependencies": { - "optimist": { - "version": "0.6.0", - "from": "optimist@0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", - "dev": true + "debug": { + "version": "3.1.0", + "from": "debug@3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" } } }, - "forever": { - "version": "0.14.2", - "from": "forever@>=0.14.1 <0.15.0", - "resolved": "https://registry.npmjs.org/forever/-/forever-0.14.2.tgz", - "dev": true - }, "forever-agent": { "version": "0.2.0", "from": "forever-agent@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz" }, - "forever-monitor": { - "version": "1.5.2", - "from": "forever-monitor@>=1.5.1 <1.6.0", - "resolved": "https://registry.npmjs.org/forever-monitor/-/forever-monitor-1.5.2.tgz", - "dev": true, - "dependencies": { - "minimatch": { - "version": "1.0.0", - "from": "minimatch@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "dev": true - } - } - }, "form-data": { "version": "0.0.10", "from": "form-data@>=0.0.3 <0.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz" + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "mime@>=1.2.2 <1.3.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + } + } }, - "formatio": { - "version": "1.2.0", - "from": "formatio@1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz" + "forwarded": { + "version": "0.1.2", + "from": "forwarded@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz" }, "fresh": { - "version": "0.2.0", - "from": "fresh@0.2.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz" + "version": "0.5.2", + "from": "fresh@0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" }, "fs-extra": { "version": "1.0.0", "from": "fs-extra@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz" }, - "gaze": { - "version": "0.4.3", - "from": "gaze@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.4.3.tgz", - "dev": true + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, - "get-func-name": { - "version": "2.0.0", - "from": "get-func-name@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + "gaxios": { + "version": "1.2.7", + "from": "gaxios@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.2.7.tgz" }, - "getobject": { - "version": "0.1.0", - "from": "getobject@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + "gcp-metadata": { + "version": "0.9.3", + "from": "gcp-metadata@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.3.tgz" }, "getpass": { "version": "0.1.7", "from": "getpass@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" }, "gettemporaryfilepath": { "version": "0.0.1", @@ -604,330 +714,146 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "optional": true }, - "globule": { - "version": "0.1.0", - "from": "globule@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "dev": true, + "google-auth-library": { + "version": "2.0.2", + "from": "google-auth-library@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.2.tgz", "dependencies": { - "glob": { - "version": "3.1.21", - "from": "glob@~3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "dev": true - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@~1.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "from": "inherits@1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "from": "lodash@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.11", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dev": true + "gcp-metadata": { + "version": "0.7.0", + "from": "gcp-metadata@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" } } }, + "google-p12-pem": { + "version": "1.0.3", + "from": "google-p12-pem@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.3.tgz" + }, "graceful-fs": { "version": "4.1.11", "from": "graceful-fs@>=4.1.2 <5.0.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" }, - "growl": { - "version": "1.7.0", - "from": "growl@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" - }, - "grunt": { - "version": "0.4.1", - "from": "grunt@0.4.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.1.tgz", - "dev": true, + "gtoken": { + "version": "2.3.2", + "from": "gtoken@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.2.tgz", "dependencies": { - "async": { - "version": "0.1.22", - "from": "async@>=0.1.22 <0.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "dev": true - }, - "coffee-script": { - "version": "1.3.3", - "from": "coffee-script@>=1.3.3 <1.4.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", - "dev": true - }, - "glob": { - "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "dev": true - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "dev": true - }, - "lodash": { - "version": "0.9.2", - "from": "lodash@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@>=0.2.6 <0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dev": true - }, - "rimraf": { - "version": "2.0.3", - "from": "rimraf@>=2.0.2 <2.1.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.3.tgz", - "dev": true, - "dependencies": { - "graceful-fs": { - "version": "1.1.14", - "from": "graceful-fs@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz", - "dev": true, - "optional": true - } - } + "mime": { + "version": "2.4.0", + "from": "mime@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz" } } }, - "grunt-bunyan": { - "version": "0.5.0", - "from": "grunt-bunyan@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/grunt-bunyan/-/grunt-bunyan-0.5.0.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - } - } - }, - "grunt-concurrent": { - "version": "0.4.2", - "from": "grunt-concurrent@0.4.2", - "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-0.4.2.tgz", - "dev": true - }, - "grunt-contrib-clean": { - "version": "0.5.0", - "from": "grunt-contrib-clean@0.5.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", - "dev": true - }, - "grunt-contrib-coffee": { - "version": "0.7.0", - "from": "grunt-contrib-coffee@0.7.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.7.0.tgz", - "dev": true, - "dependencies": { - "coffee-script": { - "version": "1.6.3", - "from": "coffee-script@>=1.6.2 <1.7.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz", - "dev": true - } - } - }, - "grunt-contrib-requirejs": { - "version": "0.4.1", - "from": "grunt-contrib-requirejs@0.4.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.1.tgz", - "dev": true - }, - "grunt-contrib-watch": { - "version": "0.5.3", - "from": "grunt-contrib-watch@0.5.3", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.5.3.tgz", - "dev": true - }, - "grunt-execute": { - "version": "0.2.2", - "from": "grunt-execute@>=0.2.2 <0.3.0", - "resolved": "https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz" - }, - "grunt-forever": { - "version": "0.4.7", - "from": "grunt-forever@>=0.4.4 <0.5.0", - "resolved": "https://registry.npmjs.org/grunt-forever/-/grunt-forever-0.4.7.tgz", - "dev": true - }, - "grunt-legacy-log": { - "version": "0.1.3", - "from": "grunt-legacy-log@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "underscore.string": { - "version": "2.3.3", - "from": "underscore.string@>=2.3.3 <2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" - } - } - }, - "grunt-legacy-log-utils": { - "version": "0.1.1", - "from": "grunt-legacy-log-utils@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "underscore.string": { - "version": "2.3.3", - "from": "underscore.string@~2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" - } - } - }, - "grunt-legacy-util": { - "version": "0.2.0", - "from": "grunt-legacy-util@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "dependencies": { - "async": { - "version": "0.1.22", - "from": "async@~0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" - }, - "lodash": { - "version": "0.9.2", - "from": "lodash@~0.9.2", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" - } - } - }, - "grunt-mocha-test": { - "version": "0.8.2", - "from": "grunt-mocha-test@>=0.8.2 <0.9.0", - "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.8.2.tgz", - "dev": true - }, - "grunt-nodemon": { - "version": "0.2.1", - "from": "grunt-nodemon@0.2.1", - "resolved": "https://registry.npmjs.org/grunt-nodemon/-/grunt-nodemon-0.2.1.tgz", - "dev": true - }, "har-schema": { "version": "2.0.0", "from": "har-schema@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" }, "har-validator": { - "version": "5.1.0", + "version": "5.1.3", "from": "har-validator@>=5.1.0 <5.2.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz" }, - "has-ansi": { - "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" - }, - "has-color": { - "version": "0.1.7", - "from": "has-color@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "dev": true + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" }, "hawk": { "version": "0.10.2", "from": "hawk@>=0.10.2 <0.11.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz" }, + "he": { + "version": "1.1.1", + "from": "he@1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz" + }, "heapdump": { "version": "0.3.9", "from": "heapdump@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/heapdump/-/heapdump-0.3.9.tgz" }, + "hex2dec": { + "version": "1.1.2", + "from": "hex2dec@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz" + }, "hoek": { "version": "0.7.6", "from": "hoek@>=0.7.0 <0.8.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz" }, - "hooker": { - "version": "0.2.3", - "from": "hooker@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + "http-errors": { + "version": "1.6.3", + "from": "http-errors@>=1.6.3 <1.7.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" }, "http-signature": { "version": "1.2.0", "from": "http-signature@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" }, - "i": { - "version": "0.3.6", - "from": "i@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", - "dev": true + "https-proxy-agent": { + "version": "2.2.1", + "from": "https-proxy-agent@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "dependencies": { + "debug": { + "version": "3.2.6", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + }, + "ms": { + "version": "2.1.1", + "from": "ms@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + } + } }, "iconv-lite": { - "version": "0.2.11", - "from": "iconv-lite@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + "version": "0.4.23", + "from": "iconv-lite@0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz" }, "ieee754": { "version": "1.1.8", - "from": "ieee754@>=1.1.4 <2.0.0", + "from": "ieee754@1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz" }, "inflight": { "version": "1.0.6", "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "inherits@2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, - "ini": { - "version": "1.3.5", - "from": "ini@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "dev": true + "ipaddr.js": { + "version": "1.8.0", + "from": "ipaddr.js@1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz" + }, + "is": { + "version": "3.3.0", + "from": "is@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz" + }, + "is-buffer": { + "version": "1.1.6", + "from": "is-buffer@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, "isarray": { "version": "1.0.0", @@ -937,59 +863,37 @@ "isstream": { "version": "0.1.2", "from": "isstream@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "dev": true - }, - "jade": { - "version": "0.26.3", - "from": "jade@0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "dependencies": { - "commander": { - "version": "0.6.1", - "from": "commander@0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" - }, - "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "jmespath": { "version": "0.15.0", "from": "jmespath@0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz" }, - "js-yaml": { - "version": "2.0.5", - "from": "js-yaml@>=2.0.2 <2.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz" - }, "jsbn": { "version": "0.1.1", "from": "jsbn@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + }, + "json-bigint": { + "version": "0.3.0", + "from": "json-bigint@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz" }, "json-schema": { "version": "0.2.3", "from": "json-schema@0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" }, "json-schema-traverse": { - "version": "0.3.1", - "from": "json-schema-traverse@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "dev": true + "version": "0.4.1", + "from": "json-schema-traverse@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" }, "json-stringify-safe": { - "version": "3.0.0", - "from": "json-stringify-safe@>=3.0.0 <3.1.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz" + "version": "5.0.1", + "from": "json-stringify-safe@5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "jsonfile": { "version": "2.4.0", @@ -999,18 +903,17 @@ "jsprim": { "version": "1.4.1", "from": "jsprim@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" }, - "just-extend": { - "version": "1.1.22", - "from": "just-extend@>=1.1.22 <2.0.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz" + "jwa": { + "version": "1.2.0", + "from": "jwa@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.2.0.tgz" }, - "keypress": { - "version": "0.1.0", - "from": "keypress@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz" + "jws": { + "version": "3.2.1", + "from": "jws@>=3.1.5 <4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz" }, "klaw": { "version": "1.3.1", @@ -1019,257 +922,87 @@ }, "knox": { "version": "0.9.2", - "from": "knox@~0.9.1", + "from": "knox@>=0.9.1 <0.10.0", "resolved": "https://registry.npmjs.org/knox/-/knox-0.9.2.tgz", "dependencies": { "debug": { - "version": "1.0.4", - "from": "debug@^1.0.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "dependencies": { - "ms": { - "version": "0.6.2", - "from": "ms@0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - } - } - }, - "mime": { - "version": "1.3.4", - "from": "mime@*", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "once": { - "version": "1.4.0", - "from": "once@^1.3.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - } - }, - "stream-counter": { - "version": "1.0.0", - "from": "stream-counter@^1.0.0", - "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz" - }, - "xml2js": { - "version": "0.4.17", - "from": "xml2js@^0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", - "dependencies": { - "sax": { - "version": "1.2.2", - "from": "sax@>=0.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz" - }, - "xmlbuilder": { - "version": "4.2.1", - "from": "xmlbuilder@^4.1.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "dependencies": { - "lodash": { - "version": "4.17.4", - "from": "lodash@^4.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } - } - } - } + "version": "1.0.5", + "from": "debug@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.5.tgz" } } }, - "lazy": { - "version": "1.0.11", - "from": "lazy@>=1.0.11 <1.1.0", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "dev": true - }, - "lodash": { - "version": "4.17.4", - "from": "lodash@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + "lodash.pickby": { + "version": "4.6.0", + "from": "lodash.pickby@>=4.6.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz" }, "logger-sharelatex": { - "version": "1.5.8", - "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.8", - "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#3f841b014572706e472c47fe0d0c0c1e569bad8c", + "version": "1.6.0", + "from": "logger-sharelatex@1.6.0", + "resolved": "https://registry.npmjs.org/logger-sharelatex/-/logger-sharelatex-1.6.0.tgz", "dependencies": { - "ansi-styles": { - "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + "caseless": { + "version": "0.12.0", + "from": "caseless@>=0.12.0 <0.13.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" }, - "async": { - "version": "0.1.22", - "from": "async@>=0.1.22 <0.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" + "combined-stream": { + "version": "1.0.7", + "from": "combined-stream@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz" }, - "bunyan": { - "version": "1.5.1", - "from": "bunyan@1.5.1", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz" + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, - "chalk": { - "version": "0.5.1", - "from": "chalk@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "coffee-script": { - "version": "1.12.4", - "from": "coffee-script@1.12.4", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" + "form-data": { + "version": "2.3.3", + "from": "form-data@>=2.3.2 <2.4.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" }, - "commander": { - "version": "2.0.0", - "from": "commander@2.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz" + "oauth-sign": { + "version": "0.9.0", + "from": "oauth-sign@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" }, - "dtrace-provider": { + "request": { + "version": "2.88.0", + "from": "request@>=2.88.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz" + }, + "safe-buffer": { + "version": "5.1.2", + "from": "safe-buffer@>=5.1.2 <6.0.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + }, + "tunnel-agent": { "version": "0.6.0", - "from": "dtrace-provider@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz", - "optional": true + "from": "tunnel-agent@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" }, - "fs-extra": { - "version": "0.9.1", - "from": "fs-extra@>=0.9.1 <0.10.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.9.1.tgz", - "dependencies": { - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" - } - } - }, - "glob": { - "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz" - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" - }, - "grunt": { - "version": "0.4.5", - "from": "grunt@>=0.4.5 <0.5.0", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "dependencies": { - "coffee-script": { - "version": "1.3.3", - "from": "coffee-script@>=1.3.3 <1.4.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" - } - } - }, - "grunt-contrib-clean": { - "version": "0.6.0", - "from": "grunt-contrib-clean@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz" - }, - "grunt-contrib-coffee": { - "version": "0.11.1", - "from": "grunt-contrib-coffee@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.11.1.tgz", - "dependencies": { - "coffee-script": { - "version": "1.7.1", - "from": "coffee-script@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - } - } - }, - "grunt-mocha-test": { - "version": "0.11.0", - "from": "grunt-mocha-test@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.11.0.tgz" - }, - "inherits": { - "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" - }, - "jsonfile": { - "version": "1.1.1", - "from": "jsonfile@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz" - }, - "lodash": { - "version": "0.9.2", - "from": "lodash@>=0.9.2 <0.10.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" - }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@>=0.2.12 <0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" - }, - "mocha": { - "version": "1.20.1", - "from": "mocha@>=1.20.0 <1.21.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz", - "dependencies": { - "glob": { - "version": "3.2.3", - "from": "glob@3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz" - }, - "graceful-fs": { - "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" - }, - "inherits": { - "version": "2.0.3", - "from": "inherits@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - } - }, - "nan": { - "version": "2.11.1", - "from": "nan@>=2.0.8 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "optional": true - }, - "ncp": { - "version": "0.5.1", - "from": "ncp@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz" - }, - "strip-ansi": { - "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + "uuid": { + "version": "3.3.2", + "from": "uuid@>=3.3.2 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" } } }, - "lolex": { - "version": "2.1.2", - "from": "lolex@>=2.1.2 <3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.2.tgz" - }, - "lpad": { - "version": "0.1.0", - "from": "lpad@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz", - "dev": true + "long": { + "version": "4.0.0", + "from": "long@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz" }, "lru-cache": { - "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + "version": "5.1.1", + "from": "lru-cache@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" }, "lsmod": { "version": "1.0.0", @@ -1281,10 +1014,15 @@ "from": "lynx@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/lynx/-/lynx-0.1.1.tgz" }, + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + }, "merge-descriptors": { - "version": "0.0.1", - "from": "merge-descriptors@0.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.1.tgz" + "version": "1.0.1", + "from": "merge-descriptors@1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "mersenne": { "version": "0.0.4", @@ -1292,14 +1030,14 @@ "resolved": "https://registry.npmjs.org/mersenne/-/mersenne-0.0.4.tgz" }, "methods": { - "version": "0.1.0", - "from": "methods@0.1.0", - "resolved": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz" + "version": "1.1.2", + "from": "methods@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "metrics-sharelatex": { - "version": "1.3.0", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.3.0", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#080c4aeb696edcd5d6d86f202f2c528f0661d7a6", + "version": "2.1.1", + "from": "metrics-sharelatex@2.1.1", + "resolved": "https://registry.npmjs.org/metrics-sharelatex/-/metrics-sharelatex-2.1.1.tgz", "dependencies": { "coffee-script": { "version": "1.6.0", @@ -1314,80 +1052,81 @@ } }, "mime": { - "version": "1.2.11", - "from": "mime@>=1.2.9 <1.3.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.4.1", + "from": "mime@1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" }, "mime-db": { "version": "1.36.0", "from": "mime-db@>=1.36.0 <1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz" }, "mime-types": { "version": "2.1.20", - "from": "mime-types@>=2.1.19 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "dev": true + "from": "mime-types@>=2.1.18 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz" }, "minimatch": { "version": "3.0.4", "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" }, "minimist": { "version": "0.0.8", "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" - }, "mocha": { - "version": "1.14.0", - "from": "mocha@>=1.14.0 <1.15.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.14.0.tgz", - "dev": true, + "version": "5.2.0", + "from": "mocha@5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", "dependencies": { "commander": { - "version": "2.0.0", - "from": "commander@2.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", - "dev": true + "version": "2.15.1", + "from": "commander@2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" + }, + "debug": { + "version": "3.1.0", + "from": "debug@3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + }, + "diff": { + "version": "3.5.0", + "from": "diff@3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" }, "glob": { - "version": "3.2.3", - "from": "glob@3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "dev": true + "version": "7.1.2", + "from": "glob@7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" }, - "graceful-fs": { - "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "dev": true + "growl": { + "version": "1.10.5", + "from": "growl@1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.11", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dev": true + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" } } }, - "multiparty": { - "version": "2.2.0", - "from": "multiparty@2.2.0", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz" + "module-details-from-path": { + "version": "1.0.3", + "from": "module-details-from-path@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz" }, - "mute-stream": { - "version": "0.0.7", - "from": "mute-stream@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "dev": true + "ms": { + "version": "2.0.0", + "from": "ms@2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" }, "mv": { "version": "2.1.1", @@ -1410,43 +1149,11 @@ } }, "nan": { - "version": "1.5.3", - "from": "nan@>=1.5.1 <1.6.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.5.3.tgz", - "dev": true, + "version": "2.11.0", + "from": "nan@>=2.0.8 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", "optional": true }, - "native-promise-only": { - "version": "0.8.1", - "from": "native-promise-only@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz" - }, - "natives": { - "version": "1.1.4", - "from": "natives@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", - "dev": true - }, - "nconf": { - "version": "0.6.9", - "from": "nconf@>=0.6.9 <0.7.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.6.9.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.2.9", - "from": "async@0.2.9", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz", - "dev": true - }, - "optimist": { - "version": "0.6.0", - "from": "optimist@0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", - "dev": true - } - } - }, "ncp": { "version": "2.0.0", "from": "ncp@>=2.0.0 <2.1.0", @@ -1454,27 +1161,35 @@ "optional": true }, "negotiator": { - "version": "0.3.0", - "from": "negotiator@0.3.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz" + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" }, - "nise": { - "version": "1.0.1", - "from": "nise@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.0.1.tgz", - "dependencies": { - "lolex": { - "version": "1.6.0", - "from": "lolex@>=1.6.0 <2.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz" - } - } + "node-fetch": { + "version": "2.3.0", + "from": "node-fetch@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz" + }, + "node-forge": { + "version": "0.7.6", + "from": "node-forge@>=0.7.4 <0.8.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz" }, "node-transloadit": { "version": "0.0.4", "from": "node-transloadit@0.0.4", "resolved": "https://registry.npmjs.org/node-transloadit/-/node-transloadit-0.0.4.tgz", "dependencies": { + "json-stringify-safe": { + "version": "3.0.0", + "from": "json-stringify-safe@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "mime@>=1.2.7 <1.3.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, "qs": { "version": "0.5.6", "from": "qs@>=0.5.4 <0.6.0", @@ -1497,147 +1212,105 @@ "from": "node-uuid@>=1.4.1 <1.5.0", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz" }, - "nodemon": { - "version": "1.0.20", - "from": "nodemon@>=1.0.9 <1.1.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.0.20.tgz", - "dev": true, - "dependencies": { - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "from": "nopt@>=1.0.10 <1.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" - }, - "noptify": { - "version": "0.0.3", - "from": "noptify@latest", - "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", - "dev": true, - "dependencies": { - "nopt": { - "version": "2.0.0", - "from": "nopt@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", - "dev": true - } - } - }, - "nssocket": { - "version": "0.5.3", - "from": "nssocket@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.5.3.tgz", - "dev": true - }, "oauth-sign": { "version": "0.2.0", "from": "oauth-sign@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz" }, - "object-assign": { - "version": "2.1.1", - "from": "object-assign@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "dev": true + "on-finished": { + "version": "2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" }, "once": { "version": "1.4.0", "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" }, - "optimist": { - "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "dev": true + "p-limit": { + "version": "2.1.0", + "from": "p-limit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz" }, - "os-homedir": { - "version": "1.0.2", - "from": "os-homedir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "dev": true + "p-try": { + "version": "2.0.0", + "from": "p-try@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz" }, - "os-tmpdir": { - "version": "1.0.2", - "from": "os-tmpdir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "dev": true + "parse-duration": { + "version": "0.1.1", + "from": "parse-duration@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.1.1.tgz" }, - "osenv": { - "version": "0.1.5", - "from": "osenv@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "dev": true + "parse-ms": { + "version": "2.0.0", + "from": "parse-ms@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.0.0.tgz" + }, + "parseurl": { + "version": "1.3.2", + "from": "parseurl@>=1.3.2 <1.4.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" }, "path-is-absolute": { "version": "1.0.1", "from": "path-is-absolute@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, + "path-parse": { + "version": "1.0.6", + "from": "path-parse@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" }, "path-to-regexp": { - "version": "1.7.0", - "from": "path-to-regexp@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - } - } - }, - "pathval": { - "version": "1.1.0", - "from": "pathval@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz" - }, - "pause": { - "version": "0.0.1", - "from": "pause@0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" + "version": "0.1.7", + "from": "path-to-regexp@0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "performance-now": { "version": "2.1.0", "from": "performance-now@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" }, - "pkginfo": { - "version": "0.3.1", - "from": "pkginfo@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "dev": true + "pify": { + "version": "4.0.1", + "from": "pify@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" }, "pngcrush": { "version": "0.0.3", "from": "pngcrush@0.0.3", "resolved": "https://registry.npmjs.org/pngcrush/-/pngcrush-0.0.3.tgz" }, - "prompt": { - "version": "0.2.14", - "from": "prompt@0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "dev": true + "pretty-ms": { + "version": "4.0.0", + "from": "pretty-ms@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-4.0.0.tgz" }, - "ps-tree": { - "version": "0.0.3", - "from": "ps-tree@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-0.0.3.tgz", - "dev": true + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz" + }, + "prom-client": { + "version": "11.2.1", + "from": "prom-client@>=11.1.3 <12.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.2.1.tgz" + }, + "protobufjs": { + "version": "6.8.8", + "from": "protobufjs@>=6.8.6 <6.9.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz" + }, + "proxy-addr": { + "version": "2.0.4", + "from": "proxy-addr@>=2.0.3 <2.1.0", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz" }, "psl": { - "version": "1.1.29", + "version": "1.1.31", "from": "psl@>=1.1.24 <2.0.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz" }, "punycode": { "version": "1.3.2", @@ -1645,9 +1318,9 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" }, "qs": { - "version": "0.6.6", - "from": "qs@0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + "version": "6.5.2", + "from": "qs@6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" }, "querystring": { "version": "0.2.0", @@ -1664,21 +1337,6 @@ "from": "raven@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz", "dependencies": { - "cookie": { - "version": "0.3.1", - "from": "cookie@0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" - }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "json-stringify-safe@5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, - "stack-trace": { - "version": "0.0.9", - "from": "stack-trace@0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" - }, "uuid": { "version": "3.0.0", "from": "uuid@3.0.0", @@ -1687,20 +1345,14 @@ } }, "raw-body": { - "version": "1.1.2", - "from": "raw-body@1.1.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz" - }, - "read": { - "version": "1.0.7", - "from": "read@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "dev": true + "version": "2.3.3", + "from": "raw-body@2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz" }, "readable-stream": { - "version": "1.1.14", - "from": "readable-stream@>=1.1.9 <1.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "version": "1.0.34", + "from": "readable-stream@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "isarray": { "version": "0.0.1", @@ -1745,27 +1397,43 @@ } } }, + "require-in-the-middle": { + "version": "3.1.0", + "from": "require-in-the-middle@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-3.1.0.tgz" + }, "require-like": { "version": "0.1.2", "from": "require-like@0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" - }, - "requirejs": { - "version": "2.1.22", - "from": "requirejs@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", "dev": true }, + "resolve": { + "version": "1.10.0", + "from": "resolve@>=1.5.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz" + }, "response": { "version": "0.14.0", "from": "response@0.14.0", - "resolved": "https://registry.npmjs.org/response/-/response-0.14.0.tgz" + "resolved": "https://registry.npmjs.org/response/-/response-0.14.0.tgz", + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "mime@>=1.2.11 <1.3.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + } + } }, - "revalidator": { - "version": "0.1.8", - "from": "revalidator@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "dev": true + "retry-axios": { + "version": "0.3.2", + "from": "retry-axios@0.3.2", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz" + }, + "retry-request": { + "version": "4.0.0", + "from": "retry-request@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.0.0.tgz" }, "rimraf": { "version": "2.2.8", @@ -1773,38 +1441,26 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" }, "safe-buffer": { - "version": "5.1.2", - "from": "safe-buffer@>=5.1.1 <5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version": "5.1.1", + "from": "safe-buffer@5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, "safe-json-stringify": { - "version": "1.0.4", + "version": "1.2.0", "from": "safe-json-stringify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", "optional": true }, "safer-buffer": { "version": "2.1.2", - "from": "safer-buffer@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "dev": true - }, - "samsam": { - "version": "1.2.1", - "from": "samsam@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz" + "from": "safer-buffer@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" }, "sandboxed-module": { "version": "2.0.3", "from": "sandboxed-module@latest", "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.3.tgz", - "dependencies": { - "stack-trace": { - "version": "0.0.9", - "from": "stack-trace@0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" - } - } + "dev": true }, "sax": { "version": "1.2.1", @@ -1812,27 +1468,36 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" }, "semver": { - "version": "2.3.2", - "from": "semver@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "dev": true + "version": "5.6.0", + "from": "semver@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz" }, "send": { - "version": "0.1.4", - "from": "send@0.1.4", - "resolved": "https://registry.npmjs.org/send/-/send-0.1.4.tgz", + "version": "0.16.2", + "from": "send@0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "dependencies": { - "range-parser": { - "version": "0.0.4", - "from": "range-parser@0.0.4", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + "statuses": { + "version": "1.4.0", + "from": "statuses@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" } } }, + "serve-static": { + "version": "1.13.2", + "from": "serve-static@1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" + }, + "setprototypeof": { + "version": "1.1.0", + "from": "setprototypeof@1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + }, "settings-sharelatex": { - "version": "1.0.0", - "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", - "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#cbc5e41c1dbe6789721a14b3fdae05bf22546559", + "version": "1.1.0", + "from": "settings-sharelatex@1.1.0", + "resolved": "https://registry.npmjs.org/settings-sharelatex/-/settings-sharelatex-1.1.0.tgz", "dependencies": { "coffee-script": { "version": "1.6.0", @@ -1841,65 +1506,55 @@ } } }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" - }, - "sinon": { - "version": "3.2.1", - "from": "sinon@latest", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.2.1.tgz", - "dependencies": { - "diff": { - "version": "3.3.1", - "from": "diff@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz" - } - } + "shimmer": { + "version": "1.2.1", + "from": "shimmer@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz" }, "sntp": { "version": "0.1.4", "from": "sntp@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz" }, - "sprintf-js": { - "version": "1.0.3", - "from": "sprintf-js@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "dev": true + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + }, + "split": { + "version": "1.0.1", + "from": "split@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz" }, "sshpk": { - "version": "1.14.2", + "version": "1.16.1", "from": "sshpk@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" }, "stack-trace": { - "version": "0.0.7", - "from": "stack-trace@0.0.7", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.7.tgz", - "dev": true + "version": "0.0.9", + "from": "stack-trace@0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" }, "statsd-parser": { "version": "0.0.4", "from": "statsd-parser@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/statsd-parser/-/statsd-parser-0.0.4.tgz" }, + "statuses": { + "version": "1.5.0", + "from": "statuses@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + }, "stream-browserify": { "version": "2.0.1", "from": "stream-browserify@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz" - }, "readable-stream": { "version": "2.3.6", "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" }, "string_decoder": { "version": "1.1.1", @@ -1914,59 +1569,61 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz" }, "stream-counter": { - "version": "0.2.0", - "from": "stream-counter@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" + "version": "1.0.0", + "from": "stream-counter@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz" + }, + "stream-shift": { + "version": "1.0.0", + "from": "stream-shift@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz" }, "string_decoder": { "version": "0.10.31", "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, - "strip-ansi": { + "symbol-observable": { + "version": "1.2.0", + "from": "symbol-observable@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" + }, + "tdigest": { "version": "0.1.1", - "from": "strip-ansi@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "dev": true + "from": "tdigest@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz" }, - "supports-color": { - "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" - }, - "text-encoding": { - "version": "0.6.4", - "from": "text-encoding@0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz" - }, - "timekeeper": { - "version": "1.0.0", - "from": "timekeeper@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-1.0.0.tgz" - }, - "timespan": { - "version": "2.3.0", - "from": "timespan@>=2.3.0 <2.4.0", - "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", - "dev": true - }, - "tiny-lr": { - "version": "0.0.4", - "from": "tiny-lr@0.0.4", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.0.4.tgz", - "dev": true, + "teeny-request": { + "version": "3.11.3", + "from": "teeny-request@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", "dependencies": { - "debug": { - "version": "0.7.4", - "from": "debug@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "dev": true + "uuid": { + "version": "3.3.2", + "from": "uuid@^3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + } + } + }, + "through": { + "version": "2.3.8", + "from": "through@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "through2": { + "version": "2.0.5", + "from": "through2@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.1.5", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" }, - "qs": { - "version": "0.5.6", - "from": "qs@>=0.5.2 <0.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "dev": true + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" } } }, @@ -1974,13 +1631,11 @@ "version": "2.4.3", "from": "tough-cookie@>=2.4.3 <2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "dev": true, "dependencies": { "punycode": { "version": "1.4.1", "from": "punycode@>=1.4.1 <2.0.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" } } }, @@ -1992,107 +1647,32 @@ "tweetnacl": { "version": "0.14.5", "from": "tweetnacl@>=0.14.0 <0.15.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" }, - "type-detect": { - "version": "4.0.3", - "from": "type-detect@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz" - }, - "uid2": { - "version": "0.0.3", - "from": "uid2@0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" + "type-is": { + "version": "1.6.16", + "from": "type-is@>=1.6.16 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" }, "underscore": { "version": "1.5.2", "from": "underscore@>=1.5.2 <1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz" }, - "underscore.string": { - "version": "2.2.1", - "from": "underscore.string@>=2.2.0-rc <2.3.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" + "unpipe": { + "version": "1.0.0", + "from": "unpipe@1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" }, - "update-notifier": { - "version": "0.1.10", - "from": "update-notifier@>=0.1.8 <0.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.10.tgz", - "dev": true, + "uri-js": { + "version": "4.2.2", + "from": "uri-js@>=4.2.2 <5.0.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "dependencies": { - "caseless": { - "version": "0.12.0", - "from": "caseless@>=0.12.0 <0.13.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "from": "combined-stream@>=1.0.6 <1.1.0", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "from": "forever-agent@>=0.6.1 <0.7.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "from": "form-data@>=2.3.2 <2.4.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.1 <5.1.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "from": "oauth-sign@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "dev": true - }, - "qs": { - "version": "6.5.2", - "from": "qs@>=6.5.2 <6.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "dev": true - }, - "request": { - "version": "2.88.0", - "from": "request@>=2.36.0 <3.0.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "from": "safe-buffer@>=5.1.2 <6.0.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "from": "tunnel-agent@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "from": "uuid@>=3.3.2 <4.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "dev": true + "punycode": { + "version": "2.1.1", + "from": "punycode@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" } } }, @@ -2101,94 +1681,50 @@ "from": "url@0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz" }, - "user-home": { - "version": "1.1.1", - "from": "user-home@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, - "utile": { - "version": "0.2.1", - "from": "utile@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "dev": true, - "dependencies": { - "ncp": { - "version": "0.4.2", - "from": "ncp@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "dev": true - } - } + "utils-merge": { + "version": "1.0.1", + "from": "utils-merge@1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" }, - "uuid": { - "version": "2.0.3", - "from": "uuid@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "dev": true + "vary": { + "version": "1.1.2", + "from": "vary@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" }, "verror": { "version": "1.10.0", "from": "verror@1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "dev": true - }, - "watch": { - "version": "0.13.0", - "from": "watch@>=0.13.0 <0.14.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.13.0.tgz", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - } - } - }, - "which": { - "version": "1.0.9", - "from": "which@>=1.0.5 <1.1.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" - }, - "winston": { - "version": "0.8.3", - "from": "winston@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" }, "wrappy": { "version": "1.0.2", "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" }, - "xdg-basedir": { - "version": "1.0.1", - "from": "xdg-basedir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz", - "dev": true - }, "xml2js": { - "version": "0.4.17", - "from": "xml2js@0.4.17", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz" + "version": "0.4.19", + "from": "xml2js@0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz" }, "xmlbuilder": { - "version": "4.2.1", - "from": "xmlbuilder@4.2.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz" + "version": "9.0.7", + "from": "xmlbuilder@>=9.0.1 <9.1.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz" + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.1 <4.1.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "yallist": { + "version": "3.0.3", + "from": "yallist@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz" } } } diff --git a/services/filestore/package.json b/services/filestore/package.json index 80d4a06240..a9163666cd 100644 --- a/services/filestore/package.json +++ b/services/filestore/package.json @@ -7,19 +7,31 @@ "url": "https://github.com/sharelatex/filestore-sharelatex.git" }, "scripts": { - "compile:app": "coffee -o app/js -c app/coffee && coffee -c app.coffee", - "start": "npm run compile:app && node app.js" + "test:acceptance:run": "mocha --recursive --reporter spec --timeout 15000 $@ test/acceptance/js", + "test:acceptance": "npm run compile:app && npm run compile:acceptance_tests && npm run test:acceptance:_run -- --grep=$MOCHA_GREP", + "test:unit:run": "mocha --recursive --reporter spec $@ test/unit/js", + "test:unit": "npm run compile:app && npm run compile:unit_tests && npm run test:unit:_run -- --grep=$MOCHA_GREP", + "compile:unit_tests": "[ ! -e test/unit/coffee ] && echo 'No unit tests to compile' || coffee -o test/unit/js -c test/unit/coffee", + "compile:acceptance_tests": "[ ! -e test/acceptance/coffee ] && echo 'No acceptance tests to compile' || coffee -o test/acceptance/js -c test/acceptance/coffee", + "compile:app": "([ -e app/coffee ] && coffee -m $COFFEE_OPTIONS -o app/js -c app/coffee || echo 'No CoffeeScript folder to compile') && ( [ -e app.coffee ] && coffee -m $COFFEE_OPTIONS -c app.coffee || echo 'No CoffeeScript app to compile')", + "compile:all": "npm run compile:app && npm run compile:unit_tests && npm run compile:acceptance_tests && npm run compile:smoke_tests", + "start": "npm run compile:app && node $NODE_APP_OPTIONS app.js", + "nodemon": "nodemon --config nodemon.json", + "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 30000 --exit $@ test/acceptance/js", + "test:unit:_run": "mocha --recursive --reporter spec --exit $@ test/unit/js", + "compile:smoke_tests": "[ ! -e test/smoke/coffee ] && echo 'No smoke tests to compile' || coffee -o test/smoke/js -c test/smoke/coffee" }, "dependencies": { "async": "~0.2.10", "aws-sdk": "^2.1.39", - "coffee-script": "~1.7.1", - "express": "~3.4.8", + "body-parser": "^1.2.0", + "express": "^4.2.0", "fs-extra": "^1.0.0", "heapdump": "^0.3.2", "knox": "~0.9.1", - "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.8", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.3.0", + "logger-sharelatex": "^1.6.0", + "metrics-sharelatex": "^2.1.1", + "mocha": "5.2.0", "node-transloadit": "0.0.4", "node-uuid": "~1.4.1", "pngcrush": "0.0.3", @@ -28,26 +40,15 @@ "request": "2.14.0", "response": "0.14.0", "rimraf": "2.2.8", - "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", + "settings-sharelatex": "^1.1.0", "stream-browserify": "^2.0.1", "stream-buffers": "~0.2.5", "underscore": "~1.5.2" }, "devDependencies": { - "sinon": "", - "chai": "", - "sandboxed-module": "", "bunyan": "^1.3.5", - "grunt": "0.4.1", - "grunt-bunyan": "^0.5.0", - "grunt-execute": "^0.2.2", - "grunt-mocha-test": "~0.8.2", - "grunt-contrib-requirejs": "0.4.1", - "grunt-contrib-coffee": "0.7.0", - "grunt-contrib-watch": "0.5.3", - "grunt-nodemon": "0.2.1", - "grunt-contrib-clean": "0.5.0", - "grunt-concurrent": "0.4.2", - "grunt-forever": "~0.4.4" + "chai": "4.2.0", + "sandboxed-module": "2.0.3", + "sinon": "7.1.1" } } diff --git a/services/filestore/test/acceptance/coffee/FilestoreApp.coffee b/services/filestore/test/acceptance/coffee/FilestoreApp.coffee new file mode 100644 index 0000000000..818e90ec6f --- /dev/null +++ b/services/filestore/test/acceptance/coffee/FilestoreApp.coffee @@ -0,0 +1,24 @@ +app = require('../../../app') +require("logger-sharelatex").logger.level("info") +logger = require("logger-sharelatex") +Settings = require("settings-sharelatex") + +module.exports = + running: false + initing: false + callbacks: [] + ensureRunning: (callback = (error) ->) -> + if @running + return callback() + else if @initing + @callbacks.push callback + else + @initing = true + @callbacks.push callback + app.listen Settings.internal?.filestore?.port, "localhost", (error) => + throw error if error? + @running = true + logger.log("filestore running in dev mode") + + for callback in @callbacks + callback() \ No newline at end of file diff --git a/services/filestore/test/acceptence/coffee/SendingFileTest.coffee b/services/filestore/test/acceptance/coffee/SendingFileTest.coffee similarity index 94% rename from services/filestore/test/acceptence/coffee/SendingFileTest.coffee rename to services/filestore/test/acceptance/coffee/SendingFileTest.coffee index 2731e25565..cee06e82a3 100644 --- a/services/filestore/test/acceptence/coffee/SendingFileTest.coffee +++ b/services/filestore/test/acceptance/coffee/SendingFileTest.coffee @@ -1,4 +1,3 @@ - assert = require("chai").assert sinon = require('sinon') chai = require('chai') @@ -9,6 +8,7 @@ SandboxedModule = require('sandboxed-module') fs = require("fs") request = require("request") settings = require("settings-sharelatex") +FilestoreApp = require "./FilestoreApp" describe "Filestore", -> @@ -26,8 +26,9 @@ describe "Filestore", -> @filestoreUrl = "http://localhost:#{settings.internal.filestore.port}" beforeEach (done)-> - fs.unlink @localFileWritePath, => - done() + FilestoreApp.ensureRunning => + fs.unlink @localFileWritePath, -> + done() @@ -135,18 +136,18 @@ describe "Filestore", -> describe "getting the preview image", -> beforeEach -> - @fileUrl = @fileUrl + '?style=preview' + @previewFileUrl = "#{@fileUrl}?style=preview" it "should not time out", (done) -> @timeout(1000 * 20) - request.get @fileUrl, (err, response, body) => + request.get @previewFileUrl, (err, response, body) => expect(response).to.not.equal null done() it "should respond with image data", (done) -> # note: this test relies of the imagemagick conversion working @timeout(1000 * 20) - request.get @fileUrl, (err, response, body) => + request.get @previewFileUrl, (err, response, body) => expect(response.statusCode).to.equal 200 expect(body.length).to.be.greaterThan 400 done() diff --git a/services/filestore/test/unit/coffee/BucketControllerTests.coffee b/services/filestore/test/unit/coffee/BucketControllerTests.coffee index 461f3f03d6..c6bbabc89e 100644 --- a/services/filestore/test/unit/coffee/BucketControllerTests.coffee +++ b/services/filestore/test/unit/coffee/BucketControllerTests.coffee @@ -35,6 +35,8 @@ describe "BucketController", -> "./FileHandler": @FileHandler "./PersistorManager":@PersistorManager "settings-sharelatex": @settings + "metrics-sharelatex": + inc:-> "logger-sharelatex": log:-> err:-> diff --git a/services/filestore/test/unit/coffee/FSPersistorManagerTests.coffee b/services/filestore/test/unit/coffee/FSPersistorManagerTests.coffee index f762b7a89f..7df7adfd8b 100644 --- a/services/filestore/test/unit/coffee/FSPersistorManagerTests.coffee +++ b/services/filestore/test/unit/coffee/FSPersistorManagerTests.coffee @@ -121,20 +121,16 @@ describe "FSPersistorManagerTests", -> describe "error conditions", -> - beforeEach -> - @fakeCode = 'ENOENT' - @Fs.createReadStream.returns( - on: (key, callback) => - err = new Error() - err.code = @fakeCode - callback(err, null) - ) - describe "when the file does not exist", -> beforeEach -> @fakeCode = 'ENOENT' - + @Fs.createReadStream.returns( + on: (key, callback) => + err = new Error() + err.code = @fakeCode + callback(err, null) + ) it "should give a NotFoundError", (done) -> @FSPersistorManager.getFileStream @location, @name1, @opts, (err,res)=> expect(res).to.equal null @@ -146,6 +142,12 @@ describe "FSPersistorManagerTests", -> beforeEach -> @fakeCode = 'SOMETHINGHORRIBLE' + @Fs.createReadStream.returns( + on: (key, callback) => + err = new Error() + err.code = @fakeCode + callback(err, null) + ) it "should give an Error", (done) -> @FSPersistorManager.getFileStream @location, @name1, @opts, (err,res)=> diff --git a/services/filestore/test/unit/coffee/FileControllerTests.coffee b/services/filestore/test/unit/coffee/FileControllerTests.coffee index 0645aff27c..09398b8c01 100644 --- a/services/filestore/test/unit/coffee/FileControllerTests.coffee +++ b/services/filestore/test/unit/coffee/FileControllerTests.coffee @@ -31,6 +31,8 @@ describe "FileController", -> "./Errors": @Errors = NotFoundError: sinon.stub() "settings-sharelatex": @settings + "metrics-sharelatex": + inc:-> "logger-sharelatex": log:-> err:-> diff --git a/services/filestore/test/unit/coffee/FileConverterTests.coffee b/services/filestore/test/unit/coffee/FileConverterTests.coffee index bdb908be98..ed59d56376 100644 --- a/services/filestore/test/unit/coffee/FileConverterTests.coffee +++ b/services/filestore/test/unit/coffee/FileConverterTests.coffee @@ -16,6 +16,10 @@ describe "FileConverter", -> "logger-sharelatex": log:-> err:-> + "metrics-sharelatex": + inc:-> + Timer:-> + done:-> "settings-sharelatex": @Settings = commands: convertCommandPrefix: [] diff --git a/services/filestore/test/unit/coffee/ImageOptimiserTests.coffee b/services/filestore/test/unit/coffee/ImageOptimiserTests.coffee index e16d8e0917..398eacf70f 100644 --- a/services/filestore/test/unit/coffee/ImageOptimiserTests.coffee +++ b/services/filestore/test/unit/coffee/ImageOptimiserTests.coffee @@ -11,13 +11,16 @@ describe "ImageOptimiser", -> beforeEach -> @child_process = exec : sinon.stub() - + @settings = + enableConversions:true @optimiser = SandboxedModule.require modulePath, requires: 'child_process': @child_process "logger-sharelatex": log:-> err:-> warn:-> + "settings-sharelatex": @settings + @sourcePath = "/this/path/here.eps" @error = "Error" @@ -33,18 +36,29 @@ describe "ImageOptimiser", -> done() - it "should return the errro the file", (done)-> + it "should return the error", (done)-> @child_process.exec.callsArgWith(2, @error) @optimiser.compressPng @sourcePath, (err)=> err.should.equal @error done() - describe 'when optimiser is sigkilled', -> + describe 'when enableConversions is disabled', -> - it 'should not produce an error', (done) -> - @error = new Error('woops') - @error.signal = 'SIGKILL' - @child_process.exec.callsArgWith(2, @error) - @optimiser.compressPng @sourcePath, (err)=> - expect(err).to.equal(null) - done() + it 'should produce an error', (done) -> + @settings.enableConversions = false + @child_process.exec.callsArgWith(2) + @optimiser.compressPng @sourcePath, (err)=> + @child_process.exec.called.should.equal false + expect(err).to.exist + done() + + + describe 'when optimiser is sigkilled', -> + + it 'should not produce an error', (done) -> + @error = new Error('woops') + @error.signal = 'SIGKILL' + @child_process.exec.callsArgWith(2, @error) + @optimiser.compressPng @sourcePath, (err)=> + expect(err).to.equal(null) + done() diff --git a/services/filestore/test/unit/coffee/LocalFileWriterTests.coffee b/services/filestore/test/unit/coffee/LocalFileWriterTests.coffee index a6bc964e0f..55cf1f551f 100644 --- a/services/filestore/test/unit/coffee/LocalFileWriterTests.coffee +++ b/services/filestore/test/unit/coffee/LocalFileWriterTests.coffee @@ -30,6 +30,11 @@ describe "LocalFileWriter", -> log:-> err:-> "settings-sharelatex":@settings + "metrics-sharelatex": + inc:-> + Timer:-> + done:-> + @stubbedFsPath = "something/uploads/eio2k1j3" describe "writeStrem", -> diff --git a/services/filestore/test/unit/coffee/PersistorManagerTests.coffee b/services/filestore/test/unit/coffee/PersistorManagerTests.coffee index ca7a82cbaa..3c4ca329e1 100644 --- a/services/filestore/test/unit/coffee/PersistorManagerTests.coffee +++ b/services/filestore/test/unit/coffee/PersistorManagerTests.coffee @@ -66,14 +66,14 @@ describe "PersistorManagerTests", -> describe "test unspecified mixins", -> it "should load s3 when no wrapper specified", (done) -> - @settings = + @settings = {filestore:{}} @requires = "./S3PersistorManager": @S3PersistorManager "settings-sharelatex": @settings "logger-sharelatex": log:-> err:-> - @PersistorManager=SandboxedModule.require modulePath, requires: @requires + @PersistorManager = SandboxedModule.require modulePath, requires: @requires @PersistorManager.should.respondTo("getFileStream") @PersistorManager.getFileStream() @S3PersistorManager.getFileStream.calledOnce.should.equal true diff --git a/services/filestore/test/unit/coffee/S3PersistorManagerTests.coffee b/services/filestore/test/unit/coffee/S3PersistorManagerTests.coffee index 7fc70c5065..1eee09dc29 100644 --- a/services/filestore/test/unit/coffee/S3PersistorManagerTests.coffee +++ b/services/filestore/test/unit/coffee/S3PersistorManagerTests.coffee @@ -110,21 +110,17 @@ describe "S3PersistorManagerTests", -> describe "error conditions", -> - beforeEach -> - @fakeResponse = - statusCode: 500 - @stubbedKnoxClient.get.returns( - on: (key, callback) => - if key == 'response' - callback(@fakeResponse) - end: -> - ) - describe "when the file doesn't exist", -> beforeEach -> @fakeResponse = statusCode: 404 + @stubbedKnoxClient.get.returns( + on: (key, callback) => + if key == 'response' + callback(@fakeResponse) + end: -> + ) it "should produce a NotFoundError", (done) -> @S3PersistorManager.getFileStream @bucketName, @key, @opts, (err, stream)=> # empty callback @@ -145,6 +141,12 @@ describe "S3PersistorManagerTests", -> beforeEach -> @fakeResponse = statusCode: 500 + @stubbedKnoxClient.get.returns( + on: (key, callback) => + if key == 'response' + callback(@fakeResponse) + end: -> + ) it "should produce an error", (done) -> @S3PersistorManager.getFileStream @bucketName, @key, @opts, (err, stream)=> # empty callback @@ -314,4 +316,4 @@ describe "S3PersistorManagerTests", -> @stubbedKnoxClient.list.callsArgWith(1, null, data) @S3PersistorManager.directorySize @bucketName, @key, (err, totalSize)=> totalSize.should.equal 3072 - done() + done() \ No newline at end of file diff --git a/services/filestore/test/unit/coffee/SafeExec.coffee b/services/filestore/test/unit/coffee/SafeExecTests.coffee similarity index 81% rename from services/filestore/test/unit/coffee/SafeExec.coffee rename to services/filestore/test/unit/coffee/SafeExecTests.coffee index 10d920df11..1be22f3993 100644 --- a/services/filestore/test/unit/coffee/SafeExec.coffee +++ b/services/filestore/test/unit/coffee/SafeExecTests.coffee @@ -9,11 +9,13 @@ SandboxedModule = require('sandboxed-module') describe "SafeExec", -> beforeEach -> - + @settings = + enableConversions:true @safe_exec = SandboxedModule.require modulePath, requires: "logger-sharelatex": log:-> err:-> + "settings-sharelatex": @settings @options = {timeout: 10*1000, killSignal: "SIGTERM" } describe "safe_exec", -> @@ -24,6 +26,12 @@ describe "SafeExec", -> should.not.exist(err) done() + it "should error when conversions are disabled", (done) -> + @settings.enableConversions = false + @safe_exec ["/bin/echo", "hello"], @options, (err, stdout, stderr) => + expect(err).to.exist + done() + it "should execute a command with non-zero exit status", (done) -> @safe_exec ["/usr/bin/env", "false"], @options, (err, stdout, stderr) => stdout.should.equal ""