diff --git a/services/chat/.dockerignore b/services/chat/.dockerignore index 386f26df30..ba1c3442de 100644 --- a/services/chat/.dockerignore +++ b/services/chat/.dockerignore @@ -5,5 +5,3 @@ gitrev .npm .nvmrc nodemon.json -app.js -**/js/* diff --git a/services/chat/.eslintrc b/services/chat/.eslintrc new file mode 100644 index 0000000000..d55c4160bb --- /dev/null +++ b/services/chat/.eslintrc @@ -0,0 +1,75 @@ +{ + "extends": [ + "standard", + "standard-react", + "prettier", + "prettier/react", + "prettier/standard", + "plugin:jsx-a11y/recommended" + ], + "plugins": [ + "prettier", + "jsx-a11y", + "mocha", + "chai-expect", + "chai-friendly" + ], + "env": { + "mocha": true + }, + "globals": { + "expect": true, + "define": true, + "$": true, + "angular": true, + // Injected in layout.pug + "user_id": true + }, + "settings": { + // Tell eslint-plugin-react which version of React we are using + "react": { + "version": "15" + } + }, + "rules": { + "max-len": ["error", { + "ignoreUrls": true, + // Ignore long describe/it test blocks, long import/require statements + "ignorePattern": "(^\\s*(it|describe)\\s*\\(['\"]|^import\\s*.*\\s*from\\s*['\"]|^.*\\s*=\\s*require\\(['\"])" + }], + + // Fix conflict between prettier & standard by overriding to prefer + // double quotes + "jsx-quotes": ["error", "prefer-double"], + + // Override weird behaviour of jsx-a11y label-has-for (says labels must be + // nested *and* have for/id attributes) + "jsx-a11y/label-has-for": [ + "error", + { + "required": { + "some": [ + "nesting", + "id" + ] + } + } + ], + + // Add some mocha specific rules + "mocha/handle-done-callback": "error", + "mocha/no-exclusive-tests": "error", + "mocha/no-global-tests": "error", + "mocha/no-identical-title": "error", + "mocha/no-nested-tests": "error", + "mocha/no-pending-tests": "error", + "mocha/no-skipped-tests": "error", + + // Add some chai specific rules + "chai-expect/missing-assertion": "error", + "chai-expect/terminating-properties": "error", + // Swap the no-unused-expressions rule with a more chai-friendly one + "no-unused-expressions": 0, + "chai-friendly/no-unused-expressions": "error" + } +} diff --git a/services/chat/.gitignore b/services/chat/.gitignore index ba6632606f..c689cc0f57 100644 --- a/services/chat/.gitignore +++ b/services/chat/.gitignore @@ -1,12 +1,9 @@ **.swp -app.js -app/js/ -test/unit/js/ -test/acceptance/js/ public/build/ node_modules/ -/public/js/chat.js plato/ + +**/*.map diff --git a/services/chat/.prettierrc b/services/chat/.prettierrc new file mode 100644 index 0000000000..b2095be81e --- /dev/null +++ b/services/chat/.prettierrc @@ -0,0 +1,4 @@ +{ + "semi": false, + "singleQuote": true +} diff --git a/services/chat/Dockerfile b/services/chat/Dockerfile index 9ead057334..d3c288c077 100644 --- a/services/chat/Dockerfile +++ b/services/chat/Dockerfile @@ -10,7 +10,6 @@ RUN npm install --quiet COPY . /app -RUN npm run compile:all FROM node:6.14.1 @@ -19,4 +18,4 @@ COPY --from=app /app /app WORKDIR /app USER node -CMD ["node","app.js"] +CMD ["node", "--expose-gc", "app.js"] diff --git a/services/chat/Gruntfile.coffee b/services/chat/Gruntfile.coffee deleted file mode 100644 index b4d7b91f34..0000000000 --- a/services/chat/Gruntfile.coffee +++ /dev/null @@ -1,97 +0,0 @@ -module.exports = (grunt) -> - - # Project configuration. - grunt.initConfig - forever: - app: - options: - index: "app.js" - - execute: - app: - src: "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'], - dest: './', - ext: '.js' - - unit_tests: - expand: true, - flatten: false, - cwd: 'test/unit/coffee', - src: ['**/*.coffee'], - dest: 'test/unit/js/', - ext: '.js' - - acceptance_tests: - expand: true, - flatten: false, - cwd: 'test/acceptance/coffee', - src: ['**/*.coffee'], - dest: 'test/acceptance/js/', - ext: '.js' - - watch: - server_coffee: - files: ['app/**/*.coffee', 'test/unit/**/*.coffee'] - tasks: ['compile:server', 'compile:unit_tests', 'mochaTest'] - - clean: ["app/js", "test/unit/js"] - - nodemon: - dev: - options: - file: 'app.js' - - concurrent: - dev: - tasks: ['nodemon', 'watch'] - options: - logConcurrentOutput: true - - mochaTest: - unit: - options: - reporter: process.env.MOCHA_RUNNER || "spec" - grep: grunt.option("grep") - src: ['test/unit/**/*.js'] - acceptance: - options: - reporter: process.env.MOCHA_RUNNER || "spec" - grep: grunt.option("grep") - src: ['test/acceptance/**/*.js'] - - plato: - your_task: - files: 'plato': ['app/js/**/*.js'], - - 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-plato' - grunt.loadNpmTasks 'grunt-execute' - grunt.loadNpmTasks 'grunt-bunyan' - grunt.loadNpmTasks 'grunt-forever' - - - grunt.registerTask 'compile', ['clean', 'coffee'] - grunt.registerTask 'install', ['compile'] - grunt.registerTask 'default', ['compile', 'bunyan', 'execute'] - grunt.registerTask 'test:unit', ['compile', 'mochaTest:unit'] - grunt.registerTask 'test:acceptance', ['compile:acceptance_tests', 'mochaTest:acceptance'] - diff --git a/services/chat/Makefile b/services/chat/Makefile index 0266edfb8b..9746397c98 100644 --- a/services/chat/Makefile +++ b/services/chat/Makefile @@ -1,7 +1,7 @@ # 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.9 +# Version: 1.1.11 BUILD_NUMBER ?= local BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) @@ -17,12 +17,10 @@ DOCKER_COMPOSE := BUILD_NUMBER=$(BUILD_NUMBER) \ 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 +lint: + $(DOCKER_COMPOSE) run --rm test_unit npm run lint -test: test_unit test_acceptance +test: lint test_unit test_acceptance test_unit: @[ ! -d test/unit ] && echo "chat has no unit tests" || $(DOCKER_COMPOSE) run --rm test_unit diff --git a/services/chat/app.coffee b/services/chat/app.coffee deleted file mode 100644 index 3fad2e610e..0000000000 --- a/services/chat/app.coffee +++ /dev/null @@ -1,13 +0,0 @@ -logger = require 'logger-sharelatex' -settings = require 'settings-sharelatex' - -Server = require "./app/js/server" - -if !module.parent # Called directly - port = settings.internal?.chat?.port or 3010 - host = settings.internal?.chat?.host or "localhost" - Server.server.listen port, host, (error) -> - throw error if error? - logger.info "Chat starting up, listening on #{host}:#{port}" - -module.exports = Server.server diff --git a/services/chat/app.js b/services/chat/app.js new file mode 100644 index 0000000000..ceeaa2ce85 --- /dev/null +++ b/services/chat/app.js @@ -0,0 +1,39 @@ +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * DS103: Rewrite code to no longer use __guard__ + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const logger = require('logger-sharelatex') +const settings = require('settings-sharelatex') + +const Server = require('./app/js/server') + +if (!module.parent) { + // Called directly + const port = + __guard__( + settings.internal != null ? settings.internal.chat : undefined, + x => x.port + ) || 3010 + const host = + __guard__( + settings.internal != null ? settings.internal.chat : undefined, + x1 => x1.host + ) || 'localhost' + Server.server.listen(port, host, function(error) { + if (error != null) { + throw error + } + return logger.info(`Chat starting up, listening on ${host}:${port}`) + }) +} + +module.exports = Server.server + +function __guard__(value, transform) { + return typeof value !== 'undefined' && value !== null + ? transform(value) + : undefined +} diff --git a/services/chat/app/coffee/Features/Messages/MessageFormatter.coffee b/services/chat/app/coffee/Features/Messages/MessageFormatter.coffee deleted file mode 100644 index 8f3fdf3e04..0000000000 --- a/services/chat/app/coffee/Features/Messages/MessageFormatter.coffee +++ /dev/null @@ -1,46 +0,0 @@ -module.exports = MessageFormatter = - formatMessageForClientSide: (message) -> - if message._id? - message.id = message._id.toString() - delete message._id - formattedMessage = - id: message.id - content: message.content - timestamp: message.timestamp - user_id: message.user_id - if message.edited_at? - formattedMessage.edited_at = message.edited_at - return formattedMessage - - formatMessagesForClientSide: (messages) -> - (@formatMessageForClientSide(message) for message in messages) - - groupMessagesByThreads: (rooms, messages) -> - rooms_by_id = {} - for room in rooms - rooms_by_id[room._id.toString()] = room - - threads = {} - getThread = (room) -> - thread_id = room.thread_id.toString() - if threads[thread_id]? - return threads[thread_id] - else - thread = { messages: [] } - if room.resolved? - thread.resolved = true - thread.resolved_at = room.resolved.ts - thread.resolved_by_user_id = room.resolved.user_id - threads[thread_id] = thread - return thread - - for message in messages - room = rooms_by_id[message.room_id.toString()] - if room? - thread = getThread(room) - thread.messages.push MessageFormatter.formatMessageForClientSide(message) - - for thread_id, thread of threads - thread.messages.sort (a,b) -> a.timestamp - b.timestamp - - return threads \ No newline at end of file diff --git a/services/chat/app/coffee/Features/Messages/MessageHttpController.coffee b/services/chat/app/coffee/Features/Messages/MessageHttpController.coffee deleted file mode 100644 index 4a870cd2fc..0000000000 --- a/services/chat/app/coffee/Features/Messages/MessageHttpController.coffee +++ /dev/null @@ -1,112 +0,0 @@ -logger = require "logger-sharelatex" -metrics = require "metrics-sharelatex" -MessageManager = require "./MessageManager" -MessageFormatter = require "./MessageFormatter" -ThreadManager = require "../Threads/ThreadManager" -{ObjectId} = require "../../mongojs" - -module.exports = MessageHttpController = - DEFAULT_MESSAGE_LIMIT: 50 - MAX_MESSAGE_LENGTH: 10 * 1024 # 10kb, about 1,500 words - - getGlobalMessages: (req, res, next) -> - MessageHttpController._getMessages(ThreadManager.GLOBAL_THREAD, req, res, next) - - sendGlobalMessage: (req, res, next) -> - MessageHttpController._sendMessage(ThreadManager.GLOBAL_THREAD, req, res, next) - - sendThreadMessage: (req, res, next) -> - MessageHttpController._sendMessage(req.params.thread_id, req, res, next) - - getAllThreads: (req, res, next) -> - {project_id} = req.params - logger.log {project_id}, "getting all threads" - ThreadManager.findAllThreadRooms project_id, (error, rooms) -> - return next(error) if error? - room_ids = rooms.map (r) -> r._id - MessageManager.findAllMessagesInRooms room_ids, (error, messages) -> - return next(error) if error? - threads = MessageFormatter.groupMessagesByThreads rooms, messages - res.json threads - - resolveThread: (req, res, next) -> - {project_id, thread_id} = req.params - {user_id} = req.body - logger.log {user_id, project_id, thread_id}, "marking thread as resolved" - ThreadManager.resolveThread project_id, thread_id, user_id, (error) -> - return next(error) if error? - res.send 204 # No content - - reopenThread: (req, res, next) -> - {project_id, thread_id} = req.params - logger.log {project_id, thread_id}, "reopening thread" - ThreadManager.reopenThread project_id, thread_id, (error) -> - return next(error) if error? - res.send 204 # No content - - deleteThread: (req, res, next) -> - {project_id, thread_id} = req.params - logger.log {project_id, thread_id}, "deleting thread" - ThreadManager.deleteThread project_id, thread_id, (error, room_id) -> - return next(error) if error? - MessageManager.deleteAllMessagesInRoom room_id, (error) -> - return next(error) if error? - res.send 204 # No content - - editMessage: (req, res, next) -> - {content} = req?.body - {project_id, thread_id, message_id} = req.params - logger.log {project_id, thread_id, message_id, content}, "editing message" - ThreadManager.findOrCreateThread project_id, thread_id, (error, room) -> - return next(error) if error? - MessageManager.updateMessage room._id, message_id, content, Date.now(), (error) -> - return next(error) if error? - res.send(204) - - deleteMessage: (req, res, next) -> - {project_id, thread_id, message_id} = req.params - logger.log {project_id, thread_id, message_id}, "deleting message" - ThreadManager.findOrCreateThread project_id, thread_id, (error, room) -> - return next(error) if error? - MessageManager.deleteMessage room._id, message_id, (error, message) -> - return next(error) if error? - res.send(204) - - _sendMessage: (client_thread_id, req, res, next) -> - {user_id, content} = req?.body - {project_id} = req.params - if !ObjectId.isValid(user_id) - return res.send(400, "Invalid user_id") - if !content? - return res.send(400, "No content provided") - if content.length > @MAX_MESSAGE_LENGTH - return res.send(400, "Content too long (> #{@MAX_MESSAGE_LENGTH} bytes)") - logger.log {client_thread_id, project_id, user_id, content}, "new message received" - ThreadManager.findOrCreateThread project_id, client_thread_id, (error, thread) -> - return next(error) if error? - MessageManager.createMessage thread._id, user_id, content, Date.now(), (error, message) -> - return next(error) if error? - message = MessageFormatter.formatMessageForClientSide(message) - message.room_id = project_id - res.send(201, message) - - _getMessages: (client_thread_id, req, res, next) -> - {project_id} = req.params - if req.query?.before? - before = parseInt(req.query.before, 10) - else - before = null - if req.query?.limit? - limit = parseInt(req.query.limit, 10) - else - limit = MessageHttpController.DEFAULT_MESSAGE_LIMIT - logger.log {limit, before, project_id, client_thread_id}, "get message request received" - ThreadManager.findOrCreateThread project_id, client_thread_id, (error, thread) -> - return next(error) if error? - thread_object_id = thread._id - logger.log {limit, before, project_id, client_thread_id, thread_object_id}, "found or created thread" - MessageManager.getMessages thread_object_id, limit, before, (error, messages) -> - return next(error) if error? - messages = MessageFormatter.formatMessagesForClientSide messages - logger.log {project_id, messages}, "got messages" - res.send 200, messages diff --git a/services/chat/app/coffee/Features/Messages/MessageManager.coffee b/services/chat/app/coffee/Features/Messages/MessageManager.coffee deleted file mode 100644 index bda57097da..0000000000 --- a/services/chat/app/coffee/Features/Messages/MessageManager.coffee +++ /dev/null @@ -1,76 +0,0 @@ -mongojs = require "../../mongojs" -db = mongojs.db -ObjectId = mongojs.ObjectId -async = require "async" -metrics = require 'metrics-sharelatex' -logger = require 'logger-sharelatex' - -module.exports = MessageManager = - createMessage: (room_id, user_id, content, timestamp, callback = (error, message) ->) -> - newMessageOpts = - content: content - room_id: room_id - user_id: user_id - timestamp: timestamp - newMessageOpts = @_ensureIdsAreObjectIds(newMessageOpts) - db.messages.save newMessageOpts, callback - - getMessages: (room_id, limit, before, callback = (error, messages) ->) -> - query = - room_id: room_id - if before? - query.timestamp = { $lt: before } - query = @_ensureIdsAreObjectIds(query) - cursor = db.messages.find(query).sort({ timestamp: -1 }).limit(limit) - cursor.toArray callback - - findAllMessagesInRooms: (room_ids, callback = (error, messages) ->) -> - db.messages.find { - room_id: { $in: room_ids } - }, callback - - deleteAllMessagesInRoom: (room_id, callback = (error) ->) -> - db.messages.remove { - room_id: room_id - }, callback - - updateMessage: (room_id, message_id, content, timestamp, callback = (error, message) ->) -> - query = @_ensureIdsAreObjectIds( - _id: message_id - room_id: room_id - ) - db.messages.update query, { - $set: - content: content - edited_at: timestamp - }, (error) -> - return callback(error) if error? - return callback() - - deleteMessage: (room_id, message_id, callback = (error) ->) -> - query = @_ensureIdsAreObjectIds( - _id: message_id - room_id: room_id - ) - db.messages.remove query, (error) -> - return callback(error) if error? - return callback() - - _ensureIdsAreObjectIds: (query) -> - if query.user_id? and query.user_id not instanceof ObjectId - query.user_id = ObjectId(query.user_id) - if query.room_id? and query.room_id not instanceof ObjectId - query.room_id = ObjectId(query.room_id) - if query._id? and query._id not instanceof ObjectId - query._id = ObjectId(query._id) - return query - - -[ - 'createMessage', - 'getMessages', - 'findAllMessagesInRooms', - 'updateMessage', - 'deleteMessage' -].map (method) -> - metrics.timeAsyncMethod(MessageManager, method, 'mongo.MessageManager', logger) diff --git a/services/chat/app/coffee/Features/Threads/ThreadManager.coffee b/services/chat/app/coffee/Features/Threads/ThreadManager.coffee deleted file mode 100644 index d2c4b82d11..0000000000 --- a/services/chat/app/coffee/Features/Threads/ThreadManager.coffee +++ /dev/null @@ -1,88 +0,0 @@ -mongojs = require("../../mongojs") -db = mongojs.db -ObjectId = mongojs.ObjectId -logger = require('logger-sharelatex') -metrics = require('metrics-sharelatex') - -module.exports = ThreadManager = - GLOBAL_THREAD: "GLOBAL" - - findOrCreateThread: (project_id, thread_id, callback = (error, thread) ->) -> - project_id = ObjectId(project_id.toString()) - if thread_id != ThreadManager.GLOBAL_THREAD - thread_id = ObjectId(thread_id.toString()) - - if thread_id == ThreadManager.GLOBAL_THREAD - query = { - project_id: project_id - thread_id: { $exists: false } - } - update = { - project_id: project_id - } - else - query = { - project_id: project_id - thread_id: thread_id - } - update = { - project_id: project_id - thread_id: thread_id - } - - db.rooms.update query, update, { upsert: true }, (error) -> - return callback(error) if error? - db.rooms.find query, (error, rooms = []) -> - return callback(error) if error? - return callback null, rooms[0] - - findAllThreadRooms: (project_id, callback = (error, rooms) ->) -> - db.rooms.find { - project_id: ObjectId(project_id.toString()) - thread_id: { $exists: true } - }, { - thread_id: 1, - resolved: 1 - }, callback - - resolveThread: (project_id, thread_id, user_id, callback = (error) ->) -> - db.rooms.update { - project_id: ObjectId(project_id.toString()) - thread_id: ObjectId(thread_id.toString()) - }, { - $set: { - resolved: { - user_id: user_id - ts: new Date() - } - } - }, callback - - reopenThread: (project_id, thread_id, callback = (error) ->) -> - db.rooms.update { - project_id: ObjectId(project_id.toString()) - thread_id: ObjectId(thread_id.toString()) - }, { - $unset: { - resolved: true - } - }, callback - - deleteThread: (project_id, thread_id, callback = (error, room_id) ->) -> - @findOrCreateThread project_id, thread_id, (error, room) -> - return callback(error) if error? - db.rooms.remove { - _id: room._id - }, (error) -> - return callback(error) if error? - return callback null, room._id - - -[ - 'findOrCreateThread', - 'findAllThreadRooms', - 'resolveThread', - 'reopenThread', - 'deleteThread', -].map (method) -> - metrics.timeAsyncMethod(ThreadManager, method, 'mongo.ThreadManager', logger) diff --git a/services/chat/app/coffee/mongojs.coffee b/services/chat/app/coffee/mongojs.coffee deleted file mode 100644 index 44b54c15f4..0000000000 --- a/services/chat/app/coffee/mongojs.coffee +++ /dev/null @@ -1,6 +0,0 @@ -Settings = require("settings-sharelatex") -mongojs = require "mongojs" -db = mongojs(Settings.mongo.url, ["rooms", "messages"]) -module.exports = - db: db - ObjectId: mongojs.ObjectId diff --git a/services/chat/app/coffee/router.coffee b/services/chat/app/coffee/router.coffee deleted file mode 100644 index 79004235e7..0000000000 --- a/services/chat/app/coffee/router.coffee +++ /dev/null @@ -1,39 +0,0 @@ -MessageHttpController = require('./Features/Messages/MessageHttpController') -{ObjectId} = require "./mongojs" - -module.exports = Router = - route: (app) -> - app.param 'project_id', (req, res, next, project_id) -> - if ObjectId.isValid(project_id) - next() - else - res.send 400, "Invalid project_id" - - app.param 'thread_id', (req, res, next, thread_id) -> - if ObjectId.isValid(thread_id) - next() - else - res.send 400, "Invalid thread_id" - - # These are for backwards compatibility - app.get "/room/:project_id/messages", MessageHttpController.getGlobalMessages - app.post "/room/:project_id/messages", MessageHttpController.sendGlobalMessage - - app.get "/project/:project_id/messages", MessageHttpController.getGlobalMessages - app.post "/project/:project_id/messages", MessageHttpController.sendGlobalMessage - - app.post "/project/:project_id/thread/:thread_id/messages", MessageHttpController.sendThreadMessage - app.get "/project/:project_id/threads", MessageHttpController.getAllThreads - - app.post "/project/:project_id/thread/:thread_id/messages/:message_id/edit", MessageHttpController.editMessage - app.del "/project/:project_id/thread/:thread_id/messages/:message_id", MessageHttpController.deleteMessage - - app.post "/project/:project_id/thread/:thread_id/resolve", MessageHttpController.resolveThread - app.post "/project/:project_id/thread/:thread_id/reopen", MessageHttpController.reopenThread - app.del "/project/:project_id/thread/:thread_id", MessageHttpController.deleteThread - - app.get "/status", (req, res, next) -> - res.send("chat is alive") - - - diff --git a/services/chat/app/coffee/server.coffee b/services/chat/app/coffee/server.coffee deleted file mode 100644 index 3b0dc4b42d..0000000000 --- a/services/chat/app/coffee/server.coffee +++ /dev/null @@ -1,39 +0,0 @@ -logger = require 'logger-sharelatex' -logger.initialize("chat-sharelatex") -metrics = require("metrics-sharelatex") -metrics.initialize("chat") -Path = require("path") -express = require("express") -app = express() -server = require("http").createServer(app) -Router = require "./router" - -app.use express.bodyParser() -app.use metrics.http.monitor(logger) - -if (app.get 'env') == 'development' - console.log "Development Enviroment" - app.use express.errorHandler({ dumpExceptions: true, showStack: true }) - -if (app.get 'env') == 'production' - console.log "Production Enviroment" - app.use express.logger() - app.use express.errorHandler() - -profiler = require "v8-profiler" -app.get "/profile", (req, res) -> - time = parseInt(req.query.time || "1000") - profiler.startProfiling("test") - setTimeout () -> - profile = profiler.stopProfiling("test") - res.json(profile) - , time - -Router.route(app) - -module.exports = { - server: server - app: app -} - - diff --git a/services/chat/app/js/Features/Messages/MessageFormatter.js b/services/chat/app/js/Features/Messages/MessageFormatter.js new file mode 100644 index 0000000000..fe230f5587 --- /dev/null +++ b/services/chat/app/js/Features/Messages/MessageFormatter.js @@ -0,0 +1,80 @@ +/* eslint-disable + camelcase, + max-len, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS101: Remove unnecessary use of Array.from + * DS102: Remove unnecessary code created because of implicit returns + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +let MessageFormatter +module.exports = MessageFormatter = { + formatMessageForClientSide(message) { + if (message._id != null) { + message.id = message._id.toString() + delete message._id + } + const formattedMessage = { + id: message.id, + content: message.content, + timestamp: message.timestamp, + user_id: message.user_id + } + if (message.edited_at != null) { + formattedMessage.edited_at = message.edited_at + } + return formattedMessage + }, + + formatMessagesForClientSide(messages) { + return Array.from(messages).map(message => + this.formatMessageForClientSide(message) + ) + }, + + groupMessagesByThreads(rooms, messages) { + let room, thread + const rooms_by_id = {} + for (room of Array.from(rooms)) { + rooms_by_id[room._id.toString()] = room + } + + const threads = {} + const getThread = function(room) { + const thread_id = room.thread_id.toString() + if (threads[thread_id] != null) { + return threads[thread_id] + } else { + const thread = { messages: [] } + if (room.resolved != null) { + thread.resolved = true + thread.resolved_at = room.resolved.ts + thread.resolved_by_user_id = room.resolved.user_id + } + threads[thread_id] = thread + return thread + } + } + + for (let message of Array.from(messages)) { + room = rooms_by_id[message.room_id.toString()] + if (room != null) { + thread = getThread(room) + thread.messages.push( + MessageFormatter.formatMessageForClientSide(message) + ) + } + } + + for (let thread_id in threads) { + thread = threads[thread_id] + thread.messages.sort((a, b) => a.timestamp - b.timestamp) + } + + return threads + } +} diff --git a/services/chat/app/js/Features/Messages/MessageHttpController.js b/services/chat/app/js/Features/Messages/MessageHttpController.js new file mode 100644 index 0000000000..cac289c494 --- /dev/null +++ b/services/chat/app/js/Features/Messages/MessageHttpController.js @@ -0,0 +1,258 @@ +/* eslint-disable + camelcase, + max-len, + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +let MessageHttpController +const logger = require('logger-sharelatex') +const metrics = require('metrics-sharelatex') +const MessageManager = require('./MessageManager') +const MessageFormatter = require('./MessageFormatter') +const ThreadManager = require('../Threads/ThreadManager') +const { ObjectId } = require('../../mongojs') + +module.exports = MessageHttpController = { + DEFAULT_MESSAGE_LIMIT: 50, + MAX_MESSAGE_LENGTH: 10 * 1024, // 10kb, about 1,500 words + + getGlobalMessages(req, res, next) { + return MessageHttpController._getMessages( + ThreadManager.GLOBAL_THREAD, + req, + res, + next + ) + }, + + sendGlobalMessage(req, res, next) { + return MessageHttpController._sendMessage( + ThreadManager.GLOBAL_THREAD, + req, + res, + next + ) + }, + + sendThreadMessage(req, res, next) { + return MessageHttpController._sendMessage( + req.params.thread_id, + req, + res, + next + ) + }, + + getAllThreads(req, res, next) { + const { project_id } = req.params + logger.log({ project_id }, 'getting all threads') + return ThreadManager.findAllThreadRooms(project_id, function(error, rooms) { + if (error != null) { + return next(error) + } + const room_ids = rooms.map(r => r._id) + return MessageManager.findAllMessagesInRooms(room_ids, function( + error, + messages + ) { + if (error != null) { + return next(error) + } + const threads = MessageFormatter.groupMessagesByThreads(rooms, messages) + return res.json(threads) + }) + }) + }, + + resolveThread(req, res, next) { + const { project_id, thread_id } = req.params + const { user_id } = req.body + logger.log({ user_id, project_id, thread_id }, 'marking thread as resolved') + return ThreadManager.resolveThread(project_id, thread_id, user_id, function( + error + ) { + if (error != null) { + return next(error) + } + return res.send(204) + }) + }, // No content + + reopenThread(req, res, next) { + const { project_id, thread_id } = req.params + logger.log({ project_id, thread_id }, 'reopening thread') + return ThreadManager.reopenThread(project_id, thread_id, function(error) { + if (error != null) { + return next(error) + } + return res.send(204) + }) + }, // No content + + deleteThread(req, res, next) { + const { project_id, thread_id } = req.params + logger.log({ project_id, thread_id }, 'deleting thread') + return ThreadManager.deleteThread(project_id, thread_id, function( + error, + room_id + ) { + if (error != null) { + return next(error) + } + return MessageManager.deleteAllMessagesInRoom(room_id, function(error) { + if (error != null) { + return next(error) + } + return res.send(204) + }) + }) + }, // No content + + editMessage(req, res, next) { + const { content } = req != null ? req.body : undefined + const { project_id, thread_id, message_id } = req.params + logger.log( + { project_id, thread_id, message_id, content }, + 'editing message' + ) + return ThreadManager.findOrCreateThread(project_id, thread_id, function( + error, + room + ) { + if (error != null) { + return next(error) + } + return MessageManager.updateMessage( + room._id, + message_id, + content, + Date.now(), + function(error) { + if (error != null) { + return next(error) + } + return res.send(204) + } + ) + }) + }, + + deleteMessage(req, res, next) { + const { project_id, thread_id, message_id } = req.params + logger.log({ project_id, thread_id, message_id }, 'deleting message') + return ThreadManager.findOrCreateThread(project_id, thread_id, function( + error, + room + ) { + if (error != null) { + return next(error) + } + return MessageManager.deleteMessage(room._id, message_id, function( + error, + message + ) { + if (error != null) { + return next(error) + } + return res.send(204) + }) + }) + }, + + _sendMessage(client_thread_id, req, res, next) { + const { user_id, content } = req != null ? req.body : undefined + const { project_id } = req.params + if (!ObjectId.isValid(user_id)) { + return res.send(400, 'Invalid user_id') + } + if (content == null) { + return res.send(400, 'No content provided') + } + if (content.length > this.MAX_MESSAGE_LENGTH) { + return res.send( + 400, + `Content too long (> ${this.MAX_MESSAGE_LENGTH} bytes)` + ) + } + logger.log( + { client_thread_id, project_id, user_id, content }, + 'new message received' + ) + return ThreadManager.findOrCreateThread( + project_id, + client_thread_id, + function(error, thread) { + if (error != null) { + return next(error) + } + return MessageManager.createMessage( + thread._id, + user_id, + content, + Date.now(), + function(error, message) { + if (error != null) { + return next(error) + } + message = MessageFormatter.formatMessageForClientSide(message) + message.room_id = project_id + return res.send(201, message) + } + ) + } + ) + }, + + _getMessages(client_thread_id, req, res, next) { + let before, limit + const { project_id } = req.params + if ((req.query != null ? req.query.before : undefined) != null) { + before = parseInt(req.query.before, 10) + } else { + before = null + } + if ((req.query != null ? req.query.limit : undefined) != null) { + limit = parseInt(req.query.limit, 10) + } else { + limit = MessageHttpController.DEFAULT_MESSAGE_LIMIT + } + logger.log( + { limit, before, project_id, client_thread_id }, + 'get message request received' + ) + return ThreadManager.findOrCreateThread( + project_id, + client_thread_id, + function(error, thread) { + if (error != null) { + return next(error) + } + const thread_object_id = thread._id + logger.log( + { limit, before, project_id, client_thread_id, thread_object_id }, + 'found or created thread' + ) + return MessageManager.getMessages( + thread_object_id, + limit, + before, + function(error, messages) { + if (error != null) { + return next(error) + } + messages = MessageFormatter.formatMessagesForClientSide(messages) + logger.log({ project_id, messages }, 'got messages') + return res.send(200, messages) + } + ) + } + ) + } +} diff --git a/services/chat/app/js/Features/Messages/MessageManager.js b/services/chat/app/js/Features/Messages/MessageManager.js new file mode 100644 index 0000000000..0344aed97d --- /dev/null +++ b/services/chat/app/js/Features/Messages/MessageManager.js @@ -0,0 +1,146 @@ +/* eslint-disable + camelcase, + handle-callback-err, + max-len, + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +let MessageManager +const mongojs = require('../../mongojs') +const { db } = mongojs +const { ObjectId } = mongojs +const async = require('async') +const metrics = require('metrics-sharelatex') +const logger = require('logger-sharelatex') + +module.exports = MessageManager = { + createMessage(room_id, user_id, content, timestamp, callback) { + if (callback == null) { + callback = function(error, message) {} + } + let newMessageOpts = { + content, + room_id, + user_id, + timestamp + } + newMessageOpts = this._ensureIdsAreObjectIds(newMessageOpts) + return db.messages.save(newMessageOpts, callback) + }, + + getMessages(room_id, limit, before, callback) { + if (callback == null) { + callback = function(error, messages) {} + } + let query = { room_id } + if (before != null) { + query.timestamp = { $lt: before } + } + query = this._ensureIdsAreObjectIds(query) + const cursor = db.messages + .find(query) + .sort({ timestamp: -1 }) + .limit(limit) + return cursor.toArray(callback) + }, + + findAllMessagesInRooms(room_ids, callback) { + if (callback == null) { + callback = function(error, messages) {} + } + return db.messages.find( + { + room_id: { $in: room_ids } + }, + callback + ) + }, + + deleteAllMessagesInRoom(room_id, callback) { + if (callback == null) { + callback = function(error) {} + } + return db.messages.remove( + { + room_id + }, + callback + ) + }, + + updateMessage(room_id, message_id, content, timestamp, callback) { + if (callback == null) { + callback = function(error, message) {} + } + const query = this._ensureIdsAreObjectIds({ + _id: message_id, + room_id + }) + return db.messages.update( + query, + { + $set: { + content, + edited_at: timestamp + } + }, + function(error) { + if (error != null) { + return callback(error) + } + return callback() + } + ) + }, + + deleteMessage(room_id, message_id, callback) { + if (callback == null) { + callback = function(error) {} + } + const query = this._ensureIdsAreObjectIds({ + _id: message_id, + room_id + }) + return db.messages.remove(query, function(error) { + if (error != null) { + return callback(error) + } + return callback() + }) + }, + + _ensureIdsAreObjectIds(query) { + if (query.user_id != null && !(query.user_id instanceof ObjectId)) { + query.user_id = ObjectId(query.user_id) + } + if (query.room_id != null && !(query.room_id instanceof ObjectId)) { + query.room_id = ObjectId(query.room_id) + } + if (query._id != null && !(query._id instanceof ObjectId)) { + query._id = ObjectId(query._id) + } + return query + } +} + +;[ + 'createMessage', + 'getMessages', + 'findAllMessagesInRooms', + 'updateMessage', + 'deleteMessage' +].map(method => + metrics.timeAsyncMethod( + MessageManager, + method, + 'mongo.MessageManager', + logger + ) +) diff --git a/services/chat/app/js/Features/Threads/ThreadManager.js b/services/chat/app/js/Features/Threads/ThreadManager.js new file mode 100644 index 0000000000..880f814eb3 --- /dev/null +++ b/services/chat/app/js/Features/Threads/ThreadManager.js @@ -0,0 +1,159 @@ +/* eslint-disable + camelcase, + handle-callback-err, + max-len, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +let ThreadManager +const mongojs = require('../../mongojs') +const { db } = mongojs +const { ObjectId } = mongojs +const logger = require('logger-sharelatex') +const metrics = require('metrics-sharelatex') + +module.exports = ThreadManager = { + GLOBAL_THREAD: 'GLOBAL', + + findOrCreateThread(project_id, thread_id, callback) { + let query, update + if (callback == null) { + callback = function(error, thread) {} + } + project_id = ObjectId(project_id.toString()) + if (thread_id !== ThreadManager.GLOBAL_THREAD) { + thread_id = ObjectId(thread_id.toString()) + } + + if (thread_id === ThreadManager.GLOBAL_THREAD) { + query = { + project_id, + thread_id: { $exists: false } + } + update = { + project_id + } + } else { + query = { + project_id, + thread_id + } + update = { + project_id, + thread_id + } + } + + return db.rooms.update(query, update, { upsert: true }, function(error) { + if (error != null) { + return callback(error) + } + return db.rooms.find(query, function(error, rooms) { + if (rooms == null) { + rooms = [] + } + if (error != null) { + return callback(error) + } + return callback(null, rooms[0]) + }) + }) + }, + + findAllThreadRooms(project_id, callback) { + if (callback == null) { + callback = function(error, rooms) {} + } + return db.rooms.find( + { + project_id: ObjectId(project_id.toString()), + thread_id: { $exists: true } + }, + { + thread_id: 1, + resolved: 1 + }, + callback + ) + }, + + resolveThread(project_id, thread_id, user_id, callback) { + if (callback == null) { + callback = function(error) {} + } + return db.rooms.update( + { + project_id: ObjectId(project_id.toString()), + thread_id: ObjectId(thread_id.toString()) + }, + { + $set: { + resolved: { + user_id, + ts: new Date() + } + } + }, + callback + ) + }, + + reopenThread(project_id, thread_id, callback) { + if (callback == null) { + callback = function(error) {} + } + return db.rooms.update( + { + project_id: ObjectId(project_id.toString()), + thread_id: ObjectId(thread_id.toString()) + }, + { + $unset: { + resolved: true + } + }, + callback + ) + }, + + deleteThread(project_id, thread_id, callback) { + if (callback == null) { + callback = function(error, room_id) {} + } + return this.findOrCreateThread(project_id, thread_id, function( + error, + room + ) { + if (error != null) { + return callback(error) + } + return db.rooms.remove( + { + _id: room._id + }, + function(error) { + if (error != null) { + return callback(error) + } + return callback(null, room._id) + } + ) + }) + } +} + +;[ + 'findOrCreateThread', + 'findAllThreadRooms', + 'resolveThread', + 'reopenThread', + 'deleteThread' +].map(method => + metrics.timeAsyncMethod(ThreadManager, method, 'mongo.ThreadManager', logger) +) diff --git a/services/chat/app/js/mongojs.js b/services/chat/app/js/mongojs.js new file mode 100644 index 0000000000..f73f6fc93f --- /dev/null +++ b/services/chat/app/js/mongojs.js @@ -0,0 +1,9 @@ +// TODO: This file was created by bulk-decaffeinate. +// Sanity-check the conversion and remove this comment. +const Settings = require('settings-sharelatex') +const mongojs = require('mongojs') +const db = mongojs(Settings.mongo.url, ['rooms', 'messages']) +module.exports = { + db, + ObjectId: mongojs.ObjectId +} diff --git a/services/chat/app/js/router.js b/services/chat/app/js/router.js new file mode 100644 index 0000000000..b7e2164532 --- /dev/null +++ b/services/chat/app/js/router.js @@ -0,0 +1,84 @@ +/* eslint-disable + camelcase, + max-len, + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +let Router +const MessageHttpController = require('./Features/Messages/MessageHttpController') +const { ObjectId } = require('./mongojs') + +module.exports = Router = { + route(app) { + app.param('project_id', function(req, res, next, project_id) { + if (ObjectId.isValid(project_id)) { + return next() + } else { + return res.send(400, 'Invalid project_id') + } + }) + + app.param('thread_id', function(req, res, next, thread_id) { + if (ObjectId.isValid(thread_id)) { + return next() + } else { + return res.send(400, 'Invalid thread_id') + } + }) + + // These are for backwards compatibility + app.get( + '/room/:project_id/messages', + MessageHttpController.getGlobalMessages + ) + app.post( + '/room/:project_id/messages', + MessageHttpController.sendGlobalMessage + ) + + app.get( + '/project/:project_id/messages', + MessageHttpController.getGlobalMessages + ) + app.post( + '/project/:project_id/messages', + MessageHttpController.sendGlobalMessage + ) + + app.post( + '/project/:project_id/thread/:thread_id/messages', + MessageHttpController.sendThreadMessage + ) + app.get('/project/:project_id/threads', MessageHttpController.getAllThreads) + + app.post( + '/project/:project_id/thread/:thread_id/messages/:message_id/edit', + MessageHttpController.editMessage + ) + app.del( + '/project/:project_id/thread/:thread_id/messages/:message_id', + MessageHttpController.deleteMessage + ) + + app.post( + '/project/:project_id/thread/:thread_id/resolve', + MessageHttpController.resolveThread + ) + app.post( + '/project/:project_id/thread/:thread_id/reopen', + MessageHttpController.reopenThread + ) + app.del( + '/project/:project_id/thread/:thread_id', + MessageHttpController.deleteThread + ) + + return app.get('/status', (req, res, next) => res.send('chat is alive')) + } +} diff --git a/services/chat/app/js/server.js b/services/chat/app/js/server.js new file mode 100644 index 0000000000..b2d617ea1f --- /dev/null +++ b/services/chat/app/js/server.js @@ -0,0 +1,51 @@ +/* eslint-disable + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const metrics = require('metrics-sharelatex') +metrics.initialize('chat') +const logger = require('logger-sharelatex') +logger.initialize('chat-sharelatex') +const Path = require('path') +const express = require('express') +const app = express() +const server = require('http').createServer(app) +const Router = require('./router') + +app.use(express.bodyParser()) +app.use(metrics.http.monitor(logger)) +metrics.injectMetricsRoute(app) + +if (app.get('env') === 'development') { + console.log('Development Enviroment') + app.use(express.errorHandler({ dumpExceptions: true, showStack: true })) +} + +if (app.get('env') === 'production') { + console.log('Production Enviroment') + app.use(express.logger()) + app.use(express.errorHandler()) +} + +const profiler = require('v8-profiler') +app.get('/profile', function(req, res) { + const time = parseInt(req.query.time || '1000') + profiler.startProfiling('test') + return setTimeout(function() { + const profile = profiler.stopProfiling('test') + return res.json(profile) + }, time) +}) + +Router.route(app) + +module.exports = { + server, + app +} diff --git a/services/chat/buildscript.txt b/services/chat/buildscript.txt index 24b63dd84d..1cf1fac72c 100644 --- a/services/chat/buildscript.txt +++ b/services/chat/buildscript.txt @@ -1,8 +1,8 @@ ---script-version=1.1.9 +--script-version=1.1.11 chat --node-version=6.14.1 --acceptance-creds=None ---language=coffeescript +--language=es --dependencies=mongo,redis --docker-repos=gcr.io/overleaf-ops --kube=false diff --git a/services/chat/config/settings.defaults.coffee b/services/chat/config/settings.defaults.coffee deleted file mode 100644 index 525d2bb449..0000000000 --- a/services/chat/config/settings.defaults.coffee +++ /dev/null @@ -1,23 +0,0 @@ -settings = - internal: - chat: - host: process.env['LISTEN_ADDRESS'] or "localhost" - port: 3010 - - apis: - web: - url: "http://#{process.env['WEB_HOST'] || "localhost"}:3000" - user: "sharelatex" - pass: "password" - - mongo: - url: process.env['MONGO_CONNECTION_STRING'] or "mongodb://#{process.env["MONGO_HOST"] or "localhost"}/sharelatex" - - - redis: - web: - host: process.env['REDIS_HOST'] || "localhost" - port: "6379" - password: process.env['REDIS_PASSWORD'] || "" - -module.exports = settings \ No newline at end of file diff --git a/services/chat/config/settings.defaults.js b/services/chat/config/settings.defaults.js new file mode 100644 index 0000000000..3c2dc36e18 --- /dev/null +++ b/services/chat/config/settings.defaults.js @@ -0,0 +1,30 @@ +module.exports = { + internal: { + chat: { + host: process.env['LISTEN_ADDRESS'] || 'localhost', + port: 3010 + } + }, + + apis: { + web: { + url: `http://${process.env['WEB_HOST'] || 'localhost'}:${process.env[ + 'WEB_PORT' + ] || 3000}`, + user: 'sharelatex', + pass: 'password' + } + }, + + mongo: { + url: process.env['MONGO_CONNECTION_STRING'] || `mongodb://${process.env['MONGO_HOST'] || 'localhost'}/sharelatex` + }, + + redis: { + web: { + host: process.env['REDIS_HOST'] || 'localhost', + port: '6379', + password: process.env['REDIS_PASSWORD'] || '' + } + } +} diff --git a/services/chat/decaffeinate.sh b/services/chat/decaffeinate.sh new file mode 100755 index 0000000000..9a8ec31bce --- /dev/null +++ b/services/chat/decaffeinate.sh @@ -0,0 +1,53 @@ +set -ex + +curl -o .eslintrc https://raw.githubusercontent.com/sharelatex/web-sharelatex/master/.eslintrc +curl -o .prettierrc https://raw.githubusercontent.com/sharelatex/web-sharelatex/master/.prettierrc + +git add . +git commit -m "Decaffeinate: add eslint and prettier rc files" + +npx bulk-decaffeinate convert --dir app/coffee + +npx bulk-decaffeinate clean + +git mv app/coffee app/js + +git commit -m "Rename app/coffee dir to app/js" + +npx prettier-eslint 'app/js/**/*.js' --write + +git add . +git commit -m "Prettier: convert app/js decaffeinated files to Prettier format" + +npx bulk-decaffeinate convert --dir test/acceptance/coffee + +npx bulk-decaffeinate clean + +git mv test/acceptance/coffee test/acceptance/js + +git commit -m "Rename test/acceptance/coffee to test/acceptance/js" + +npx prettier-eslint 'test/acceptance/js/**/*.js' --write + +git add . +git commit -m "Prettier: convert test/acceptance decaffeinated files to Prettier format" + +git mv app.coffee app.js +git mv Gruntfile.coffee Gruntfile.js +git mv config/settings.defaults.coffee config/settings.defaults.js + +git commit -m "Rename individual coffee files to js files" + +decaffeinate app.js +decaffeinate Gruntfile.js +decaffeinate config/settings.defaults.js + +git add . +git commit -m "Decaffeinate: convert individual files to js" + +npx prettier-eslint 'app.js' 'Gruntfile.js' 'config/settings.defaults.js' --write + +git add . +git commit -m "Prettier: convert individual decaffeinated files to Prettier format" + +echo "done" diff --git a/services/chat/docker-compose.ci.yml b/services/chat/docker-compose.ci.yml index 17c4ddd2bf..3c57490e8a 100644 --- a/services/chat/docker-compose.ci.yml +++ b/services/chat/docker-compose.ci.yml @@ -1,7 +1,7 @@ # 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.9 +# Version: 1.1.11 version: "2" @@ -11,6 +11,7 @@ services: user: node command: npm run test:unit:_run + test_acceptance: build: . image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER diff --git a/services/chat/docker-compose.yml b/services/chat/docker-compose.yml index dcbc14e683..0ecd2bd3d4 100644 --- a/services/chat/docker-compose.yml +++ b/services/chat/docker-compose.yml @@ -1,7 +1,7 @@ # 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.9 +# Version: 1.1.11 version: "2" diff --git a/services/chat/nodemon.json b/services/chat/nodemon.json index 98db38d71b..5826281b84 100644 --- a/services/chat/nodemon.json +++ b/services/chat/nodemon.json @@ -10,10 +10,9 @@ }, "watch": [ - "app/coffee/", - "app.coffee", + "app/js/", + "app.js", "config/" ], - "ext": "coffee" - + "ext": "js" } diff --git a/services/chat/npm-shrinkwrap.json b/services/chat/npm-shrinkwrap.json index e52d1d7fb7..d79b7761fb 100644 --- a/services/chat/npm-shrinkwrap.json +++ b/services/chat/npm-shrinkwrap.json @@ -2,668 +2,1197 @@ "name": "chat-sharelatex", "version": "0.1.4", "dependencies": { - "async": { - "version": "0.2.9", - "from": "async@0.2.9", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz" - }, - "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", + "@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", "dependencies": { - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "pify": { + "version": "4.0.1", + "from": "pify@^4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.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": { + "acorn": { + "version": "5.7.3", + "from": "acorn@>=5.0.3 <6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz" + }, + "coffeescript": { + "version": "2.3.2", + "from": "coffeescript@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.3.2.tgz" + }, + "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" + }, + "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" + }, + "pify": { + "version": "4.0.1", + "from": "pify@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + }, + "semver": { + "version": "5.6.0", + "from": "semver@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz" + }, + "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" + } + } + }, + "@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" + }, + "pify": { + "version": "4.0.1", + "from": "pify@^4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + }, + "semver": { + "version": "5.6.0", + "from": "semver@^5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.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.2 <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.0", + "from": "@google-cloud/trace-agent@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.5.0.tgz", + "dependencies": { + "@google-cloud/common": { + "version": "0.28.0", + "from": "@google-cloud/common@>=0.28.0 <0.29.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.28.0.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" + }, + "pify": { + "version": "4.0.1", + "from": "pify@^4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + }, + "semver": { + "version": "5.6.0", + "from": "semver@^5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz" + }, + "uuid": { + "version": "3.3.2", + "from": "uuid@^3.0.1", + "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", + "dependencies": { + "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" + } + } + }, + "@sinonjs/commons": { + "version": "1.3.0", + "from": "@sinonjs/commons@https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz" + }, + "@sinonjs/formatio": { + "version": "3.1.0", + "from": "@sinonjs/formatio@https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz" + }, + "@sinonjs/samsam": { + "version": "3.0.2", + "from": "@sinonjs/samsam@https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.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.18", + "from": "@types/node@*", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.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.4", + "from": "@types/tough-cookie@*", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz" + }, + "abbrev": { + "version": "1.1.1", + "from": "abbrev@https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.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" + }, + "argparse": { + "version": "0.1.16", + "from": "argparse@https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "from": "underscore.string@https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" + } + } + }, + "array-from": { + "version": "2.1.1", + "from": "array-from@https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz" + }, + "arrify": { + "version": "1.0.1", + "from": "arrify@https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + }, + "assertion-error": { + "version": "1.1.0", + "from": "assertion-error@https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + }, + "async": { + "version": "0.2.9", + "from": "async@https://registry.npmjs.org/async/-/async-0.2.9.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.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", + "dependencies": { + "semver": { + "version": "5.6.0", + "from": "semver@^5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz" + } + } + }, + "axios": { + "version": "0.18.0", + "from": "axios@>=0.18.0 <0.19.0", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz" + }, + "balanced-match": { + "version": "1.0.0", + "from": "balanced-match@https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "optional": true + }, + "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.3.1", + "from": "bindings@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz" + }, + "bintrees": { + "version": "1.0.1", + "from": "bintrees@1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz" + }, + "brace-expansion": { + "version": "1.1.11", + "from": "brace-expansion@https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "optional": true + }, + "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" + }, + "bunyan": { + "version": "1.8.12", + "from": "bunyan@https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "from": "check-error@https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + }, + "coffee-script": { + "version": "1.6.0", + "from": "coffee-script@1.6.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.0.tgz" + }, + "colors": { + "version": "0.6.2", + "from": "colors@https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "commander": { + "version": "2.0.0", + "from": "commander@https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "optional": 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" + }, + "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.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "from": "dateformat@https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "debug@https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + }, + "deep-eql": { + "version": "3.0.1", + "from": "deep-eql@https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + }, + "delay": { + "version": "4.1.0", + "from": "delay@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.1.0.tgz" + }, + "dtrace-provider": { + "version": "0.8.7", + "from": "dtrace-provider@https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", + "dev": true, + "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" + }, + "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" + }, + "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" + }, + "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-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + }, + "esprima": { + "version": "1.0.4", + "from": "esprima@https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + }, + "eventemitter2": { + "version": "0.4.14", + "from": "eventemitter2@https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" + }, + "exit": { + "version": "0.1.2", + "from": "exit@https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + }, "express": { "version": "3.3.1", - "from": "express@3.3.1", + "from": "express@https://registry.npmjs.org/express/-/express-3.3.1.tgz", "resolved": "https://registry.npmjs.org/express/-/express-3.3.1.tgz", "dependencies": { + "buffer-crc32": { + "version": "0.2.1", + "from": "buffer-crc32@https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" + }, + "commander": { + "version": "0.6.1", + "from": "commander@https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + }, "connect": { "version": "2.8.1", - "from": "connect@2.8.1", + "from": "connect@https://registry.npmjs.org/connect/-/connect-2.8.1.tgz", "resolved": "https://registry.npmjs.org/connect/-/connect-2.8.1.tgz", "dependencies": { - "qs": { - "version": "0.6.5", - "from": "qs@0.6.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz" - }, - "formidable": { - "version": "1.0.14", - "from": "formidable@1.0.14", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz" + "bytes": { + "version": "0.2.0", + "from": "bytes@https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz" }, "cookie": { "version": "0.0.5", - "from": "cookie@0.0.5", + "from": "cookie@https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz" }, - "bytes": { - "version": "0.2.0", - "from": "bytes@0.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz" + "formidable": { + "version": "1.0.14", + "from": "formidable@https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz" }, "pause": { "version": "0.0.1", - "from": "pause@0.0.1", + "from": "pause@https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" }, + "qs": { + "version": "0.6.5", + "from": "qs@https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz" + }, "uid2": { "version": "0.0.2", - "from": "uid2@0.0.2", + "from": "uid2@https://registry.npmjs.org/uid2/-/uid2-0.0.2.tgz", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.2.tgz" } } }, - "commander": { - "version": "0.6.1", - "from": "commander@0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" - }, - "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" - }, - "mkdirp": { - "version": "0.3.4", - "from": "mkdirp@0.3.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.4.tgz" - }, "cookie": { "version": "0.1.0", - "from": "cookie@0.1.0", + "from": "cookie@https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.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" - }, - "fresh": { - "version": "0.1.0", - "from": "fresh@0.1.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz" - }, - "methods": { - "version": "0.0.1", - "from": "methods@0.0.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz" - }, - "send": { - "version": "0.1.1", - "from": "send@0.1.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", - "dependencies": { - "mime": { - "version": "1.2.11", - "from": "mime@>=1.2.9 <1.3.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - } - } - }, "cookie-signature": { "version": "1.0.1", - "from": "cookie-signature@1.0.1", + "from": "cookie-signature@https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" }, "debug": { "version": "3.0.1", - "from": "debug@*", + "from": "debug@https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", "dependencies": { "ms": { "version": "2.0.0", - "from": "ms@2.0.0", + "from": "ms@https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" } } + }, + "fresh": { + "version": "0.1.0", + "from": "fresh@https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz" + }, + "methods": { + "version": "0.0.1", + "from": "methods@https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz" + }, + "mkdirp": { + "version": "0.3.4", + "from": "mkdirp@https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.4.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.4.tgz" + }, + "range-parser": { + "version": "0.0.4", + "from": "range-parser@https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + }, + "send": { + "version": "0.1.1", + "from": "send@https://registry.npmjs.org/send/-/send-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "mime@https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + } + } } } }, - "logger-sharelatex": { - "version": "1.5.6", - "from": "git+https://github.com/sharelatex/logger-sharelatex.git#master", - "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#b2956ec56b582b9f4fc8fdda8dc00c06e77c5537", + "extend": { + "version": "3.0.2", + "from": "extend@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + }, + "findit2": { + "version": "2.2.3", + "from": "findit2@>=2.2.3 <3.0.0", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz" + }, + "findup-sync": { + "version": "0.1.3", + "from": "findup-sync@https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "dependencies": { + "glob": { + "version": "3.2.11", + "from": "glob@https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" + }, + "lodash": { + "version": "2.4.2", + "from": "lodash@https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "minimatch": { + "version": "0.3.0", + "from": "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.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": { + "debug": { + "version": "3.1.0", + "from": "debug@3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + } + } + }, + "gaxios": { + "version": "1.0.6", + "from": "gaxios@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.0.6.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" + }, + "get-func-name": { + "version": "2.0.0", + "from": "get-func-name@https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + }, + "getobject": { + "version": "0.1.0", + "from": "getobject@https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + }, + "glob": { + "version": "3.1.21", + "from": "glob@https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "dependencies": { + "inherits": { + "version": "1.0.2", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" + } + } + }, + "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": { + "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" + }, + "lru-cache": { + "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" + }, + "semver": { + "version": "5.6.0", + "from": "semver@^5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.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", + "dependencies": { + "pify": { + "version": "4.0.1", + "from": "pify@^4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "growl": { + "version": "1.7.0", + "from": "growl@https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" + }, + "grunt": { + "version": "0.4.5", + "from": "grunt@https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "dependencies": { + "async": { + "version": "0.1.22", + "from": "async@https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz" + }, + "coffee-script": { + "version": "1.3.3", + "from": "coffee-script@https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" + } + } + }, + "grunt-bunyan": { + "version": "0.5.0", + "from": "grunt-bunyan@https://registry.npmjs.org/grunt-bunyan/-/grunt-bunyan-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-bunyan/-/grunt-bunyan-0.5.0.tgz", + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + } + } + }, + "grunt-execute": { + "version": "0.2.2", + "from": "grunt-execute@https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz" + }, + "grunt-legacy-log": { + "version": "0.1.3", + "from": "grunt-legacy-log@https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "underscore.string": { + "version": "2.3.3", + "from": "underscore.string@https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "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@https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "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@https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "underscore.string": { + "version": "2.3.3", + "from": "underscore.string@https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "from": "grunt-legacy-util@https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "dependencies": { + "async": { + "version": "0.1.22", + "from": "async@http://registry.npmjs.org/async/-/async-0.1.22.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz" + } + } + }, + "gtoken": { + "version": "2.3.0", + "from": "gtoken@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.0.tgz" + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + }, + "hex2dec": { + "version": "1.1.1", + "from": "hex2dec@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.1.tgz" + }, + "hooker": { + "version": "0.2.3", + "from": "hooker@https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + }, + "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@https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + }, + "inflight": { + "version": "1.0.6", + "from": "inflight@https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "optional": true + }, + "inherits": { + "version": "2.0.3", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.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@https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + }, + "jade": { + "version": "0.26.3", + "from": "jade@https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "commander@https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + }, + "mkdirp": { + "version": "0.3.0", + "from": "mkdirp@https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" + } + } + }, + "js-yaml": { + "version": "2.0.5", + "from": "js-yaml@https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.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-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" + }, + "just-extend": { + "version": "3.0.0", + "from": "just-extend@https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz" + }, + "jwa": { + "version": "1.1.6", + "from": "jwa@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz" + }, + "jws": { + "version": "3.1.5", + "from": "jws@>=3.1.5 <4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz" + }, + "lodash": { + "version": "0.9.2", + "from": "lodash@https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + }, + "lodash.get": { + "version": "4.4.2", + "from": "lodash.get@https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.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.9", + "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", + "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#e8e1b95052f62e107336053e4a983f81cdbdf589", + "dependencies": { + "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" + }, + "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" + }, "bunyan": { "version": "1.5.1", - "from": "bunyan@1.5.1", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz", - "dependencies": { - "dtrace-provider": { - "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", - "dependencies": { - "nan": { - "version": "2.7.0", - "from": "nan@>=2.0.8 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz" - } - } - }, - "mv": { - "version": "2.1.1", - "from": "mv@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "dependencies": { - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - } - }, - "ncp": { - "version": "2.0.0", - "from": "ncp@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz" - }, - "rimraf": { - "version": "2.4.5", - "from": "rimraf@>=2.4.0 <2.5.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "dependencies": { - "glob": { - "version": "6.0.4", - "from": "glob@>=6.0.1 <7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "dependencies": { - "inflight": { - "version": "1.0.6", - "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.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" - }, - "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", - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "from": "brace-expansion@>=1.1.7 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "dependencies": { - "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" - }, - "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" - } - } - } - } - }, - "once": { - "version": "1.4.0", - "from": "once@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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" - } - } - } - } - } - } - }, - "safe-json-stringify": { - "version": "1.0.4", - "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" - } - } + "from": "bunyan@https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz" + }, + "chai": { + "version": "4.2.0", + "from": "chai@latest", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.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" }, "coffee-script": { "version": "1.12.4", - "from": "coffee-script@1.12.4", + "from": "coffee-script@https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" }, - "grunt-contrib-clean": { + "diff": { + "version": "1.0.7", + "from": "diff@1.0.7", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" + }, + "dtrace-provider": { "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", + "from": "dtrace-provider@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz", + "optional": true + }, + "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": { - "rimraf": { - "version": "2.2.8", - "from": "rimraf@>=2.2.1 <2.3.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + "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.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" + }, + "grunt-contrib-clean": { + "version": "0.6.0", + "from": "grunt-contrib-clean@https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz", + "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", + "from": "grunt-contrib-coffee@https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.11.1.tgz", "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", - "dependencies": { - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.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", - "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" - }, - "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" - }, - "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", - "dependencies": { - "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" - } - } - }, - "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", - "dependencies": { - "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" - } - } - }, - "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" - } - } - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + "from": "coffee-script@https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.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", + "from": "grunt-mocha-test@https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.11.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.11.0.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" + }, + "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": "2.4.2", + "from": "lodash@>=2.4.1 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.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.20.1", + "from": "mocha@>=1.20.0 <1.21.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz" + }, + "ncp": { + "version": "0.5.1", + "from": "ncp@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz" + }, + "sandboxed-module": { + "version": "2.0.3", + "from": "sandboxed-module@latest", + "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.3.tgz" + }, + "sinon": { + "version": "7.2.2", + "from": "sinon@latest", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.2.tgz", "dependencies": { - "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": { - "commander": { - "version": "2.0.0", - "from": "commander@2.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.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" - }, - "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" - } - } - }, - "diff": { - "version": "1.0.7", - "from": "diff@1.0.7", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" - }, - "debug": { - "version": "3.0.1", - "from": "debug@*", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", - "dependencies": { - "ms": { - "version": "2.0.0", - "from": "ms@2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - } - } - }, - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" - }, - "glob": { - "version": "3.2.3", - "from": "glob@3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "dependencies": { - "minimatch": { - "version": "0.2.14", - "from": "minimatch@>=0.2.11 <0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dependencies": { - "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" - }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.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" - } - } - } - } + "diff": { + "version": "3.5.0", + "from": "diff@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.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" - }, - "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": { - "ncp": { - "version": "0.5.1", - "from": "ncp@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz" - }, - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.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" - }, - "rimraf": { - "version": "2.6.1", - "from": "rimraf@>=2.2.8 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "dependencies": { - "glob": { - "version": "7.1.2", - "from": "glob@>=7.0.5 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dependencies": { - "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" - }, - "inflight": { - "version": "1.0.6", - "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.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" - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@>=3.0.4 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "from": "brace-expansion@>=1.1.7 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "dependencies": { - "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" - }, - "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" - } - } - } - } - }, - "once": { - "version": "1.4.0", - "from": "once@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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" - } - } - } - } - } - } + "supports-color": { + "version": "5.5.0", + "from": "supports-color@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" } } }, - "raven": { - "version": "1.2.1", - "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" - }, - "lsmod": { - "version": "1.0.0", - "from": "lsmod@1.0.0", - "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz" - }, - "uuid": { - "version": "3.0.0", - "from": "uuid@3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.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" - } - } + "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" + }, + "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" }, "timekeeper": { "version": "1.0.0", - "from": "timekeeper@>=1.0.0 <2.0.0", + "from": "timekeeper@https://registry.npmjs.org/timekeeper/-/timekeeper-1.0.0.tgz", "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-1.0.0.tgz" } } }, + "lolex": { + "version": "3.0.0", + "from": "lolex@https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz" + }, + "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@https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + }, + "lsmod": { + "version": "1.0.0", + "from": "lsmod@1.0.0", + "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz" + }, + "lynx": { + "version": "0.1.1", + "from": "lynx@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/lynx/-/lynx-0.1.1.tgz" + }, + "mersenne": { + "version": "0.0.4", + "from": "mersenne@>=0.0.3 <0.1.0", + "resolved": "https://registry.npmjs.org/mersenne/-/mersenne-0.0.4.tgz" + }, + "methods": { + "version": "1.1.2", + "from": "methods@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + }, "metrics-sharelatex": { - "version": "1.7.1", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.7.1", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#166961924c599b1f9468f2e17846fa2a9d12372d", + "version": "2.0.12", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", + "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#3ac1621ef049e2f2d88a83b3a41011333d609662", "dependencies": { - "lynx": { - "version": "0.1.1", - "from": "lynx@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/lynx/-/lynx-0.1.1.tgz", - "dependencies": { - "mersenne": { - "version": "0.0.4", - "from": "mersenne@>=0.0.3 <0.1.0", - "resolved": "https://registry.npmjs.org/mersenne/-/mersenne-0.0.4.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" - } - } - }, "coffee-script": { "version": "1.6.0", - "from": "coffee-script@1.6.0", + "from": "coffee-script@https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.0.tgz", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.0.tgz" }, "underscore": { "version": "1.6.0", - "from": "underscore@>=1.6.0 <1.7.0", + "from": "underscore@https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" } } }, + "mime": { + "version": "2.4.0", + "from": "mime@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz" + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "optional": true + }, + "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" + }, + "moment": { + "version": "2.22.2", + "from": "moment@https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "dev": true, + "optional": true + }, "mongojs": { "version": "2.4.0", - "from": "mongojs@2.4.0", + "from": "mongojs@https://registry.npmjs.org/mongojs/-/mongojs-2.4.0.tgz", "resolved": "https://registry.npmjs.org/mongojs/-/mongojs-2.4.0.tgz", "dependencies": { "each-series": { "version": "1.0.0", - "from": "each-series@>=1.0.0 <2.0.0", + "from": "each-series@https://registry.npmjs.org/each-series/-/each-series-1.0.0.tgz", "resolved": "https://registry.npmjs.org/each-series/-/each-series-1.0.0.tgz" }, "mongodb": { "version": "2.2.31", - "from": "mongodb@>=2.0.45 <3.0.0", + "from": "mongodb@https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", "dependencies": { "es6-promise": { "version": "3.2.1", - "from": "es6-promise@3.2.1", + "from": "es6-promise@https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz" }, "mongodb-core": { "version": "2.1.15", - "from": "mongodb-core@2.1.15", + "from": "mongodb-core@https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", "dependencies": { "bson": { "version": "1.0.4", - "from": "bson@>=1.0.4 <1.1.0", + "from": "bson@https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz" }, "require_optional": { "version": "1.0.1", - "from": "require_optional@>=1.0.0 <1.1.0", + "from": "require_optional@https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", "dependencies": { - "semver": { - "version": "5.4.1", - "from": "semver@>=5.1.0 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" - }, "resolve-from": { "version": "2.0.0", - "from": "resolve-from@>=2.0.0 <3.0.0", + "from": "resolve-from@https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz" + }, + "semver": { + "version": "5.4.1", + "from": "semver@https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" } } } @@ -671,49 +1200,49 @@ }, "readable-stream": { "version": "2.2.7", - "from": "readable-stream@2.2.7", + "from": "readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", "dependencies": { "buffer-shims": { "version": "1.0.0", - "from": "buffer-shims@>=1.0.0 <1.1.0", + "from": "buffer-shims@https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" }, "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, + "isarray": { + "version": "1.0.0", + "from": "isarray@https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "process-nextick-args@https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "1.0.3", - "from": "string_decoder@>=1.0.0 <1.1.0", + "from": "string_decoder@https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "dependencies": { "safe-buffer": { "version": "5.1.1", - "from": "safe-buffer@>=5.1.0 <5.2.0", + "from": "safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" } } }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "util-deprecate@https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -722,162 +1251,316 @@ }, "once": { "version": "1.4.0", - "from": "once@>=1.3.2 <2.0.0", + "from": "once@https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "parse-mongo-url": { "version": "1.1.1", - "from": "parse-mongo-url@>=1.1.0 <2.0.0", + "from": "parse-mongo-url@https://registry.npmjs.org/parse-mongo-url/-/parse-mongo-url-1.1.1.tgz", "resolved": "https://registry.npmjs.org/parse-mongo-url/-/parse-mongo-url-1.1.1.tgz" }, "readable-stream": { "version": "2.3.3", - "from": "readable-stream@>=2.0.2 <3.0.0", + "from": "readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.3 <2.1.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "isarray@https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "process-nextick-args@https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "safe-buffer": { "version": "5.1.1", - "from": "safe-buffer@>=5.1.1 <5.2.0", + "from": "safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, "string_decoder": { "version": "1.0.3", - "from": "string_decoder@>=1.0.3 <1.1.0", + "from": "string_decoder@https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "util-deprecate@https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } }, "thunky": { "version": "0.1.0", - "from": "thunky@>=0.1.0 <0.2.0", + "from": "thunky@https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz" }, "to-mongodb-core": { "version": "2.0.0", - "from": "to-mongodb-core@>=2.0.0 <3.0.0", + "from": "to-mongodb-core@https://registry.npmjs.org/to-mongodb-core/-/to-mongodb-core-2.0.0.tgz", "resolved": "https://registry.npmjs.org/to-mongodb-core/-/to-mongodb-core-2.0.0.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "xtend@https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, + "ms": { + "version": "2.0.0", + "from": "ms@https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + }, + "mv": { + "version": "2.1.1", + "from": "mv@https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "optional": true, + "dependencies": { + "glob": { + "version": "6.0.4", + "from": "glob@https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "optional": true + }, + "rimraf": { + "version": "2.4.5", + "from": "rimraf@https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "optional": true + } + } + }, + "nan": { + "version": "2.11.1", + "from": "nan@https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz" + }, + "ncp": { + "version": "2.0.0", + "from": "ncp@https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "optional": true + }, + "nise": { + "version": "1.4.7", + "from": "nise@https://registry.npmjs.org/nise/-/nise-1.4.7.tgz", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.7.tgz", + "dependencies": { + "lolex": { + "version": "2.7.5", + "from": "lolex@https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.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.5 <0.8.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz" + }, + "nopt": { + "version": "1.0.10", + "from": "nopt@https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + }, + "once": { + "version": "1.4.0", + "from": "once@https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + }, + "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" + }, + "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" + }, + "path-is-absolute": { + "version": "1.0.1", + "from": "path-is-absolute@https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "optional": true + }, + "path-parse": { + "version": "1.0.6", + "from": "path-parse@https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" + }, + "path-to-regexp": { + "version": "1.7.0", + "from": "path-to-regexp@https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + } + } + }, + "pathval": { + "version": "1.1.0", + "from": "pathval@https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz" + }, + "pify": { + "version": "3.0.0", + "from": "pify@https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + }, + "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" + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "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" + }, + "raven": { + "version": "1.2.1", + "from": "raven@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz" + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + } + }, "redis": { "version": "0.10.3", - "from": "redis@>=0.10.1 <0.11.0", + "from": "redis@https://registry.npmjs.org/redis/-/redis-0.10.3.tgz", "resolved": "https://registry.npmjs.org/redis/-/redis-0.10.3.tgz" }, "request": { "version": "2.81.0", - "from": "request@>=2.79.0 <3.0.0", + "from": "request@https://registry.npmjs.org/request/-/request-2.81.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "dependencies": { "aws-sign2": { "version": "0.6.0", - "from": "aws-sign2@>=0.6.0 <0.7.0", + "from": "aws-sign2@https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, "aws4": { "version": "1.6.0", - "from": "aws4@>=1.2.1 <2.0.0", + "from": "aws4@https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz" }, "caseless": { "version": "0.12.0", - "from": "caseless@>=0.12.0 <0.13.0", + "from": "caseless@https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.5 <1.1.0", + "from": "combined-stream@https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "dependencies": { "delayed-stream": { "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", + "from": "delayed-stream@https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "extend": { "version": "3.0.1", - "from": "extend@>=3.0.0 <3.1.0", + "from": "extend@https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.1 <0.7.0", + "from": "forever-agent@https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "2.1.4", - "from": "form-data@>=2.1.1 <2.2.0", + "from": "form-data@https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "dependencies": { "asynckit": { "version": "0.4.0", - "from": "asynckit@>=0.4.0 <0.5.0", + "from": "asynckit@https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" } } }, "har-validator": { "version": "4.2.1", - "from": "har-validator@>=4.2.1 <4.3.0", + "from": "har-validator@https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "dependencies": { "ajv": { "version": "4.11.8", - "from": "ajv@>=4.9.1 <5.0.0", + "from": "ajv@https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "dependencies": { "co": { "version": "4.6.0", - "from": "co@>=4.6.0 <5.0.0", + "from": "co@https://registry.npmjs.org/co/-/co-4.6.0.tgz", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz" }, "json-stable-stringify": { "version": "1.0.1", - "from": "json-stable-stringify@>=1.0.1 <2.0.0", + "from": "json-stable-stringify@https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "dependencies": { "jsonify": { "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", + "from": "jsonify@https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" } } @@ -886,76 +1569,76 @@ }, "har-schema": { "version": "1.0.5", - "from": "har-schema@>=1.0.5 <2.0.0", + "from": "har-schema@https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" } } }, "hawk": { "version": "3.1.3", - "from": "hawk@>=3.1.3 <3.2.0", + "from": "hawk@https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "dependencies": { - "hoek": { - "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", + "from": "boom@https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", + "from": "cryptiles@https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, + "hoek": { + "version": "2.16.3", + "from": "hoek@https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", + "from": "sntp@https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "http-signature": { "version": "1.1.1", - "from": "http-signature@>=1.1.0 <1.2.0", + "from": "http-signature@https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "dependencies": { "assert-plus": { "version": "0.2.0", - "from": "assert-plus@>=0.2.0 <0.3.0", + "from": "assert-plus@https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, "jsprim": { "version": "1.4.1", - "from": "jsprim@>=1.2.2 <2.0.0", + "from": "jsprim@https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@1.0.0", + "from": "assert-plus@https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" }, "extsprintf": { "version": "1.3.0", - "from": "extsprintf@1.3.0", + "from": "extsprintf@https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" }, "json-schema": { "version": "0.2.3", - "from": "json-schema@0.2.3", + "from": "json-schema@https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" }, "verror": { "version": "1.10.0", - "from": "verror@1.10.0", + "from": "verror@https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@1.0.2", + "from": "core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } @@ -964,48 +1647,52 @@ }, "sshpk": { "version": "1.13.1", - "from": "sshpk@>=1.7.0 <2.0.0", + "from": "sshpk@https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "dependencies": { "asn1": { "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", + "from": "asn1@https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", + "from": "assert-plus@https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "from": "bcrypt-pbkdf@https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "optional": true + }, "dashdash": { "version": "1.14.1", - "from": "dashdash@>=1.12.0 <2.0.0", + "from": "dashdash@https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "optional": true + }, "getpass": { "version": "0.1.7", - "from": "getpass@>=0.1.1 <0.2.0", + "from": "getpass@https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.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" + "from": "jsbn@https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "optional": true }, "tweetnacl": { "version": "0.14.5", - "from": "tweetnacl@>=0.14.0 <0.15.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - }, - "ecc-jsbn": { - "version": "0.1.1", - "from": "ecc-jsbn@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz" + "from": "tweetnacl@https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "optional": true } } } @@ -1013,142 +1700,268 @@ }, "is-typedarray": { "version": "1.0.0", - "from": "is-typedarray@>=1.0.0 <1.1.0", + "from": "is-typedarray@https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.2 <0.2.0", + "from": "isstream@https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "from": "json-stringify-safe@https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.1.17", - "from": "mime-types@>=2.1.7 <2.2.0", + "from": "mime-types@https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "dependencies": { "mime-db": { "version": "1.30.0", - "from": "mime-db@>=1.30.0 <1.31.0", + "from": "mime-db@https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz" } } }, "oauth-sign": { "version": "0.8.2", - "from": "oauth-sign@>=0.8.1 <0.9.0", + "from": "oauth-sign@https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" }, "performance-now": { "version": "0.2.0", - "from": "performance-now@>=0.2.0 <0.3.0", + "from": "performance-now@https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz" }, "qs": { "version": "6.4.0", - "from": "qs@>=6.4.0 <6.5.0", + "from": "qs@https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz" }, "safe-buffer": { "version": "5.1.1", - "from": "safe-buffer@>=5.0.1 <6.0.0", + "from": "safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "stringstream@https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "tough-cookie": { "version": "2.3.2", - "from": "tough-cookie@>=2.3.0 <2.4.0", + "from": "tough-cookie@https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "dependencies": { "punycode": { "version": "1.4.1", - "from": "punycode@>=1.4.1 <2.0.0", + "from": "punycode@https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" } } }, "tunnel-agent": { "version": "0.6.0", - "from": "tunnel-agent@>=0.6.0 <0.7.0", + "from": "tunnel-agent@https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" }, "uuid": { "version": "3.1.0", - "from": "uuid@>=3.0.0 <4.0.0", + "from": "uuid@https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" } } }, + "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@https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + }, + "resolve": { + "version": "1.9.0", + "from": "resolve@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz" + }, + "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", + "from": "rimraf@https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + }, + "safe-buffer": { + "version": "5.1.2", + "from": "safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + }, + "safe-json-stringify": { + "version": "1.2.0", + "from": "safe-json-stringify@https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "optional": true + }, "settings-sharelatex": { + "version": "1.1.0", + "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", + "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#93f63d029b52fef8825c3a401b2b6a7ba29b4750" + }, + "shimmer": { + "version": "1.2.0", + "from": "shimmer@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.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" + }, + "stack-trace": { + "version": "0.0.9", + "from": "stack-trace@https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "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" + }, + "stream-shift": { "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", + "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": "1.1.1", + "from": "string_decoder@https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + }, + "tdigest": { + "version": "0.1.1", + "from": "tdigest@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz" + }, + "teeny-request": { + "version": "3.11.3", + "from": "teeny-request@>=3.11.1 <4.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", "dependencies": { - "coffee-script": { - "version": "1.6.0", - "from": "coffee-script@1.6.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.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" } } }, + "text-encoding": { + "version": "0.6.4", + "from": "text-encoding@http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz" + }, + "through": { + "version": "2.3.8", + "from": "through@http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "through2": { + "version": "2.0.5", + "from": "through2@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + }, + "type-detect": { + "version": "4.0.8", + "from": "type-detect@https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + }, + "underscore": { + "version": "1.7.0", + "from": "underscore@https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" + }, + "underscore.string": { + "version": "2.2.1", + "from": "underscore.string@https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "uuid": { + "version": "3.0.0", + "from": "uuid@3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz" + }, "v8-profiler": { "version": "5.7.0", - "from": "v8-profiler@>=5.6.5 <6.0.0", + "from": "v8-profiler@https://registry.npmjs.org/v8-profiler/-/v8-profiler-5.7.0.tgz", "resolved": "https://registry.npmjs.org/v8-profiler/-/v8-profiler-5.7.0.tgz", "dependencies": { "nan": { "version": "2.7.0", - "from": "nan@>=2.5.1 <3.0.0", + "from": "nan@https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz" }, "node-pre-gyp": { "version": "0.6.37", - "from": "node-pre-gyp@>=0.6.34 <0.7.0", + "from": "node-pre-gyp@https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.37.tgz", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.37.tgz", "dependencies": { "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", + "from": "mkdirp@https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "minimist@https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "nopt": { "version": "4.0.1", - "from": "nopt@>=4.0.1 <5.0.0", + "from": "nopt@https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "dependencies": { "abbrev": { "version": "1.1.0", - "from": "abbrev@>=1.0.0 <2.0.0", + "from": "abbrev@https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz" }, "osenv": { "version": "0.1.4", - "from": "osenv@>=0.1.4 <0.2.0", + "from": "osenv@https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", "dependencies": { "os-homedir": { "version": "1.0.2", - "from": "os-homedir@>=1.0.0 <2.0.0", + "from": "os-homedir@https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" }, "os-tmpdir": { "version": "1.0.2", - "from": "os-tmpdir@>=1.0.0 <2.0.0", + "from": "os-tmpdir@https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" } } @@ -1157,57 +1970,57 @@ }, "npmlog": { "version": "4.1.2", - "from": "npmlog@>=4.0.2 <5.0.0", + "from": "npmlog@https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "dependencies": { "are-we-there-yet": { "version": "1.1.4", - "from": "are-we-there-yet@>=1.1.2 <1.2.0", + "from": "are-we-there-yet@https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "dependencies": { "delegates": { "version": "1.0.0", - "from": "delegates@>=1.0.0 <2.0.0", + "from": "delegates@https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" }, "readable-stream": { "version": "2.3.3", - "from": "readable-stream@>=2.0.6 <3.0.0", + "from": "readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.3 <2.1.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "isarray@https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "process-nextick-args@https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "safe-buffer": { "version": "5.1.1", - "from": "safe-buffer@>=5.1.1 <5.2.0", + "from": "safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, "string_decoder": { "version": "1.0.3", - "from": "string_decoder@>=1.0.3 <1.1.0", + "from": "string_decoder@https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "util-deprecate@https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -1216,52 +2029,52 @@ }, "console-control-strings": { "version": "1.1.0", - "from": "console-control-strings@>=1.1.0 <1.2.0", + "from": "console-control-strings@https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" }, "gauge": { "version": "2.7.4", - "from": "gauge@>=2.7.3 <2.8.0", + "from": "gauge@https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "dependencies": { "aproba": { "version": "1.1.2", - "from": "aproba@>=1.0.3 <2.0.0", + "from": "aproba@https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz" }, "has-unicode": { "version": "2.0.1", - "from": "has-unicode@>=2.0.0 <3.0.0", + "from": "has-unicode@https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" }, "object-assign": { "version": "4.1.1", - "from": "object-assign@>=4.1.0 <5.0.0", + "from": "object-assign@https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" }, "signal-exit": { "version": "3.0.2", - "from": "signal-exit@>=3.0.0 <4.0.0", + "from": "signal-exit@https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" }, "string-width": { "version": "1.0.2", - "from": "string-width@>=1.0.1 <2.0.0", + "from": "string-width@https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "dependencies": { "code-point-at": { "version": "1.1.0", - "from": "code-point-at@>=1.0.0 <2.0.0", + "from": "code-point-at@https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" }, "is-fullwidth-code-point": { "version": "1.0.0", - "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "from": "is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "dependencies": { "number-is-nan": { "version": "1.0.1", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "number-is-nan@https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" } } @@ -1270,107 +2083,107 @@ }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.1 <4.0.0", + "from": "strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.1.1", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" } } }, "wide-align": { "version": "1.1.2", - "from": "wide-align@>=1.1.0 <2.0.0", + "from": "wide-align@https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz" } } }, "set-blocking": { "version": "2.0.0", - "from": "set-blocking@>=2.0.0 <2.1.0", + "from": "set-blocking@https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" } } }, "rc": { "version": "1.2.1", - "from": "rc@>=1.1.7 <2.0.0", + "from": "rc@https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", "dependencies": { "deep-extend": { "version": "0.4.2", - "from": "deep-extend@>=0.4.0 <0.5.0", + "from": "deep-extend@https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz" }, "ini": { "version": "1.3.4", - "from": "ini@>=1.3.0 <1.4.0", + "from": "ini@https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.2.0 <2.0.0", + "from": "minimist@https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "strip-json-comments": { "version": "2.0.1", - "from": "strip-json-comments@>=2.0.1 <2.1.0", + "from": "strip-json-comments@https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" } } }, "rimraf": { "version": "2.6.1", - "from": "rimraf@>=2.6.1 <3.0.0", + "from": "rimraf@https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "dependencies": { "glob": { "version": "7.1.2", - "from": "glob@>=7.0.5 <8.0.0", + "from": "glob@https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "dependencies": { "fs.realpath": { "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", + "from": "fs.realpath@https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, "inflight": { "version": "1.0.6", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "inflight@https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "minimatch": { "version": "3.0.4", - "from": "minimatch@>=3.0.4 <4.0.0", + "from": "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "dependencies": { "brace-expansion": { "version": "1.1.8", - "from": "brace-expansion@>=1.1.7 <2.0.0", + "from": "brace-expansion@https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "dependencies": { "balanced-match": { "version": "1.0.0", - "from": "balanced-match@>=1.0.0 <2.0.0", + "from": "balanced-match@https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "concat-map@https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -1379,19 +2192,19 @@ }, "once": { "version": "1.4.0", - "from": "once@>=1.3.0 <2.0.0", + "from": "once@https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "path-is-absolute": { "version": "1.0.1", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "path-is-absolute@https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" } } @@ -1400,81 +2213,81 @@ }, "semver": { "version": "5.4.1", - "from": "semver@>=5.3.0 <6.0.0", + "from": "semver@https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" }, "tape": { "version": "4.8.0", - "from": "tape@>=4.6.3 <5.0.0", + "from": "tape@https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", "dependencies": { "deep-equal": { "version": "1.0.1", - "from": "deep-equal@>=1.0.1 <1.1.0", + "from": "deep-equal@https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz" }, "defined": { "version": "1.0.0", - "from": "defined@>=1.0.0 <1.1.0", + "from": "defined@https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, "for-each": { "version": "0.3.2", - "from": "for-each@>=0.3.2 <0.4.0", + "from": "for-each@https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", "dependencies": { "is-function": { "version": "1.0.1", - "from": "is-function@>=1.0.0 <1.1.0", + "from": "is-function@https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz" } } }, "function-bind": { "version": "1.1.1", - "from": "function-bind@>=1.1.0 <1.2.0", + "from": "function-bind@https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" }, "glob": { "version": "7.1.2", - "from": "glob@>=7.1.2 <7.2.0", + "from": "glob@https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "dependencies": { "fs.realpath": { "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", + "from": "fs.realpath@https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, "inflight": { "version": "1.0.6", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "inflight@https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "minimatch": { "version": "3.0.4", - "from": "minimatch@>=3.0.4 <4.0.0", + "from": "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "dependencies": { "brace-expansion": { "version": "1.1.8", - "from": "brace-expansion@>=1.1.7 <2.0.0", + "from": "brace-expansion@https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "dependencies": { "balanced-match": { "version": "1.0.0", - "from": "balanced-match@>=1.0.0 <2.0.0", + "from": "balanced-match@https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "concat-map@https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -1483,112 +2296,112 @@ }, "once": { "version": "1.4.0", - "from": "once@>=1.3.0 <2.0.0", + "from": "once@https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "path-is-absolute": { "version": "1.0.1", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "path-is-absolute@https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" } } }, "has": { "version": "1.0.1", - "from": "has@>=1.0.1 <1.1.0", + "from": "has@https://registry.npmjs.org/has/-/has-1.0.1.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.3 <2.1.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.2.0 <1.3.0", + "from": "minimist@https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "object-inspect": { "version": "1.3.0", - "from": "object-inspect@>=1.3.0 <1.4.0", + "from": "object-inspect@https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz" }, "resolve": { "version": "1.4.0", - "from": "resolve@>=1.4.0 <1.5.0", + "from": "resolve@https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", "dependencies": { "path-parse": { "version": "1.0.5", - "from": "path-parse@>=1.0.5 <2.0.0", + "from": "path-parse@https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" } } }, "resumer": { "version": "0.0.0", - "from": "resumer@>=0.0.0 <0.1.0", + "from": "resumer@https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz" }, "string.prototype.trim": { "version": "1.1.2", - "from": "string.prototype.trim@>=1.1.2 <1.2.0", + "from": "string.prototype.trim@https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "dependencies": { "define-properties": { "version": "1.1.2", - "from": "define-properties@>=1.1.2 <2.0.0", + "from": "define-properties@https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "dependencies": { "foreach": { "version": "2.0.5", - "from": "foreach@>=2.0.5 <3.0.0", + "from": "foreach@https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" }, "object-keys": { "version": "1.0.11", - "from": "object-keys@>=1.0.8 <2.0.0", + "from": "object-keys@https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz" } } }, "es-abstract": { "version": "1.8.2", - "from": "es-abstract@>=1.5.0 <2.0.0", + "from": "es-abstract@https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.2.tgz", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.2.tgz", "dependencies": { "es-to-primitive": { "version": "1.1.1", - "from": "es-to-primitive@>=1.1.1 <2.0.0", + "from": "es-to-primitive@https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "dependencies": { "is-date-object": { "version": "1.0.1", - "from": "is-date-object@>=1.0.1 <2.0.0", + "from": "is-date-object@https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz" }, "is-symbol": { "version": "1.0.1", - "from": "is-symbol@>=1.0.1 <2.0.0", + "from": "is-symbol@https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz" } } }, "is-callable": { "version": "1.1.3", - "from": "is-callable@>=1.1.3 <2.0.0", + "from": "is-callable@https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz" }, "is-regex": { "version": "1.0.4", - "from": "is-regex@>=1.0.4 <2.0.0", + "from": "is-regex@https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" } } @@ -1597,102 +2410,102 @@ }, "through": { "version": "2.3.8", - "from": "through@>=2.3.8 <2.4.0", + "from": "through@https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "tar": { "version": "2.2.1", - "from": "tar@>=2.2.1 <3.0.0", + "from": "tar@https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "dependencies": { "block-stream": { "version": "0.0.9", - "from": "block-stream@*", + "from": "block-stream@https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" }, "fstream": { "version": "1.0.11", - "from": "fstream@>=1.0.2 <2.0.0", + "from": "fstream@https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "dependencies": { "graceful-fs": { "version": "4.1.11", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "graceful-fs@https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" } } }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" } } }, "tar-pack": { "version": "3.4.0", - "from": "tar-pack@>=3.4.0 <4.0.0", + "from": "tar-pack@https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", "dependencies": { "debug": { "version": "2.6.8", - "from": "debug@>=2.2.0 <3.0.0", + "from": "debug@https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "dependencies": { "ms": { "version": "2.0.0", - "from": "ms@2.0.0", + "from": "ms@https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" } } }, "fstream": { "version": "1.0.11", - "from": "fstream@>=1.0.10 <2.0.0", + "from": "fstream@https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "dependencies": { "graceful-fs": { "version": "4.1.11", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "graceful-fs@https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.3 <2.1.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" } } }, "fstream-ignore": { "version": "1.0.5", - "from": "fstream-ignore@>=1.0.5 <2.0.0", + "from": "fstream-ignore@https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", "dependencies": { "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "minimatch": { "version": "3.0.4", - "from": "minimatch@>=3.0.0 <4.0.0", + "from": "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "dependencies": { "brace-expansion": { "version": "1.1.8", - "from": "brace-expansion@>=1.1.7 <2.0.0", + "from": "brace-expansion@https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "dependencies": { "balanced-match": { "version": "1.0.0", - "from": "balanced-match@>=1.0.0 <2.0.0", + "from": "balanced-match@https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "concat-map@https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -1703,61 +2516,61 @@ }, "once": { "version": "1.4.0", - "from": "once@>=1.3.3 <2.0.0", + "from": "once@https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "readable-stream": { "version": "2.3.3", - "from": "readable-stream@>=2.1.4 <3.0.0", + "from": "readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.3 <2.1.0", + "from": "inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "isarray@https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "process-nextick-args@https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "safe-buffer": { "version": "5.1.1", - "from": "safe-buffer@>=5.1.1 <5.2.0", + "from": "safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, "string_decoder": { "version": "1.0.3", - "from": "string_decoder@>=1.0.3 <1.1.0", + "from": "string_decoder@https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "util-deprecate@https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } }, "uid-number": { "version": "0.0.6", - "from": "uid-number@>=0.0.6 <0.0.7", + "from": "uid-number@https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" } } @@ -1765,6 +2578,26 @@ } } } + }, + "which": { + "version": "1.0.9", + "from": "which@https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" + }, + "wrappy": { + "version": "1.0.2", + "from": "wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.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@https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz" } } } diff --git a/services/chat/package.json b/services/chat/package.json index c7c1688112..baa7cb517c 100644 --- a/services/chat/package.json +++ b/services/chat/package.json @@ -7,47 +7,47 @@ "url": "https://github.com/sharelatex/chat-sharelatex.git" }, "scripts": { - "compile:app": "([ -e app/coffee ] && coffee $COFFEE_OPTIONS -o app/js -c app/coffee || echo 'No CoffeeScript folder to compile') && ( [ -e app.coffee ] && coffee $COFFEE_OPTIONS -c app.coffee || echo 'No CoffeeScript app to compile')", - "start": "npm run compile:app && node $NODE_APP_OPTIONS app.js", - "test:acceptance": "npm run compile:app && npm run compile:acceptance_tests && npm run test:acceptance:_run -- --grep=$MOCHA_GREP", - "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:all": "npm run compile:app && npm run compile:unit_tests && npm run compile:acceptance_tests && npm run compile:smoke_tests", + "start": "node $NODE_APP_OPTIONS app.js", + "test:acceptance": "npm run test:acceptance:_run -- --grep=$MOCHA_GREP", + "test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP", "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" + "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js", + "test:unit:_run": "mocha --recursive --reporter spec $@ test/unit/js", + "lint": "node_modules/.bin/eslint ." }, "dependencies": { "async": "0.2.9", - "coffee-script": "~1.7.1", "express": "3.3.1", - "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#master", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.7.1", + "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", + "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", "mongojs": "2.4.0", "redis": "~0.10.1", "request": "^2.79.0", - "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", + "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", "v8-profiler": "^5.6.5" }, "devDependencies": { + "ajv": "^5.5.2", "bunyan": "^1.0.0", "chai": "", - "grunt": "~0.4.1", - "grunt-bunyan": "^0.5.0", - "grunt-concurrent": "~0.4.2", - "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-coffee": "~0.7.0", - "grunt-contrib-watch": "~0.5.3", - "grunt-execute": "^0.2.2", - "grunt-forever": "^0.4.7", - "grunt-mocha-test": "~0.8.0", - "grunt-nodemon": "~0.1.2", - "grunt-notify": "~0.2.16", - "grunt-plato": "~0.2.1", + "eslint": "^5.11.1", + "eslint-config-prettier": "^3.3.0", + "eslint-config-standard": "^12.0.0", + "eslint-config-standard-jsx": "^6.0.2", + "eslint-config-standard-react": "^7.0.2", + "eslint-plugin-chai-expect": "^2.0.1", + "eslint-plugin-chai-friendly": "^0.4.1", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-jsx-a11y": "^6.1.2", + "eslint-plugin-mocha": "^5.2.0", + "eslint-plugin-node": "^8.0.0", + "eslint-plugin-prettier": "^3.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-react": "^7.12.2", + "eslint-plugin-standard": "^4.0.0", "mocha": "^4.1.0", "nodemon": "^1.14.11", + "prettier-eslint-cli": "^4.7.1", "sandboxed-module": "", "sinon": "", "timekeeper": "" diff --git a/services/chat/test/acceptance/coffee/DeletingAMessageTests.coffee b/services/chat/test/acceptance/coffee/DeletingAMessageTests.coffee deleted file mode 100644 index 7d6ca8b00b..0000000000 --- a/services/chat/test/acceptance/coffee/DeletingAMessageTests.coffee +++ /dev/null @@ -1,32 +0,0 @@ -{ObjectId} = require "../../../app/js/mongojs" -expect = require("chai").expect - -ChatClient = require "./helpers/ChatClient" -ChatApp = require "./helpers/ChatApp" - -describe "Deleting a message", -> - before (done) -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - @thread_id = ObjectId().toString() - ChatApp.ensureRunning done - - describe "in a thread", -> - before (done) -> - ChatClient.sendMessage @project_id, @thread_id, @user_id, "first message", (error, response, @message) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - ChatClient.sendMessage @project_id, @thread_id, @user_id, "deleted message", (error, response, @message) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - ChatClient.deleteMessage @project_id, @thread_id, @message.id, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 204 - done() - - it "should then remove the message from the threads", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(threads[@thread_id].messages.length).to.equal 1 - done() \ No newline at end of file diff --git a/services/chat/test/acceptance/coffee/DeletingAThreadTests.coffee b/services/chat/test/acceptance/coffee/DeletingAThreadTests.coffee deleted file mode 100644 index a803e730c7..0000000000 --- a/services/chat/test/acceptance/coffee/DeletingAThreadTests.coffee +++ /dev/null @@ -1,31 +0,0 @@ -{ObjectId} = require "../../../app/js/mongojs" -expect = require("chai").expect -crypto = require "crypto" - -ChatClient = require "./helpers/ChatClient" -ChatApp = require "./helpers/ChatApp" - -describe "Deleting a thread", -> - before (done) -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - ChatApp.ensureRunning done - - describe "with a thread that is deleted", -> - before (done) -> - @thread_id = ObjectId().toString() - @content = "deleted thread message" - ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - ChatClient.deleteThread @project_id, @thread_id, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 204 - done() - - it "should then not list the thread for the project", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(Object.keys(threads).length).to.equal 0 - done() diff --git a/services/chat/test/acceptance/coffee/EditingAMessageTests.coffee b/services/chat/test/acceptance/coffee/EditingAMessageTests.coffee deleted file mode 100644 index f507e4b205..0000000000 --- a/services/chat/test/acceptance/coffee/EditingAMessageTests.coffee +++ /dev/null @@ -1,34 +0,0 @@ -{ObjectId} = require "../../../app/js/mongojs" -expect = require("chai").expect - -ChatClient = require "./helpers/ChatClient" -ChatApp = require "./helpers/ChatApp" - -describe "Editing a message", -> - before (done) -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - @thread_id = ObjectId().toString() - ChatApp.ensureRunning done - - describe "in a thread", -> - before (done) -> - @content = "thread message" - @new_content = "updated thread message" - ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, @message) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - expect(@message.id).to.exist - expect(@message.content).to.equal @content - ChatClient.editMessage @project_id, @thread_id, @message.id, @new_content, (error, response, @new_message) => - expect(error).to.be.null - expect(response.statusCode).to.equal 204 - done() - - it "should then list the updated message in the threads", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(threads[@thread_id].messages.length).to.equal 1 - expect(threads[@thread_id].messages[0].content).to.equal @new_content - done() \ No newline at end of file diff --git a/services/chat/test/acceptance/coffee/GettingMessagesTests.coffee b/services/chat/test/acceptance/coffee/GettingMessagesTests.coffee deleted file mode 100644 index b0c872e5cd..0000000000 --- a/services/chat/test/acceptance/coffee/GettingMessagesTests.coffee +++ /dev/null @@ -1,64 +0,0 @@ -{ObjectId} = require "../../../app/js/mongojs" -expect = require("chai").expect -async = require "async" -crypto = require "crypto" - -ChatClient = require "./helpers/ChatClient" -ChatApp = require "./helpers/ChatApp" - -describe "Getting messages", -> - before (done) -> - @user_id1 = ObjectId().toString() - @user_id2 = ObjectId().toString() - @content1 = "foo bar" - @content2 = "hello world" - ChatApp.ensureRunning done - - describe "globally", -> - before (done) -> - @project_id = ObjectId().toString() - async.series [ - (cb) => ChatClient.sendGlobalMessage @project_id, @user_id1, @content1, cb - (cb) => ChatClient.sendGlobalMessage @project_id, @user_id2, @content2, cb - ], done - - it "should contain the messages and populated users when getting the messages", (done) -> - ChatClient.getGlobalMessages @project_id, (error, response, messages) => - expect(messages.length).to.equal 2 - messages.reverse() - expect(messages[0].content).to.equal @content1 - expect(messages[0].user_id).to.equal @user_id1 - expect(messages[1].content).to.equal @content2 - expect(messages[1].user_id).to.equal @user_id2 - done() - - describe "from all the threads", -> - before (done) -> - @project_id = ObjectId().toString() - @thread_id1 = ObjectId().toString() - @thread_id2 = ObjectId().toString() - async.series [ - (cb) => ChatClient.sendMessage @project_id, @thread_id1, @user_id1, "one", cb - (cb) => ChatClient.sendMessage @project_id, @thread_id2, @user_id2, "two", cb - (cb) => ChatClient.sendMessage @project_id, @thread_id1, @user_id1, "three", cb - (cb) => ChatClient.sendMessage @project_id, @thread_id2, @user_id2, "four", cb - ], done - - it "should contain a dictionary of threads with messages with populated users", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(Object.keys(threads).length).to.equal 2 - thread1 = threads[@thread_id1] - expect(thread1.messages.length).to.equal 2 - thread2 = threads[@thread_id2] - expect(thread2.messages.length).to.equal 2 - - expect(thread1.messages[0].content).to.equal "one" - expect(thread1.messages[0].user_id).to.equal @user_id1 - expect(thread1.messages[1].content).to.equal "three" - expect(thread1.messages[1].user_id).to.equal @user_id1 - - expect(thread2.messages[0].content).to.equal "two" - expect(thread2.messages[0].user_id).to.equal @user_id2 - expect(thread2.messages[1].content).to.equal "four" - expect(thread2.messages[1].user_id).to.equal @user_id2 - done() diff --git a/services/chat/test/acceptance/coffee/ResolvingAThreadTests.coffee b/services/chat/test/acceptance/coffee/ResolvingAThreadTests.coffee deleted file mode 100644 index d162f881f6..0000000000 --- a/services/chat/test/acceptance/coffee/ResolvingAThreadTests.coffee +++ /dev/null @@ -1,72 +0,0 @@ -{ObjectId} = require "../../../app/js/mongojs" -expect = require("chai").expect -crypto = require "crypto" - -ChatClient = require "./helpers/ChatClient" -ChatApp = require "./helpers/ChatApp" - -describe "Resolving a thread", -> - before (done) -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - ChatApp.ensureRunning done - - describe "with a resolved thread", -> - before (done) -> - @thread_id = ObjectId().toString() - @content = "resolved message" - ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - ChatClient.resolveThread @project_id, @thread_id, @user_id, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 204 - done() - - it "should then list the thread as resolved", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(threads[@thread_id].resolved).to.equal true - expect(threads[@thread_id].resolved_by_user_id).to.equal @user_id - resolved_at = new Date(threads[@thread_id].resolved_at) - expect(new Date() - resolved_at).to.be.below 1000 - done() - - describe "when a thread is not resolved", -> - before (done) -> - @thread_id = ObjectId().toString() - @content = "open message" - ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - done() - - it "should not list the thread as resolved", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(threads[@thread_id].resolved).to.be.undefined - done() - - describe "when a thread is resolved then reopened", -> - before (done) -> - @thread_id = ObjectId().toString() - @content = "resolved message" - ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - ChatClient.resolveThread @project_id, @thread_id, @user_id, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 204 - ChatClient.reopenThread @project_id, @thread_id, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 204 - done() - - it "should not list the thread as resolved", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(threads[@thread_id].resolved).to.be.undefined - done() diff --git a/services/chat/test/acceptance/coffee/SendingAMessageTests.coffee b/services/chat/test/acceptance/coffee/SendingAMessageTests.coffee deleted file mode 100644 index 64a2d5dbe5..0000000000 --- a/services/chat/test/acceptance/coffee/SendingAMessageTests.coffee +++ /dev/null @@ -1,101 +0,0 @@ -{ObjectId} = require "../../../app/js/mongojs" -expect = require("chai").expect - -ChatClient = require "./helpers/ChatClient" -ChatApp = require "./helpers/ChatApp" - -describe "Sending a message", -> - before (done) -> - ChatApp.ensureRunning done - - describe "globally", -> - before (done) -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - @content = "global message" - ChatClient.sendGlobalMessage @project_id, @user_id, @content, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - expect(body.content).to.equal @content - expect(body.user_id).to.equal @user_id - expect(body.room_id).to.equal @project_id - done() - - it "should then list the message in the project messages", (done) -> - ChatClient.getGlobalMessages @project_id, (error, response, messages) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(messages.length).to.equal 1 - expect(messages[0].content).to.equal @content - done() - - describe "to a thread", -> - before (done) -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - @thread_id = ObjectId().toString() - @content = "thread message" - ChatClient.sendMessage @project_id, @thread_id, @user_id, @content, (error, response, body) => - expect(error).to.be.null - expect(response.statusCode).to.equal 201 - expect(body.content).to.equal @content - expect(body.user_id).to.equal @user_id - expect(body.room_id).to.equal @project_id - done() - - it "should then list the message in the threads", (done) -> - ChatClient.getThreads @project_id, (error, response, threads) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(threads[@thread_id].messages.length).to.equal 1 - expect(threads[@thread_id].messages[0].content).to.equal @content - done() - - it "should not appear in the global messages", (done) -> - ChatClient.getGlobalMessages @project_id, (error, response, messages) => - expect(error).to.be.null - expect(response.statusCode).to.equal 200 - expect(messages.length).to.equal 0 - done() - - describe "failure cases", -> - before () -> - @project_id = ObjectId().toString() - @user_id = ObjectId().toString() - @thread_id = ObjectId().toString() - - describe "with a malformed user_id", -> - it "should return a graceful error", (done) -> - ChatClient.sendMessage @project_id, @thread_id, "malformed-user", "content", (error, response, body) => - expect(response.statusCode).to.equal 400 - expect(body).to.equal "Invalid user_id" - done() - - describe "with a malformed project_id", -> - it "should return a graceful error", (done) -> - ChatClient.sendMessage "malformed-project", @thread_id, @user_id, "content", (error, response, body) => - expect(response.statusCode).to.equal 400 - expect(body).to.equal "Invalid project_id" - done() - - describe "with a malformed thread_id", -> - it "should return a graceful error", (done) -> - ChatClient.sendMessage @project_id, "malformed-thread-id", @user_id, "content", (error, response, body) => - expect(response.statusCode).to.equal 400 - expect(body).to.equal "Invalid thread_id" - done() - - describe "with no content", -> - it "should return a graceful error", (done) -> - ChatClient.sendMessage @project_id, @thread_id, @user_id, null, (error, response, body) => - expect(response.statusCode).to.equal 400 - expect(body).to.equal "No content provided" - done() - - describe "with very long content", -> - it "should return a graceful error", (done) -> - content = new Buffer(10240).toString("hex") - ChatClient.sendMessage @project_id, @thread_id, @user_id, content, (error, response, body) => - expect(response.statusCode).to.equal 400 - expect(body).to.equal "Content too long (> 10240 bytes)" - done() \ No newline at end of file diff --git a/services/chat/test/acceptance/coffee/helpers/ChatApp.coffee b/services/chat/test/acceptance/coffee/helpers/ChatApp.coffee deleted file mode 100644 index 8973541003..0000000000 --- a/services/chat/test/acceptance/coffee/helpers/ChatApp.coffee +++ /dev/null @@ -1,20 +0,0 @@ -app = require('../../../../app') -require("logger-sharelatex").logger.level("error") - -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 3010, "localhost", (error) => - throw error if error? - @running = true - for callback in @callbacks - callback() \ No newline at end of file diff --git a/services/chat/test/acceptance/coffee/helpers/ChatClient.coffee b/services/chat/test/acceptance/coffee/helpers/ChatClient.coffee deleted file mode 100644 index 902d743d21..0000000000 --- a/services/chat/test/acceptance/coffee/helpers/ChatClient.coffee +++ /dev/null @@ -1,60 +0,0 @@ -request = require("request").defaults({baseUrl: "http://localhost:3010"}) - -module.exports = - sendGlobalMessage: (project_id, user_id, content, callback) -> - request.post { - url: "/project/#{project_id}/messages" - json: - user_id: user_id - content: content - }, callback - - getGlobalMessages: (project_id, callback) -> - request.get { - url: "/project/#{project_id}/messages", - json: true - }, callback - - sendMessage: (project_id, thread_id, user_id, content, callback) -> - request.post { - url: "/project/#{project_id}/thread/#{thread_id}/messages" - json: - user_id: user_id - content: content - }, callback - - getThreads: (project_id, callback) -> - request.get { - url: "/project/#{project_id}/threads", - json: true - }, callback - - resolveThread: (project_id, thread_id, user_id, callback) -> - request.post { - url: "/project/#{project_id}/thread/#{thread_id}/resolve", - json: { - user_id: user_id - } - }, callback - - reopenThread: (project_id, thread_id, callback) -> - request.post { - url: "/project/#{project_id}/thread/#{thread_id}/reopen", - }, callback - - deleteThread: (project_id, thread_id, callback) -> - request.del { - url: "/project/#{project_id}/thread/#{thread_id}", - }, callback - - editMessage: (project_id, thread_id, message_id, content, callback) -> - request.post { - url: "/project/#{project_id}/thread/#{thread_id}/messages/#{message_id}/edit" - json: - content: content - }, callback - - deleteMessage: (project_id, thread_id, message_id, callback) -> - request.del { - url: "/project/#{project_id}/thread/#{thread_id}/messages/#{message_id}", - }, callback diff --git a/services/chat/test/acceptance/js/DeletingAMessageTests.js b/services/chat/test/acceptance/js/DeletingAMessageTests.js new file mode 100644 index 0000000000..9f13530cd4 --- /dev/null +++ b/services/chat/test/acceptance/js/DeletingAMessageTests.js @@ -0,0 +1,73 @@ +/* eslint-disable + max-len, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const { ObjectId } = require('../../../app/js/mongojs') +const { expect } = require('chai') + +const ChatClient = require('./helpers/ChatClient') +const ChatApp = require('./helpers/ChatApp') + +describe('Deleting a message', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + this.thread_id = ObjectId().toString() + return ChatApp.ensureRunning(done) + }) + + return describe('in a thread', function() { + before(function(done) { + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + 'first message', + (error, response, message) => { + this.message = message + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + 'deleted message', + (error, response, message1) => { + this.message = message1 + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + return ChatClient.deleteMessage( + this.project_id, + this.thread_id, + this.message.id, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(204) + return done() + } + ) + } + ) + } + ) + }) + + return it('should then remove the message from the threads', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(threads[this.thread_id].messages.length).to.equal(1) + return done() + } + ) + }) + }) +}) diff --git a/services/chat/test/acceptance/js/DeletingAThreadTests.js b/services/chat/test/acceptance/js/DeletingAThreadTests.js new file mode 100644 index 0000000000..527e808568 --- /dev/null +++ b/services/chat/test/acceptance/js/DeletingAThreadTests.js @@ -0,0 +1,63 @@ +/* eslint-disable + max-len, + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const { ObjectId } = require('../../../app/js/mongojs') +const { expect } = require('chai') +const crypto = require('crypto') + +const ChatClient = require('./helpers/ChatClient') +const ChatApp = require('./helpers/ChatApp') + +describe('Deleting a thread', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + return ChatApp.ensureRunning(done) + }) + + return describe('with a thread that is deleted', function() { + before(function(done) { + this.thread_id = ObjectId().toString() + this.content = 'deleted thread message' + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + this.content, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + return ChatClient.deleteThread( + this.project_id, + this.thread_id, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(204) + return done() + } + ) + } + ) + }) + + return it('should then not list the thread for the project', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(Object.keys(threads).length).to.equal(0) + return done() + } + ) + }) + }) +}) diff --git a/services/chat/test/acceptance/js/EditingAMessageTests.js b/services/chat/test/acceptance/js/EditingAMessageTests.js new file mode 100644 index 0000000000..bf107412ed --- /dev/null +++ b/services/chat/test/acceptance/js/EditingAMessageTests.js @@ -0,0 +1,72 @@ +/* eslint-disable + camelcase, + max-len, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const { ObjectId } = require('../../../app/js/mongojs') +const { expect } = require('chai') + +const ChatClient = require('./helpers/ChatClient') +const ChatApp = require('./helpers/ChatApp') + +describe('Editing a message', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + this.thread_id = ObjectId().toString() + return ChatApp.ensureRunning(done) + }) + + return describe('in a thread', function() { + before(function(done) { + this.content = 'thread message' + this.new_content = 'updated thread message' + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + this.content, + (error, response, message) => { + this.message = message + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + expect(this.message.id).to.exist + expect(this.message.content).to.equal(this.content) + return ChatClient.editMessage( + this.project_id, + this.thread_id, + this.message.id, + this.new_content, + (error, response, new_message) => { + this.new_message = new_message + expect(error).to.be.null + expect(response.statusCode).to.equal(204) + return done() + } + ) + } + ) + }) + + return it('should then list the updated message in the threads', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(threads[this.thread_id].messages.length).to.equal(1) + expect(threads[this.thread_id].messages[0].content).to.equal( + this.new_content + ) + return done() + } + ) + }) + }) +}) diff --git a/services/chat/test/acceptance/js/GettingMessagesTests.js b/services/chat/test/acceptance/js/GettingMessagesTests.js new file mode 100644 index 0000000000..0fe17a5c7c --- /dev/null +++ b/services/chat/test/acceptance/js/GettingMessagesTests.js @@ -0,0 +1,138 @@ +/* eslint-disable + handle-callback-err, + max-len, + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const { ObjectId } = require('../../../app/js/mongojs') +const { expect } = require('chai') +const async = require('async') +const crypto = require('crypto') + +const ChatClient = require('./helpers/ChatClient') +const ChatApp = require('./helpers/ChatApp') + +describe('Getting messages', function() { + before(function(done) { + this.user_id1 = ObjectId().toString() + this.user_id2 = ObjectId().toString() + this.content1 = 'foo bar' + this.content2 = 'hello world' + return ChatApp.ensureRunning(done) + }) + + describe('globally', function() { + before(function(done) { + this.project_id = ObjectId().toString() + return async.series( + [ + cb => + ChatClient.sendGlobalMessage( + this.project_id, + this.user_id1, + this.content1, + cb + ), + cb => + ChatClient.sendGlobalMessage( + this.project_id, + this.user_id2, + this.content2, + cb + ) + ], + done + ) + }) + + return it('should contain the messages and populated users when getting the messages', function(done) { + return ChatClient.getGlobalMessages( + this.project_id, + (error, response, messages) => { + expect(messages.length).to.equal(2) + messages.reverse() + expect(messages[0].content).to.equal(this.content1) + expect(messages[0].user_id).to.equal(this.user_id1) + expect(messages[1].content).to.equal(this.content2) + expect(messages[1].user_id).to.equal(this.user_id2) + return done() + } + ) + }) + }) + + return describe('from all the threads', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.thread_id1 = ObjectId().toString() + this.thread_id2 = ObjectId().toString() + return async.series( + [ + cb => + ChatClient.sendMessage( + this.project_id, + this.thread_id1, + this.user_id1, + 'one', + cb + ), + cb => + ChatClient.sendMessage( + this.project_id, + this.thread_id2, + this.user_id2, + 'two', + cb + ), + cb => + ChatClient.sendMessage( + this.project_id, + this.thread_id1, + this.user_id1, + 'three', + cb + ), + cb => + ChatClient.sendMessage( + this.project_id, + this.thread_id2, + this.user_id2, + 'four', + cb + ) + ], + done + ) + }) + + return it('should contain a dictionary of threads with messages with populated users', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(Object.keys(threads).length).to.equal(2) + const thread1 = threads[this.thread_id1] + expect(thread1.messages.length).to.equal(2) + const thread2 = threads[this.thread_id2] + expect(thread2.messages.length).to.equal(2) + + expect(thread1.messages[0].content).to.equal('one') + expect(thread1.messages[0].user_id).to.equal(this.user_id1) + expect(thread1.messages[1].content).to.equal('three') + expect(thread1.messages[1].user_id).to.equal(this.user_id1) + + expect(thread2.messages[0].content).to.equal('two') + expect(thread2.messages[0].user_id).to.equal(this.user_id2) + expect(thread2.messages[1].content).to.equal('four') + expect(thread2.messages[1].user_id).to.equal(this.user_id2) + return done() + } + ) + }) + }) +}) diff --git a/services/chat/test/acceptance/js/ResolvingAThreadTests.js b/services/chat/test/acceptance/js/ResolvingAThreadTests.js new file mode 100644 index 0000000000..255a1fc5e1 --- /dev/null +++ b/services/chat/test/acceptance/js/ResolvingAThreadTests.js @@ -0,0 +1,147 @@ +/* eslint-disable + camelcase, + max-len, + no-unused-vars, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const { ObjectId } = require('../../../app/js/mongojs') +const { expect } = require('chai') +const crypto = require('crypto') + +const ChatClient = require('./helpers/ChatClient') +const ChatApp = require('./helpers/ChatApp') + +describe('Resolving a thread', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + return ChatApp.ensureRunning(done) + }) + + describe('with a resolved thread', function() { + before(function(done) { + this.thread_id = ObjectId().toString() + this.content = 'resolved message' + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + this.content, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + return ChatClient.resolveThread( + this.project_id, + this.thread_id, + this.user_id, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(204) + return done() + } + ) + } + ) + }) + + return it('should then list the thread as resolved', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(threads[this.thread_id].resolved).to.equal(true) + expect(threads[this.thread_id].resolved_by_user_id).to.equal( + this.user_id + ) + const resolved_at = new Date(threads[this.thread_id].resolved_at) + expect(new Date() - resolved_at).to.be.below(1000) + return done() + } + ) + }) + }) + + describe('when a thread is not resolved', function() { + before(function(done) { + this.thread_id = ObjectId().toString() + this.content = 'open message' + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + this.content, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + return done() + } + ) + }) + + return it('should not list the thread as resolved', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(threads[this.thread_id].resolved).to.be.undefined + return done() + } + ) + }) + }) + + return describe('when a thread is resolved then reopened', function() { + before(function(done) { + this.thread_id = ObjectId().toString() + this.content = 'resolved message' + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + this.content, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + return ChatClient.resolveThread( + this.project_id, + this.thread_id, + this.user_id, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(204) + return ChatClient.reopenThread( + this.project_id, + this.thread_id, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(204) + return done() + } + ) + } + ) + } + ) + }) + + return it('should not list the thread as resolved', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(threads[this.thread_id].resolved).to.be.undefined + return done() + } + ) + }) + }) +}) diff --git a/services/chat/test/acceptance/js/SendingAMessageTests.js b/services/chat/test/acceptance/js/SendingAMessageTests.js new file mode 100644 index 0000000000..f837a2edd5 --- /dev/null +++ b/services/chat/test/acceptance/js/SendingAMessageTests.js @@ -0,0 +1,190 @@ +/* eslint-disable + handle-callback-err, + max-len, + no-return-assign, + node/no-deprecated-api, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const { ObjectId } = require('../../../app/js/mongojs') +const { expect } = require('chai') + +const ChatClient = require('./helpers/ChatClient') +const ChatApp = require('./helpers/ChatApp') + +describe('Sending a message', function() { + before(done => ChatApp.ensureRunning(done)) + + describe('globally', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + this.content = 'global message' + return ChatClient.sendGlobalMessage( + this.project_id, + this.user_id, + this.content, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + expect(body.content).to.equal(this.content) + expect(body.user_id).to.equal(this.user_id) + expect(body.room_id).to.equal(this.project_id) + return done() + } + ) + }) + + return it('should then list the message in the project messages', function(done) { + return ChatClient.getGlobalMessages( + this.project_id, + (error, response, messages) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(messages.length).to.equal(1) + expect(messages[0].content).to.equal(this.content) + return done() + } + ) + }) + }) + + describe('to a thread', function() { + before(function(done) { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + this.thread_id = ObjectId().toString() + this.content = 'thread message' + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + this.content, + (error, response, body) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(201) + expect(body.content).to.equal(this.content) + expect(body.user_id).to.equal(this.user_id) + expect(body.room_id).to.equal(this.project_id) + return done() + } + ) + }) + + it('should then list the message in the threads', function(done) { + return ChatClient.getThreads( + this.project_id, + (error, response, threads) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(threads[this.thread_id].messages.length).to.equal(1) + expect(threads[this.thread_id].messages[0].content).to.equal( + this.content + ) + return done() + } + ) + }) + + return it('should not appear in the global messages', function(done) { + return ChatClient.getGlobalMessages( + this.project_id, + (error, response, messages) => { + expect(error).to.be.null + expect(response.statusCode).to.equal(200) + expect(messages.length).to.equal(0) + return done() + } + ) + }) + }) + + return describe('failure cases', function() { + before(function() { + this.project_id = ObjectId().toString() + this.user_id = ObjectId().toString() + return (this.thread_id = ObjectId().toString()) + }) + + describe('with a malformed user_id', () => + it('should return a graceful error', function(done) { + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + 'malformed-user', + 'content', + (error, response, body) => { + expect(response.statusCode).to.equal(400) + expect(body).to.equal('Invalid user_id') + return done() + } + ) + })) + + describe('with a malformed project_id', () => + it('should return a graceful error', function(done) { + return ChatClient.sendMessage( + 'malformed-project', + this.thread_id, + this.user_id, + 'content', + (error, response, body) => { + expect(response.statusCode).to.equal(400) + expect(body).to.equal('Invalid project_id') + return done() + } + ) + })) + + describe('with a malformed thread_id', () => + it('should return a graceful error', function(done) { + return ChatClient.sendMessage( + this.project_id, + 'malformed-thread-id', + this.user_id, + 'content', + (error, response, body) => { + expect(response.statusCode).to.equal(400) + expect(body).to.equal('Invalid thread_id') + return done() + } + ) + })) + + describe('with no content', () => + it('should return a graceful error', function(done) { + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + null, + (error, response, body) => { + expect(response.statusCode).to.equal(400) + expect(body).to.equal('No content provided') + return done() + } + ) + })) + + return describe('with very long content', () => + it('should return a graceful error', function(done) { + const content = new Buffer(10240).toString('hex') + return ChatClient.sendMessage( + this.project_id, + this.thread_id, + this.user_id, + content, + (error, response, body) => { + expect(response.statusCode).to.equal(400) + expect(body).to.equal('Content too long (> 10240 bytes)') + return done() + } + ) + })) + }) +}) diff --git a/services/chat/test/acceptance/js/helpers/ChatApp.js b/services/chat/test/acceptance/js/helpers/ChatApp.js new file mode 100644 index 0000000000..4967dc1d51 --- /dev/null +++ b/services/chat/test/acceptance/js/helpers/ChatApp.js @@ -0,0 +1,47 @@ +/* eslint-disable + handle-callback-err, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS101: Remove unnecessary use of Array.from + * DS102: Remove unnecessary code created because of implicit returns + * DS205: Consider reworking code to avoid use of IIFEs + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const app = require('../../../../app') +require('logger-sharelatex').logger.level('error') + +module.exports = { + running: false, + initing: false, + callbacks: [], + ensureRunning(callback) { + if (callback == null) { + callback = function(error) {} + } + if (this.running) { + return callback() + } else if (this.initing) { + return this.callbacks.push(callback) + } else { + this.initing = true + this.callbacks.push(callback) + return app.listen(3010, 'localhost', error => { + if (error != null) { + throw error + } + this.running = true + return (() => { + const result = [] + for (callback of Array.from(this.callbacks)) { + result.push(callback()) + } + return result + })() + }) + } + } +} diff --git a/services/chat/test/acceptance/js/helpers/ChatClient.js b/services/chat/test/acceptance/js/helpers/ChatClient.js new file mode 100644 index 0000000000..932e6cc651 --- /dev/null +++ b/services/chat/test/acceptance/js/helpers/ChatClient.js @@ -0,0 +1,113 @@ +/* eslint-disable + camelcase, + max-len, +*/ +// TODO: This file was created by bulk-decaffeinate. +// Fix any style issues and re-enable lint. +/* + * decaffeinate suggestions: + * DS102: Remove unnecessary code created because of implicit returns + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ +const request = require('request').defaults({ + baseUrl: 'http://localhost:3010' +}) + +module.exports = { + sendGlobalMessage(project_id, user_id, content, callback) { + return request.post( + { + url: `/project/${project_id}/messages`, + json: { + user_id, + content + } + }, + callback + ) + }, + + getGlobalMessages(project_id, callback) { + return request.get( + { + url: `/project/${project_id}/messages`, + json: true + }, + callback + ) + }, + + sendMessage(project_id, thread_id, user_id, content, callback) { + return request.post( + { + url: `/project/${project_id}/thread/${thread_id}/messages`, + json: { + user_id, + content + } + }, + callback + ) + }, + + getThreads(project_id, callback) { + return request.get( + { + url: `/project/${project_id}/threads`, + json: true + }, + callback + ) + }, + + resolveThread(project_id, thread_id, user_id, callback) { + return request.post( + { + url: `/project/${project_id}/thread/${thread_id}/resolve`, + json: { + user_id + } + }, + callback + ) + }, + + reopenThread(project_id, thread_id, callback) { + return request.post( + { + url: `/project/${project_id}/thread/${thread_id}/reopen` + }, + callback + ) + }, + + deleteThread(project_id, thread_id, callback) { + return request.del( + { + url: `/project/${project_id}/thread/${thread_id}` + }, + callback + ) + }, + + editMessage(project_id, thread_id, message_id, content, callback) { + return request.post( + { + url: `/project/${project_id}/thread/${thread_id}/messages/${message_id}/edit`, + json: { + content + } + }, + callback + ) + }, + + deleteMessage(project_id, thread_id, message_id, callback) { + return request.del( + { + url: `/project/${project_id}/thread/${thread_id}/messages/${message_id}` + }, + callback + ) + } +}