diff --git a/services/web/Gruntfile.coffee b/services/web/Gruntfile.coffee index 7c966260e8..63d0eb6f79 100644 --- a/services/web/Gruntfile.coffee +++ b/services/web/Gruntfile.coffee @@ -386,57 +386,3 @@ module.exports = (grunt) -> grunt.registerTask 'version', "Write the version number into sentry.jade", ['git-rev-parse', 'sed'] - - grunt.registerTask 'create-admin-user', "Create a user with the given email address and make them an admin. Update in place if the user already exists", () -> - done = @async() - email = grunt.option("email") - if !email? - console.error "Usage: grunt create-admin-user --email joe@example.com" - process.exit(1) - - settings = require "settings-sharelatex" - UserRegistrationHandler = require "./app/js/Features/User/UserRegistrationHandler" - OneTimeTokenHandler = require "./app/js/Features/Security/OneTimeTokenHandler" - UserRegistrationHandler.registerNewUser { - email: email - password: require("crypto").randomBytes(32).toString("hex") - }, (error, user) -> - if error? and error?.message != "EmailAlreadyRegistered" - throw error - user.isAdmin = true - user.save (error) -> - throw error if error? - ONE_WEEK = 7 * 24 * 60 * 60 # seconds - OneTimeTokenHandler.getNewToken user._id, { expiresIn: ONE_WEEK }, (err, token)-> - return next(err) if err? - - console.log "" - console.log """ - Successfully created #{email} as an admin user. - - Please visit the following URL to set a password for #{email} and log in: - - #{settings.siteUrl}/user/password/set?passwordResetToken=#{token} - - """ - done() - - grunt.registerTask 'delete-user', "deletes a user and all their data", () -> - done = @async() - email = grunt.option("email") - if !email? - console.error "Usage: grunt delete-user --email joe@example.com" - process.exit(1) - settings = require "settings-sharelatex" - UserGetter = require "./app/js/Features/User/UserGetter" - UserDeleter = require "./app/js/Features/User/UserDeleter" - UserGetter.getUser email:email, (error, user) -> - if error? - throw error - if !user? - console.log("user #{email} not in database, potentially already deleted") - return done() - UserDeleter.deleteUser user._id, (err)-> - if err? - throw err - done() \ No newline at end of file diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee new file mode 100644 index 0000000000..a49a419e07 --- /dev/null +++ b/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee @@ -0,0 +1,7 @@ +AnalyticsManager = require "./AnalyticsManager" + +module.exports = AnalyticsController = + recordEvent: (req, res, next) -> + AnalyticsManager.recordEvent req.session?.user?._id, req.params.event, req.body, (error) -> + return next(error) if error? + res.send 204 \ No newline at end of file diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee new file mode 100644 index 0000000000..f906118b16 --- /dev/null +++ b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee @@ -0,0 +1,43 @@ +Settings = require "settings-sharelatex" +logger = require "logger-sharelatex" +_ = require "underscore" + +if !Settings.analytics?.postgres? + module.exports = + recordEvent: (user_id, event, segmentation, callback = () ->) -> + logger.log {user_id, event, segmentation}, "no event tracking configured, logging event" + callback() +else + Sequelize = require "sequelize" + options = _.extend {logging:false}, Settings.analytics.postgres + + sequelize = new Sequelize( + Settings.analytics.postgres.database, + Settings.analytics.postgres.username, + Settings.analytics.postgres.password, + options + ) + + Event = sequelize.define("Event", { + user_id: Sequelize.STRING, + event: Sequelize.STRING, + segmentation: Sequelize.JSONB + }) + + module.exports = + recordEvent: (user_id, event, segmentation = {}, callback = (error) ->) -> + if user_id? and typeof(user_id) != "string" + user_id = user_id.toString() + if user_id == Settings.smokeTest?.userId + # Don't record smoke tests analytics + return callback() + Event + .create({ user_id, event, segmentation }) + .then( + (result) -> callback(), + (error) -> + logger.err {err: error, user_id, event, segmentation}, "error recording analytics event" + callback(error) + ) + + sync: () -> sequelize.sync() \ No newline at end of file diff --git a/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee b/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee index d75bef5207..4972144737 100644 --- a/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee +++ b/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee @@ -10,6 +10,7 @@ Settings = require "settings-sharelatex" basicAuth = require('basic-auth-connect') UserHandler = require("../User/UserHandler") UserSessionsManager = require("../User/UserSessionsManager") +Analytics = require "../Analytics/AnalyticsManager" module.exports = AuthenticationController = login: (req, res, next = (error) ->) -> @@ -37,6 +38,7 @@ module.exports = AuthenticationController = return next(error) if error? req.session.justLoggedIn = true logger.log email: email, user_id: user._id.toString(), "successful log in" + Analytics.recordEvent user._id, "user-logged-in" res.json redir: redir else AuthenticationController._recordFailedLogin() diff --git a/services/web/app/coffee/Features/Compile/ClsiManager.coffee b/services/web/app/coffee/Features/Compile/ClsiManager.coffee index 568d806e99..08ef23bcd8 100755 --- a/services/web/app/coffee/Features/Compile/ClsiManager.coffee +++ b/services/web/app/coffee/Features/Compile/ClsiManager.coffee @@ -147,6 +147,7 @@ module.exports = ClsiManager = timeout: options.timeout imageName: project.imageName draft: !!options.draft + check: options.check rootResourcePath: rootResourcePath resources: resources } diff --git a/services/web/app/coffee/Features/Compile/CompileController.coffee b/services/web/app/coffee/Features/Compile/CompileController.coffee index f3680dc38e..000465a83c 100755 --- a/services/web/app/coffee/Features/Compile/CompileController.coffee +++ b/services/web/app/coffee/Features/Compile/CompileController.coffee @@ -29,6 +29,8 @@ module.exports = CompileController = options.compiler = req.body.compiler if req.body?.draft options.draft = req.body.draft + if req.body?.check + options.check = if req.body.check is "validate" then "validate" else undefined logger.log {options:options, project_id:project_id, user_id:user_id}, "got compile request" CompileManager.compile project_id, user_id, options, (error, status, outputFiles, clsiServerId, limits, validationProblems) -> return next(error) if error? diff --git a/services/web/app/coffee/Features/References/ReferencesHandler.coffee b/services/web/app/coffee/Features/References/ReferencesHandler.coffee index fa38ddedf6..3ceeab93f8 100644 --- a/services/web/app/coffee/Features/References/ReferencesHandler.coffee +++ b/services/web/app/coffee/Features/References/ReferencesHandler.coffee @@ -4,7 +4,7 @@ settings = require("settings-sharelatex") ProjectGetter = require "../Project/ProjectGetter" UserGetter = require "../User/UserGetter" DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') -U = require('underscore') +_ = require('underscore') Async = require('async') oneMinInMs = 60 * 1000 @@ -22,24 +22,24 @@ module.exports = ReferencesHandler = _findBibFileIds: (project) -> ids = [] _process = (folder) -> - (folder.fileRefs or []).forEach (file) -> + _.each (folder.fileRefs or []), (file) -> if file?.name?.match(/^.*\.bib$/) ids.push(file._id) - (folder.folders or []).forEach (folder) -> + _.each (folder.folders or []), (folder) -> _process(folder) - (project.rootFolder or []).forEach (rootFolder) -> + _.each (project.rootFolder or []), (rootFolder) -> _process(rootFolder) return ids _findBibDocIds: (project) -> ids = [] _process = (folder) -> - (folder.docs or []).forEach (doc) -> + _.each (folder.docs or []), (doc) -> if doc?.name?.match(/^.*\.bib$/) ids.push(doc._id) - (folder.folders or []).forEach (folder) -> + _.each (folder.folders or []), (folder) -> _process(folder) - (project.rootFolder or []).forEach (rootFolder) -> + _.each (project.rootFolder or []), (rootFolder) -> _process(rootFolder) return ids diff --git a/services/web/app/coffee/Features/Security/OneTimeTokenHandler.coffee b/services/web/app/coffee/Features/Security/OneTimeTokenHandler.coffee index 66581a02b3..b84e1c9b33 100644 --- a/services/web/app/coffee/Features/Security/OneTimeTokenHandler.coffee +++ b/services/web/app/coffee/Features/Security/OneTimeTokenHandler.coffee @@ -30,5 +30,5 @@ module.exports = multi.get buildKey(token) multi.del buildKey(token) multi.exec (err, results)-> - callback err, results[0] + callback err, results?[0] diff --git a/services/web/app/coffee/Features/Uploads/ProjectUploadController.coffee b/services/web/app/coffee/Features/Uploads/ProjectUploadController.coffee index b7cab7ac5c..557a1d5449 100644 --- a/services/web/app/coffee/Features/Uploads/ProjectUploadController.coffee +++ b/services/web/app/coffee/Features/Uploads/ProjectUploadController.coffee @@ -27,8 +27,8 @@ module.exports = ProjectUploadController = uploadFile: (req, res, next) -> timer = new metrics.Timer("file-upload") - name = req.files.qqfile.originalname - path = req.files.qqfile.path + name = req.files.qqfile?.originalname + path = req.files.qqfile?.path project_id = req.params.Project_id folder_id = req.query.folder_id if !name? or name.length == 0 or name.length > 150 diff --git a/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee b/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee index 75a9debba4..f5db2e54a1 100644 --- a/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee +++ b/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee @@ -8,6 +8,7 @@ logger = require("logger-sharelatex") crypto = require("crypto") EmailHandler = require("../Email/EmailHandler") OneTimeTokenHandler = require "../Security/OneTimeTokenHandler" +Analytics = require "../Analytics/AnalyticsManager" settings = require "settings-sharelatex" module.exports = UserRegistrationHandler = @@ -62,6 +63,7 @@ module.exports = UserRegistrationHandler = cb() #this can be slow, just fire it off ], (err)-> logger.log user: user, "registered" + Analytics.recordEvent user._id, "user-registered" callback(err, user) registerNewUserAndSendActivationEmail: (email, callback = (error, user, setNewPasswordUrl) ->) -> diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index d6deffe755..5d07dc9e82 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -38,6 +38,7 @@ ContactRouter = require("./Features/Contacts/ContactRouter") ReferencesController = require('./Features/References/ReferencesController') AuthorizationMiddlewear = require('./Features/Authorization/AuthorizationMiddlewear') BetaProgramController = require('./Features/BetaProgram/BetaProgramController') +AnalyticsRouter = require('./Features/Analytics/AnalyticsRouter') logger = require("logger-sharelatex") _ = require("underscore") @@ -68,7 +69,8 @@ module.exports = class Router StaticPagesRouter.apply(webRouter, apiRouter) RealTimeProxyRouter.apply(webRouter, apiRouter) ContactRouter.apply(webRouter, apiRouter) - + AnalyticsRouter.apply(webRouter, apiRouter) + Modules.applyRouter(webRouter, apiRouter) @@ -280,4 +282,4 @@ module.exports = class Router metrics.inc("client-side-error") res.sendStatus(204) - webRouter.get '*', ErrorController.notFound \ No newline at end of file + webRouter.get '*', ErrorController.notFound diff --git a/services/web/app/views/layout.jade b/services/web/app/views/layout.jade index 83d7da4838..3c781a4b9f 100644 --- a/services/web/app/views/layout.jade +++ b/services/web/app/views/layout.jade @@ -46,76 +46,6 @@ html(itemscope, itemtype='http://schema.org/Product') - else script(type='text/javascript'). window.ga = function() { console.log("would send to GA", arguments) }; - - // Countly Analytics - if (settings.analytics && settings.analytics.countly && settings.analytics.countly.token) - script(type="text/javascript"). - var Countly = Countly || {}; - Countly.q = Countly.q || []; - Countly.app_key = '#{settings.analytics.countly.token}'; - Countly.url = '#{settings.analytics.countly.server}'; - !{ session.user ? 'Countly.device_id = "' + session.user._id + '";' : '' } - - (function() { - var cly = document.createElement('script'); cly.type = 'text/javascript'; - cly.async = true; - //enter url of script here - cly.src = 'https://cdnjs.cloudflare.com/ajax/libs/countly-sdk-web/16.6.0/countly.min.js'; - cly.onload = function(){Countly.init()}; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(cly, s); - })(); - - script(type="text/javascript") - if (session && session.user) - - var name = session.user.first_name + (session.user.last_name ? ' ' + session.user.last_name : ''); - | Countly.q.push(['user_details', { email: '#{session.user.email}', name: '#{name}' }]); - - if (justRegistered) - | Countly.q.push(['add_event',{ key: 'user-registered' }]); - - if (justLoggedIn) - | Countly.q.push(['add_event',{ key: 'user-logged-in' }]); - - if (user && user.features) - - featureFlagSet = false; - - if user.features.hasOwnProperty('collaborators') - | Countly.q.push([ 'userData.set', 'features-collaborators', #{ user.features.collaborators } ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('compileGroup') - | Countly.q.push([ 'userData.set', 'features-compileGroup', '#{ user.features.compileGroup }' ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('compileTimeout') - | Countly.q.push([ 'userData.set', 'features-compileTimeout', #{ user.features.compileTimeout } ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('dropbox') - | Countly.q.push([ 'userData.set', 'features-dropbox', #{ user.features.dropbox } ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('github') - | Countly.q.push([ 'userData.set', 'features-github', #{ user.features.github } ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('references') - | Countly.q.push([ 'userData.set', 'features-references', #{ user.features.references } ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('templates') - | Countly.q.push([ 'userData.set', 'features-templates', #{ user.features.templates } ]); - - featureFlagSet = true; - - if user.features.hasOwnProperty('versioning') - | Countly.q.push([ 'userData.set', 'features-versioning', #{ user.features.versioning } ]); - - featureFlagSet = true; - - - if featureFlagSet - | Countly.q.push(['userData.save']) - - // End countly Analytics script(type="text/javascript"). window.csrfToken = "#{csrfToken}"; diff --git a/services/web/app/views/project/editor/chat.jade b/services/web/app/views/project/editor/chat.jade index 538a5b9d37..86842c36de 100644 --- a/services/web/app/views/project/editor/chat.jade +++ b/services/web/app/views/project/editor/chat.jade @@ -45,7 +45,7 @@ aside.chat( mathjax, ng-repeat="content in message.contents track by $index" ) - span(ng-bind-html="content | linky:'_blank'") + span(ng-bind-html="content | linky:'_blank' | wrapLongWords") .new-message textarea( diff --git a/services/web/app/views/project/editor/header.jade b/services/web/app/views/project/editor/header.jade index 06ac949c04..8fef09c9c2 100644 --- a/services/web/app/views/project/editor/header.jade +++ b/services/web/app/views/project/editor/header.jade @@ -91,12 +91,14 @@ header.toolbar.toolbar-header(ng-cloak, ng-hide="state.loading") ng-if="permissions.admin", tooltip="#{translate('share')}", tooltip-placement="bottom", + ng-mouseenter="trackHover('share')" ng-click="openShareProjectModal()", ng-controller="ShareController" ) i.fa.fa-fw.fa-group a.btn.btn-full-height( href, + ng-mouseenter="trackHover('track-changes')" ng-click="toggleTrackChanges()", ng-class="{ active: (ui.view == 'track-changes') }" tooltip="#{translate('recent_changes')}", @@ -108,6 +110,7 @@ header.toolbar.toolbar-header(ng-cloak, ng-hide="state.loading") tooltip="#{translate('chat')}", tooltip-placement="bottom", ng-class="{ active: ui.chatOpen }", + ng-mouseenter="trackHover('chat')" ng-click="toggleChat()", ng-controller="ChatButtonController", ng-show="!anonymous" diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index 200c609d97..844f0f51dc 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -25,7 +25,7 @@ div.full-size.pdf(ng-controller="PdfController") dropdown-toggle ) span.caret - ul.dropdown-menu.dropdown-menu-right + ul.dropdown-menu.dropdown-menu-left li.dropdown-header #{translate("compile_mode")} li a(href, ng-click="draft = false") @@ -36,6 +36,13 @@ div.full-size.pdf(ng-controller="PdfController") i.fa.fa-fw(ng-class="{'fa-check': draft}") |  #{translate("fast")}  span.subdued [draft] + if user.betaProgram + li.dropdown-header #{translate("file_checks")} + li + a(href, ng-click="recompile({check:true})") + i.fa.fa-fw() + |  #{translate("run_syntax_check")} + span.beta-feature-badge a( href ng-click="stop()" @@ -115,7 +122,8 @@ div.full-size.pdf(ng-controller="PdfController") |   span(ng-show="entry.file") {{ entry.file }} span(ng-show="entry.line") , line {{ entry.line }} - p.entry-message(ng-show="entry.message") {{ entry.message }} + p.entry-message(ng-show="entry.message") + | {{ entry.type }} {{ entry.message }} .card.card-hint( ng-if="entry.humanReadableHint" stop-propagation="click" @@ -126,7 +134,7 @@ div.full-size.pdf(ng-controller="PdfController") ng-show="entry.humanReadableHint", ng-bind-html="wikiEnabled ? entry.humanReadableHint : stripHTMLFromString(entry.humanReadableHint)") .card-hint-actions.clearfix - .card-hint-ext-link(ng-if="wikiEnabled") + .card-hint-ext-link(ng-if="wikiEnabled && entry.extraInfoURL") a( ng-href="{{ entry.extraInfoURL }}", ng-click="trackLogHintsLearnMore()" diff --git a/services/web/app/views/project/editor/track-changes.jade b/services/web/app/views/project/editor/track-changes.jade index dc7ce38708..de3c0e1730 100644 --- a/services/web/app/views/project/editor/track-changes.jade +++ b/services/web/app/views/project/editor/track-changes.jade @@ -143,15 +143,27 @@ div#trackChanges(ng-show="ui.view == 'track-changes'") navigate-highlights="true" ) .diff-deleted.text-centered( - ng-show="trackChanges.diff.deleted" + ng-show="trackChanges.diff.deleted && !trackChanges.diff.restoreDeletedSuccess" ) p.text-serif #{translate("file_has_been_deleted", {filename:"{{ trackChanges.diff.doc.name }} "})} - p a.btn.btn-primary.btn-lg( href, - ng-click="restoreDeletedDoc()" + ng-click="restoreDeletedDoc()", + ng-disabled="trackChanges.diff.restoreInProgress" ) #{translate("restore")} + + .diff-deleted.text-centered( + ng-show="trackChanges.diff.deleted && trackChanges.diff.restoreDeletedSuccess" + ) + p.text-serif #{translate("file_restored", {filename:"{{ trackChanges.diff.doc.name }} "})} + p.text-serif #{translate("file_restored_back_to_editor")} + p + a.btn.btn-default( + href, + ng-click="backToEditorAfterRestore()", + ) #{translate("file_restored_back_to_editor_btn")} + .loading-panel(ng-show="trackChanges.diff.loading") i.fa.fa-spin.fa-refresh |   #{translate("loading")}... diff --git a/services/web/config/settings.defaults.coffee b/services/web/config/settings.defaults.coffee index f345d14129..a326c3b07d 100644 --- a/services/web/config/settings.defaults.coffee +++ b/services/web/config/settings.defaults.coffee @@ -106,8 +106,8 @@ module.exports = settings = url: "" # references: # url: "http://localhost:3040" - # notifications: - # url: "http://localhost:3042" + notifications: + url: "http://localhost:3042" templates: user_id: process.env.TEMPLATES_USER_ID or "5395eb7aad1f29a88756c7f2" diff --git a/services/web/npm-shrinkwrap.json b/services/web/npm-shrinkwrap.json index 89d5dfe8bb..a2896277a5 100644 --- a/services/web/npm-shrinkwrap.json +++ b/services/web/npm-shrinkwrap.json @@ -9,17 +9,17 @@ "dependencies": { "buffer-crc32": { "version": "0.2.5", - "from": "buffer-crc32@~0.2.1", + "from": "buffer-crc32@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz" }, "readable-stream": { "version": "1.0.34", - "from": "readable-stream@~1.0.24", + "from": "readable-stream@>=1.0.24 <1.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { @@ -29,39 +29,39 @@ }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "tar-stream": { "version": "0.3.3", - "from": "tar-stream@~0.3.0", + "from": "tar-stream@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.3.3.tgz", "dependencies": { "bl": { "version": "0.6.0", - "from": "bl@~0.6.0", + "from": "bl@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/bl/-/bl-0.6.0.tgz" }, "end-of-stream": { "version": "0.1.5", - "from": "end-of-stream@~0.1.3", + "from": "end-of-stream@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@~1.3.0", + "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } @@ -72,17 +72,17 @@ }, "zip-stream": { "version": "0.3.7", - "from": "zip-stream@~0.3.0", + "from": "zip-stream@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.3.7.tgz", "dependencies": { "crc32-stream": { "version": "0.2.0", - "from": "crc32-stream@~0.2.0", + "from": "crc32-stream@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.2.0.tgz" }, "debug": { "version": "1.0.4", - "from": "debug@~1.0.2", + "from": "debug@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "dependencies": { "ms": { @@ -94,54 +94,54 @@ }, "deflate-crc32-stream": { "version": "0.1.2", - "from": "deflate-crc32-stream@~0.1.0", + "from": "deflate-crc32-stream@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/deflate-crc32-stream/-/deflate-crc32-stream-0.1.2.tgz" } } }, "lazystream": { "version": "0.1.0", - "from": "lazystream@~0.1.0", + "from": "lazystream@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" }, "file-utils": { "version": "0.1.5", - "from": "file-utils@~0.1.5", + "from": "file-utils@>=0.1.5 <0.2.0", "resolved": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", "dependencies": { "lodash": { "version": "2.1.0", - "from": "lodash@~2.1.0", + "from": "lodash@>=2.1.0 <2.2.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" }, "iconv-lite": { "version": "0.2.11", - "from": "iconv-lite@~0.2.11", + "from": "iconv-lite@>=0.2.11 <0.3.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" }, "glob": { "version": "3.2.11", - "from": "glob@~3.2.6", + "from": "glob@>=3.2.6 <3.3.0", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@0.3", + "from": "minimatch@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@2", + "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", + "from": "sigmund@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -150,43 +150,43 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@~0.2.12", + "from": "minimatch@>=0.2.12 <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", + "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", + "from": "sigmund@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "findup-sync": { "version": "0.1.3", - "from": "findup-sync@~0.1.2", + "from": "findup-sync@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "dependencies": { "lodash": { "version": "2.4.2", - "from": "lodash@~2.4.1", + "from": "lodash@>=2.4.1 <2.5.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" } } }, "isbinaryfile": { "version": "0.1.9", - "from": "isbinaryfile@~0.1.9", + "from": "isbinaryfile@>=0.1.9 <0.2.0", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz" } } }, "lodash": { "version": "2.4.2", - "from": "lodash@~2.4.1", + "from": "lodash@>=2.4.1 <2.5.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" } } @@ -198,47 +198,47 @@ }, "base64-stream": { "version": "0.1.3", - "from": "base64-stream@^0.1.2", + "from": "base64-stream@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-0.1.3.tgz", "dependencies": { "readable-stream": { "version": "2.1.4", - "from": "readable-stream@^2.0.2", + "from": "readable-stream@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", "dependencies": { "buffer-shims": { "version": "1.0.0", - "from": "buffer-shims@^1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", "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", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@~1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", "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", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@~1.0.1", + "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -247,7 +247,7 @@ }, "basic-auth-connect": { "version": "1.0.0", - "from": "basic-auth-connect@^1.0.0", + "from": "basic-auth-connect@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz" }, "bcrypt": { @@ -268,23 +268,23 @@ } }, "body-parser": { - "version": "1.15.1", - "from": "body-parser@^1.13.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.1.tgz", + "version": "1.15.2", + "from": "body-parser@>=1.13.1 <2.0.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.2.tgz", "dependencies": { "bytes": { - "version": "2.3.0", - "from": "bytes@2.3.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz" + "version": "2.4.0", + "from": "bytes@2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz" }, "content-type": { "version": "1.0.2", - "from": "content-type@~1.0.1", + "from": "content-type@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, "debug": { "version": "2.2.0", - "from": "debug@~2.2.0", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -296,22 +296,27 @@ }, "depd": { "version": "1.1.0", - "from": "depd@~1.1.0", + "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "http-errors": { - "version": "1.4.0", - "from": "http-errors@~1.4.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz", + "version": "1.5.0", + "from": "http-errors@>=1.5.0 <1.6.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz", "dependencies": { "inherits": { "version": "2.0.1", "from": "inherits@2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, + "setprototypeof": { + "version": "1.0.1", + "from": "setprototypeof@1.0.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.1.tgz" + }, "statuses": { "version": "1.3.0", - "from": "statuses@>= 1.2.1 < 2", + "from": "statuses@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz" } } @@ -323,7 +328,7 @@ }, "on-finished": { "version": "2.3.0", - "from": "on-finished@~2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { @@ -334,14 +339,14 @@ } }, "qs": { - "version": "6.1.0", - "from": "qs@6.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz" + "version": "6.2.0", + "from": "qs@6.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" }, "raw-body": { - "version": "2.1.6", - "from": "raw-body@~2.1.6", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.6.tgz", + "version": "2.1.7", + "from": "raw-body@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", "dependencies": { "unpipe": { "version": "1.0.0", @@ -352,7 +357,7 @@ }, "type-is": { "version": "1.6.13", - "from": "type-is@~1.6.12", + "from": "type-is@>=1.6.13 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", "dependencies": { "media-typer": { @@ -362,12 +367,12 @@ }, "mime-types": { "version": "2.1.11", - "from": "mime-types@~2.1.11", + "from": "mime-types@>=2.1.11 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@~1.23.0", + "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -388,7 +393,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "from": "debug@^1.0.4", + "from": "debug@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "dependencies": { "ms": { @@ -400,37 +405,37 @@ }, "redis": { "version": "0.12.1", - "from": "redis@^0.12.1", + "from": "redis@>=0.12.1 <0.13.0", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" } } }, "contentful": { - "version": "3.3.14", - "from": "contentful@^3.3.14", - "resolved": "https://registry.npmjs.org/contentful/-/contentful-3.3.14.tgz", + "version": "3.5.0", + "from": "contentful@>=3.3.14 <4.0.0", + "resolved": "https://registry.npmjs.org/contentful/-/contentful-3.5.0.tgz", "dependencies": { "babel-runtime": { - "version": "6.9.2", - "from": "babel-runtime@^6.3.19", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "version": "6.11.6", + "from": "babel-runtime@>=6.3.19 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.11.6.tgz", "dependencies": { "core-js": { - "version": "2.4.0", - "from": "core-js@^2.4.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.0.tgz" + "version": "2.4.1", + "from": "core-js@>=2.4.0 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz" }, "regenerator-runtime": { "version": "0.9.5", - "from": "regenerator-runtime@^0.9.5", + "from": "regenerator-runtime@>=0.9.5 <0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz" } } }, "contentful-sdk-core": { - "version": "2.2.4", - "from": "contentful-sdk-core@^2.2.1", - "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-2.2.4.tgz", + "version": "2.3.4", + "from": "contentful-sdk-core@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-2.3.4.tgz", "dependencies": { "follow-redirects": { "version": "0.0.7", @@ -439,7 +444,7 @@ "dependencies": { "debug": { "version": "2.2.0", - "from": "debug@^2.2.0", + "from": "debug@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -451,28 +456,28 @@ }, "stream-consume": { "version": "0.1.0", - "from": "stream-consume@^0.1.0", + "from": "stream-consume@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz" } } }, "qs": { - "version": "6.2.0", - "from": "qs@^6.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" + "version": "6.2.1", + "from": "qs@>=6.1.0 <7.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz" } } }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@^5.0.1", + "from": "json-stringify-safe@>=5.0.1 <6.0.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" } } }, "cookie": { "version": "0.2.4", - "from": "cookie@^0.2.3", + "from": "cookie@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.4.tgz" }, "cookie-parser": { @@ -494,7 +499,7 @@ }, "csurf": { "version": "1.9.0", - "from": "csurf@^1.8.3", + "from": "csurf@>=1.8.3 <2.0.0", "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.9.0.tgz", "dependencies": { "cookie": { @@ -509,7 +514,7 @@ }, "csrf": { "version": "3.0.3", - "from": "csrf@~3.0.3", + "from": "csrf@>=3.0.3 <3.1.0", "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.3.tgz", "dependencies": { "base64-url": { @@ -534,7 +539,7 @@ "dependencies": { "random-bytes": { "version": "1.0.0", - "from": "random-bytes@~1.0.0", + "from": "random-bytes@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" } } @@ -543,7 +548,7 @@ }, "http-errors": { "version": "1.5.0", - "from": "http-errors@~1.5.0", + "from": "http-errors@>=1.5.0 <1.6.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz", "dependencies": { "inherits": { @@ -558,7 +563,7 @@ }, "statuses": { "version": "1.3.0", - "from": "statuses@>= 1.3.0 < 2", + "from": "statuses@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz" } } @@ -577,17 +582,17 @@ "dependencies": { "accepts": { "version": "1.2.13", - "from": "accepts@~1.2.9", + "from": "accepts@>=1.2.9 <1.3.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { "version": "2.1.11", - "from": "mime-types@~2.1.11", + "from": "mime-types@>=2.1.6 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@~1.23.0", + "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -611,7 +616,7 @@ }, "content-type": { "version": "1.0.2", - "from": "content-type@~1.0.1", + "from": "content-type@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, "cookie": { @@ -626,7 +631,7 @@ }, "debug": { "version": "2.2.0", - "from": "debug@~2.2.0", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -638,7 +643,7 @@ }, "depd": { "version": "1.0.1", - "from": "depd@~1.0.1", + "from": "depd@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" }, "escape-html": { @@ -648,7 +653,7 @@ }, "etag": { "version": "1.7.0", - "from": "etag@~1.7.0", + "from": "etag@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { @@ -658,7 +663,7 @@ "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@~1.0.0", + "from": "unpipe@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } @@ -675,12 +680,12 @@ }, "methods": { "version": "1.1.2", - "from": "methods@~1.1.1", + "from": "methods@>=1.1.1 <1.2.0", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@~2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { @@ -692,7 +697,7 @@ }, "parseurl": { "version": "1.3.1", - "from": "parseurl@~1.3.0", + "from": "parseurl@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { @@ -702,12 +707,12 @@ }, "proxy-addr": { "version": "1.0.10", - "from": "proxy-addr@~1.0.8", + "from": "proxy-addr@>=1.0.8 <1.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "forwarded@~0.1.0", + "from": "forwarded@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { @@ -724,7 +729,7 @@ }, "range-parser": { "version": "1.0.3", - "from": "range-parser@~1.0.2", + "from": "range-parser@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" }, "send": { @@ -739,12 +744,12 @@ }, "http-errors": { "version": "1.3.1", - "from": "http-errors@~1.3.1", + "from": "http-errors@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -761,19 +766,19 @@ }, "statuses": { "version": "1.2.1", - "from": "statuses@~1.2.1", + "from": "statuses@>=1.2.1 <1.3.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "serve-static": { "version": "1.10.3", - "from": "serve-static@~1.10.0", + "from": "serve-static@>=1.10.0 <1.11.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", "dependencies": { "escape-html": { "version": "1.0.3", - "from": "escape-html@~1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "send": { @@ -783,22 +788,22 @@ "dependencies": { "depd": { "version": "1.1.0", - "from": "depd@~1.1.0", + "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "destroy": { "version": "1.0.4", - "from": "destroy@~1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { "version": "1.3.1", - "from": "http-errors@~1.3.1", + "from": "http-errors@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -815,7 +820,7 @@ }, "statuses": { "version": "1.2.1", - "from": "statuses@~1.2.1", + "from": "statuses@>=1.2.1 <1.3.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } @@ -824,7 +829,7 @@ }, "type-is": { "version": "1.6.13", - "from": "type-is@~1.6.3", + "from": "type-is@>=1.6.3 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", "dependencies": { "media-typer": { @@ -834,12 +839,12 @@ }, "mime-types": { "version": "2.1.11", - "from": "mime-types@~2.1.11", + "from": "mime-types@>=2.1.6 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@~1.23.0", + "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -848,7 +853,7 @@ }, "vary": { "version": "1.0.1", - "from": "vary@~1.0.0", + "from": "vary@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" }, "utils-merge": { @@ -880,7 +885,7 @@ }, "debug": { "version": "2.2.0", - "from": "debug@~2.2.0", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -892,22 +897,22 @@ }, "depd": { "version": "1.0.1", - "from": "depd@~1.0.1", + "from": "depd@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" }, "on-headers": { "version": "1.0.1", - "from": "on-headers@~1.0.0", + "from": "on-headers@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" }, "parseurl": { "version": "1.3.1", - "from": "parseurl@~1.3.0", + "from": "parseurl@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "uid-safe": { "version": "2.0.0", - "from": "uid-safe@~2.0.0", + "from": "uid-safe@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", "dependencies": { "base64-url": { @@ -926,22 +931,22 @@ }, "grunt": { "version": "0.4.5", - "from": "grunt@^0.4.5", + "from": "grunt@>=0.4.5 <0.5.0", "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", "dependencies": { "async": { "version": "0.1.22", - "from": "async@~0.1.22", + "from": "async@>=0.1.22 <0.2.0", "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" }, "coffee-script": { "version": "1.3.3", - "from": "coffee-script@~1.3.3", + "from": "coffee-script@>=1.3.3 <1.4.0", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" }, "colors": { "version": "0.6.2", - "from": "colors@~0.6.2", + "from": "colors@>=0.6.2 <0.7.0", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" }, "dateformat": { @@ -951,37 +956,37 @@ }, "eventemitter2": { "version": "0.4.14", - "from": "eventemitter2@~0.4.13", + "from": "eventemitter2@>=0.4.13 <0.5.0", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" }, "findup-sync": { "version": "0.1.3", - "from": "findup-sync@~0.1.2", + "from": "findup-sync@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "dependencies": { "glob": { "version": "3.2.11", - "from": "glob@~3.2.9", + "from": "glob@>=3.2.9 <3.3.0", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@0.3", + "from": "minimatch@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@2", + "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", + "from": "sigmund@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -990,149 +995,149 @@ }, "lodash": { "version": "2.4.2", - "from": "lodash@~2.4.1", + "from": "lodash@>=2.4.1 <2.5.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" } } }, "glob": { "version": "3.1.21", - "from": "glob@~3.1.21", + "from": "glob@>=3.1.21 <3.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@~1.2.0", + "from": "graceful-fs@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.2", - "from": "inherits@1", + "from": "inherits@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, "hooker": { "version": "0.2.3", - "from": "hooker@~0.2.3", + "from": "hooker@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" }, "iconv-lite": { "version": "0.2.11", - "from": "iconv-lite@~0.2.11", + "from": "iconv-lite@>=0.2.11 <0.3.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" }, "minimatch": { "version": "0.2.14", - "from": "minimatch@~0.2.12", + "from": "minimatch@>=0.2.12 <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", + "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", + "from": "sigmund@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "nopt": { "version": "1.0.10", - "from": "nopt@~1.0.10", + "from": "nopt@>=1.0.10 <1.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "dependencies": { "abbrev": { - "version": "1.0.7", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + "version": "1.0.9", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" } } }, "rimraf": { "version": "2.2.8", - "from": "rimraf@~2.2.8", + "from": "rimraf@>=2.2.8 <2.3.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" }, "lodash": { "version": "0.9.2", - "from": "lodash@~0.9.2", + "from": "lodash@>=0.9.2 <0.10.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" }, "underscore.string": { "version": "2.2.1", - "from": "underscore.string@~2.2.1", + "from": "underscore.string@>=2.2.1 <2.3.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" }, "which": { "version": "1.0.9", - "from": "which@~1.0.5", + "from": "which@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" }, "js-yaml": { "version": "2.0.5", - "from": "js-yaml@~2.0.5", + "from": "js-yaml@>=2.0.5 <2.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", "dependencies": { "argparse": { "version": "0.1.16", - "from": "argparse@~ 0.1.11", + "from": "argparse@>=0.1.11 <0.2.0", "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", "dependencies": { "underscore": { "version": "1.7.0", - "from": "underscore@~1.7.0", + "from": "underscore@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" }, "underscore.string": { "version": "2.4.0", - "from": "underscore.string@~2.4.0", + "from": "underscore.string@>=2.4.0 <2.5.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" } } }, "esprima": { "version": "1.0.4", - "from": "esprima@~ 1.0.2", + "from": "esprima@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" } } }, "exit": { "version": "0.1.2", - "from": "exit@~0.1.1", + "from": "exit@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, "getobject": { "version": "0.1.0", - "from": "getobject@~0.1.0", + "from": "getobject@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" }, "grunt-legacy-util": { "version": "0.2.0", - "from": "grunt-legacy-util@~0.2.0", + "from": "grunt-legacy-util@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz" }, "grunt-legacy-log": { "version": "0.1.3", - "from": "grunt-legacy-log@~0.1.0", + "from": "grunt-legacy-log@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", "dependencies": { "grunt-legacy-log-utils": { "version": "0.1.1", - "from": "grunt-legacy-log-utils@~0.1.1", + "from": "grunt-legacy-log-utils@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz" }, "lodash": { "version": "2.4.2", - "from": "lodash@~2.4.1", + "from": "lodash@>=2.4.1 <2.5.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" }, "underscore.string": { "version": "2.3.3", - "from": "underscore.string@~2.3.3", + "from": "underscore.string@>=2.3.3 <2.4.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" } } @@ -1141,29 +1146,29 @@ }, "heapdump": { "version": "0.3.7", - "from": "heapdump@^0.3.7", + "from": "heapdump@>=0.3.7 <0.4.0", "resolved": "https://registry.npmjs.org/heapdump/-/heapdump-0.3.7.tgz" }, "http-proxy": { - "version": "1.13.3", - "from": "http-proxy@^1.8.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.13.3.tgz", + "version": "1.14.0", + "from": "http-proxy@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.14.0.tgz", "dependencies": { "eventemitter3": { "version": "1.2.0", - "from": "eventemitter3@1.x.x", + "from": "eventemitter3@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz" }, "requires-port": { "version": "1.0.0", - "from": "requires-port@1.x.x", + "from": "requires-port@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" } } }, "jade": { "version": "1.3.1", - "from": "jade@~1.3.1", + "from": "jade@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/jade/-/jade-1.3.1.tgz", "dependencies": { "commander": { @@ -1173,7 +1178,7 @@ }, "mkdirp": { "version": "0.3.5", - "from": "mkdirp@~0.3.5", + "from": "mkdirp@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" }, "transformers": { @@ -1183,19 +1188,19 @@ "dependencies": { "promise": { "version": "2.0.0", - "from": "promise@~2.0", + "from": "promise@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", "dependencies": { "is-promise": { "version": "1.0.1", - "from": "is-promise@~1", + "from": "is-promise@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz" } } }, "css": { "version": "1.0.8", - "from": "css@~1.0.8", + "from": "css@>=1.0.8 <1.1.0", "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", "dependencies": { "css-parse": { @@ -1212,12 +1217,12 @@ }, "uglify-js": { "version": "2.2.5", - "from": "uglify-js@~2.2.5", + "from": "uglify-js@>=2.2.5 <2.3.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", "dependencies": { "source-map": { "version": "0.1.43", - "from": "source-map@~0.1.7", + "from": "source-map@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { @@ -1229,12 +1234,12 @@ }, "optimist": { "version": "0.3.7", - "from": "optimist@~0.3.5", + "from": "optimist@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@~0.0.2", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" } } @@ -1255,23 +1260,23 @@ "dependencies": { "readdirp": { "version": "0.2.5", - "from": "readdirp@~0.2.3", + "from": "readdirp@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-0.2.5.tgz", "dependencies": { "minimatch": { - "version": "3.0.0", + "version": "3.0.3", "from": "minimatch@>=0.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@^0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", @@ -1288,17 +1293,17 @@ }, "with": { "version": "3.0.1", - "from": "with@~3.0.0", + "from": "with@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/with/-/with-3.0.1.tgz", "dependencies": { "uglify-js": { "version": "2.4.24", - "from": "uglify-js@~2.4.12", + "from": "uglify-js@>=2.4.12 <2.5.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@~0.2.6", + "from": "async@>=0.2.6 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { @@ -1315,22 +1320,22 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "from": "uglify-to-browserify@~1.0.0", + "from": "uglify-to-browserify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { "version": "3.5.4", - "from": "yargs@~3.5.4", + "from": "yargs@>=3.5.4 <3.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "camelcase@^1.0.2", + "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "decamelize": { "version": "1.2.0", - "from": "decamelize@^1.0.0", + "from": "decamelize@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "window-size": { @@ -1351,17 +1356,17 @@ }, "constantinople": { "version": "2.0.1", - "from": "constantinople@~2.0.0", + "from": "constantinople@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-2.0.1.tgz", "dependencies": { "uglify-js": { "version": "2.4.24", - "from": "uglify-js@~2.4.0", + "from": "uglify-js@>=2.4.12 <2.5.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@~0.2.6", + "from": "async@>=0.2.6 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { @@ -1378,22 +1383,22 @@ }, "uglify-to-browserify": { "version": "1.0.2", - "from": "uglify-to-browserify@~1.0.0", + "from": "uglify-to-browserify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { "version": "3.5.4", - "from": "yargs@~3.5.4", + "from": "yargs@>=3.5.4 <3.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "camelcase@^1.0.2", + "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "decamelize": { "version": "1.2.0", - "from": "decamelize@^1.0.0", + "from": "decamelize@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "window-size": { @@ -1416,7 +1421,7 @@ }, "ldapjs": { "version": "1.0.0", - "from": "ldapjs@^1.0.0", + "from": "ldapjs@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.0.tgz", "dependencies": { "asn1": { @@ -1436,12 +1441,12 @@ "dependencies": { "mv": { "version": "2.1.1", - "from": "mv@~2", + "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", + "from": "mkdirp@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { @@ -1453,50 +1458,50 @@ }, "ncp": { "version": "2.0.0", - "from": "ncp@~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", + "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", + "from": "glob@>=6.0.1 <7.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "dependencies": { "inflight": { "version": "1.0.5", - "from": "inflight@^1.0.4", + "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { - "version": "3.0.0", - "from": "minimatch@2 || 3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "version": "3.0.3", + "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@^0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", @@ -1509,7 +1514,7 @@ }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@^1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -1520,7 +1525,7 @@ }, "safe-json-stringify": { "version": "1.0.3", - "from": "safe-json-stringify@~1", + "from": "safe-json-stringify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.3.tgz" } } @@ -1537,7 +1542,7 @@ "dependencies": { "precond": { "version": "0.2.3", - "from": "precond@0.2", + "from": "precond@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" } } @@ -1554,7 +1559,7 @@ "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } @@ -1578,26 +1583,26 @@ }, "dtrace-provider": { "version": "0.6.0", - "from": "dtrace-provider@~0.6", + "from": "dtrace-provider@0.6.0", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz", "dependencies": { "nan": { - "version": "2.3.5", - "from": "nan@^2.0.8", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" + "version": "2.4.0", + "from": "nan@>=2.0.8 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz" } } } } }, "lodash": { - "version": "4.13.1", - "from": "lodash@^4.13.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + "version": "4.14.2", + "from": "lodash@>=4.13.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.14.2.tgz" }, "logger-sharelatex": { "version": "1.3.1", - "from": "logger-sharelatex@git+https://github.com/sharelatex/logger-sharelatex.git#v1.3.1", + "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.3.1", "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#bf413ec621a000cf0e08c939de38d5e24541a08c", "dependencies": { "bunyan": { @@ -1607,24 +1612,24 @@ "dependencies": { "dtrace-provider": { "version": "0.6.0", - "from": "dtrace-provider@~0.6", + "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.3.5", - "from": "nan@^2.0.8", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" + "version": "2.4.0", + "from": "nan@>=2.0.8 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz" } } }, "mv": { "version": "2.1.1", - "from": "mv@~2", + "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", + "from": "mkdirp@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { @@ -1636,50 +1641,50 @@ }, "ncp": { "version": "2.0.0", - "from": "ncp@~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", + "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", + "from": "glob@>=6.0.1 <7.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "dependencies": { "inflight": { "version": "1.0.5", - "from": "inflight@^1.0.4", + "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { - "version": "3.0.0", - "from": "minimatch@2 || 3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "version": "3.0.3", + "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@^0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", @@ -1692,19 +1697,19 @@ }, "once": { "version": "1.3.3", - "from": "once@^1.3.0", + "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "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.0", - "from": "path-is-absolute@^1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -1715,7 +1720,7 @@ }, "safe-json-stringify": { "version": "1.0.3", - "from": "safe-json-stringify@~1", + "from": "safe-json-stringify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.3.tgz" } } @@ -1727,7 +1732,7 @@ }, "raven": { "version": "0.8.1", - "from": "raven@^0.8.0", + "from": "raven@>=0.8.0 <0.9.0", "resolved": "https://registry.npmjs.org/raven/-/raven-0.8.1.tgz", "dependencies": { "cookie": { @@ -1737,7 +1742,7 @@ }, "lsmod": { "version": "0.0.3", - "from": "lsmod@~0.0.3", + "from": "lsmod@>=0.0.3 <0.1.0", "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-0.0.3.tgz" }, "stack-trace": { @@ -1756,29 +1761,29 @@ "dependencies": { "mersenne": { "version": "0.0.3", - "from": "mersenne@~0.0.3", + "from": "mersenne@>=0.0.3 <0.1.0", "resolved": "https://registry.npmjs.org/mersenne/-/mersenne-0.0.3.tgz" }, "statsd-parser": { "version": "0.0.4", - "from": "statsd-parser@~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" } } }, "marked": { - "version": "0.3.5", - "from": "marked@^0.3.5", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz" + "version": "0.3.6", + "from": "marked@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz" }, "method-override": { "version": "2.3.6", - "from": "method-override@^2.3.3", + "from": "method-override@>=2.3.3 <3.0.0", "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.6.tgz", "dependencies": { "debug": { "version": "2.2.0", - "from": "debug@~2.2.0", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -1790,24 +1795,24 @@ }, "methods": { "version": "1.1.2", - "from": "methods@~1.1.2", + "from": "methods@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "parseurl": { "version": "1.3.1", - "from": "parseurl@~1.3.1", + "from": "parseurl@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "vary": { "version": "1.1.0", - "from": "vary@~1.1.0", + "from": "vary@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz" } } }, "metrics-sharelatex": { "version": "1.3.0", - "from": "metrics-sharelatex@git+https://github.com/sharelatex/metrics-sharelatex.git#v1.3.0", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.3.0", "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#080c4aeb696edcd5d6d86f202f2c528f0661d7a6", "dependencies": { "coffee-script": { @@ -1824,19 +1829,19 @@ "dependencies": { "encoding": { "version": "0.1.12", - "from": "encoding@~0.1", + "from": "encoding@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "dependencies": { "iconv-lite": { "version": "0.4.13", - "from": "iconv-lite@~0.4.13", + "from": "iconv-lite@>=0.4.13 <0.5.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" } } }, "addressparser": { "version": "0.2.1", - "from": "addressparser@~0.2.0", + "from": "addressparser@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz" } } @@ -1853,7 +1858,7 @@ }, "growl": { "version": "1.7.0", - "from": "growl@1.7.x", + "from": "growl@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" }, "jade": { @@ -1902,29 +1907,29 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@~0.2.11", + "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", + "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", + "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", + "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.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -1938,17 +1943,17 @@ "dependencies": { "thunky": { "version": "0.1.0", - "from": "thunky@~0.1.0", + "from": "thunky@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@1.1.x", + "from": "readable-stream@>=1.1.9 <1.2.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { @@ -1958,12 +1963,12 @@ }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -1975,12 +1980,12 @@ "dependencies": { "bson": { "version": "0.2.22", - "from": "bson@~0.2", + "from": "bson@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/bson/-/bson-0.2.22.tgz", "dependencies": { "nan": { "version": "1.8.4", - "from": "nan@~1.8", + "from": "nan@>=1.8.0 <1.9.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz" } } @@ -2004,37 +2009,37 @@ "dependencies": { "buffer-shims": { "version": "1.0.0", - "from": "buffer-shims@^1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", "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", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@~1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", "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", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@~1.0.1", + "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -2055,22 +2060,22 @@ }, "bson": { "version": "0.3.2", - "from": "bson@~0.3", + "from": "bson@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/bson/-/bson-0.3.2.tgz", "dependencies": { "bson-ext": { "version": "0.1.13", - "from": "bson-ext@~0.1", + "from": "bson-ext@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/bson-ext/-/bson-ext-0.1.13.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@^1.2.1", + "from": "bindings@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "2.0.9", - "from": "nan@~2.0.9", + "from": "nan@>=2.0.9 <2.1.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.0.9.tgz" } } @@ -2099,17 +2104,17 @@ "dependencies": { "bson": { "version": "0.4.23", - "from": "bson@~0.4", + "from": "bson@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/bson/-/bson-0.4.23.tgz" }, "kerberos": { "version": "0.0.21", - "from": "kerberos@~0.0", + "from": "kerberos@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-0.0.21.tgz", "dependencies": { "nan": { "version": "2.3.5", - "from": "nan@~2.3", + "from": "nan@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" } } @@ -2123,7 +2128,7 @@ "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { @@ -2133,12 +2138,12 @@ }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -2203,12 +2208,12 @@ }, "multer": { "version": "0.1.8", - "from": "multer@^0.1.8", + "from": "multer@>=0.1.8 <0.2.0", "resolved": "https://registry.npmjs.org/multer/-/multer-0.1.8.tgz", "dependencies": { "busboy": { "version": "0.2.13", - "from": "busboy@~0.2.9", + "from": "busboy@>=0.2.9 <0.3.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.13.tgz", "dependencies": { "dicer": { @@ -2225,12 +2230,12 @@ }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@1.1.x", + "from": "readable-stream@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { @@ -2240,12 +2245,12 @@ }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -2254,17 +2259,17 @@ }, "mkdirp": { "version": "0.3.5", - "from": "mkdirp@~0.3.5", + "from": "mkdirp@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" }, "qs": { "version": "1.2.2", - "from": "qs@~1.2.2", + "from": "qs@>=1.2.2 <1.3.0", "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz" }, "type-is": { "version": "1.5.7", - "from": "type-is@~1.5.2", + "from": "type-is@>=1.5.2 <1.6.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", "dependencies": { "media-typer": { @@ -2274,12 +2279,12 @@ }, "mime-types": { "version": "2.0.14", - "from": "mime-types@~2.0.9", + "from": "mime-types@>=2.0.9 <2.1.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "dependencies": { "mime-db": { "version": "1.12.0", - "from": "mime-db@~1.12.0", + "from": "mime-db@>=1.12.0 <1.13.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" } } @@ -2426,27 +2431,27 @@ }, "nodemailer-sendgrid-transport": { "version": "0.2.0", - "from": "nodemailer-sendgrid-transport@^0.2.0", + "from": "nodemailer-sendgrid-transport@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/nodemailer-sendgrid-transport/-/nodemailer-sendgrid-transport-0.2.0.tgz", "dependencies": { "sendgrid": { "version": "1.9.2", - "from": "sendgrid@^1.8.0", + "from": "sendgrid@>=1.8.0 <2.0.0", "resolved": "https://registry.npmjs.org/sendgrid/-/sendgrid-1.9.2.tgz", "dependencies": { "mime": { "version": "1.3.4", - "from": "mime@^1.2.9", + "from": "mime@>=1.2.9 <2.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "lodash": { "version": "3.10.1", - "from": "lodash@^3.0.1 || ^2.0.0", + "from": "lodash@>=3.0.1 <4.0.0||>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "smtpapi": { "version": "1.2.0", - "from": "smtpapi@^1.2.0", + "from": "smtpapi@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/smtpapi/-/smtpapi-1.2.0.tgz" } } @@ -2454,14 +2459,14 @@ } }, "nodemailer-ses-transport": { - "version": "1.3.1", - "from": "nodemailer-ses-transport@^1.3.0", - "resolved": "https://registry.npmjs.org/nodemailer-ses-transport/-/nodemailer-ses-transport-1.3.1.tgz", + "version": "1.4.0", + "from": "nodemailer-ses-transport@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/nodemailer-ses-transport/-/nodemailer-ses-transport-1.4.0.tgz", "dependencies": { "aws-sdk": { - "version": "2.4.0", - "from": "aws-sdk@^2.3.11", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.4.0.tgz", + "version": "2.4.14", + "from": "aws-sdk@>=2.4.2 <3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.4.14.tgz", "dependencies": { "sax": { "version": "1.1.5", @@ -2480,7 +2485,7 @@ "dependencies": { "lodash": { "version": "3.5.0", - "from": "lodash@~3.5.0", + "from": "lodash@>=3.5.0 <3.6.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.5.0.tgz" } } @@ -2501,16 +2506,130 @@ "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@~0.0.2", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@~0.0.1", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, + "pg": { + "version": "6.0.3", + "from": "pg@>=6.0.3 <7.0.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-6.0.3.tgz", + "dependencies": { + "buffer-writer": { + "version": "1.0.1", + "from": "buffer-writer@1.0.1", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz" + }, + "packet-reader": { + "version": "0.2.0", + "from": "packet-reader@0.2.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.2.0.tgz" + }, + "pg-connection-string": { + "version": "0.1.3", + "from": "pg-connection-string@0.1.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz" + }, + "pg-pool": { + "version": "1.4.0", + "from": "pg-pool@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-1.4.0.tgz", + "dependencies": { + "generic-pool": { + "version": "2.4.2", + "from": "generic-pool@2.4.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.2.tgz" + }, + "object-assign": { + "version": "4.1.0", + "from": "object-assign@4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + } + } + }, + "pg-types": { + "version": "1.11.0", + "from": "pg-types@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.11.0.tgz", + "dependencies": { + "ap": { + "version": "0.2.0", + "from": "ap@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/ap/-/ap-0.2.0.tgz" + }, + "postgres-array": { + "version": "1.0.0", + "from": "postgres-array@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.0.tgz" + }, + "postgres-bytea": { + "version": "1.0.0", + "from": "postgres-bytea@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" + }, + "postgres-date": { + "version": "1.0.3", + "from": "postgres-date@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.3.tgz" + }, + "postgres-interval": { + "version": "1.0.2", + "from": "postgres-interval@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.0.2.tgz", + "dependencies": { + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + } + } + }, + "pgpass": { + "version": "0.0.6", + "from": "pgpass@0.0.6", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-0.0.6.tgz", + "dependencies": { + "split": { + "version": "1.0.0", + "from": "split@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", + "dependencies": { + "through": { + "version": "2.3.8", + "from": "through@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + } + } + } + }, + "semver": { + "version": "4.3.2", + "from": "semver@4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz" + } + } + }, + "pg-hstore": { + "version": "2.3.2", + "from": "pg-hstore@>=2.3.2 <3.0.0", + "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.2.tgz", + "dependencies": { + "underscore": { + "version": "1.8.3", + "from": "underscore@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" + } + } + }, "redback": { "version": "0.4.0", "from": "redback@0.4.0", @@ -2557,7 +2676,7 @@ "dependencies": { "mkdirp": { "version": "0.3.5", - "from": "mkdirp@~0.3.5", + "from": "mkdirp@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" } } @@ -2569,65 +2688,65 @@ "dependencies": { "coffee-script": { "version": "1.7.1", - "from": "coffee-script@~1.7.0", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "from": "lodash@>=2.4.1 <2.5.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" } } @@ -2639,22 +2758,22 @@ "dependencies": { "hooker": { "version": "0.2.3", - "from": "hooker@~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.11.1", - "from": "fs-extra@~0.11.1", + "from": "fs-extra@>=0.11.1 <0.12.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.11.1.tgz", "dependencies": { "ncp": { "version": "0.6.0", - "from": "ncp@^0.6.0", + "from": "ncp@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.6.0.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@^0.5.0", + "from": "mkdirp@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { @@ -2666,50 +2785,55 @@ }, "jsonfile": { "version": "2.3.1", - "from": "jsonfile@^2.0.0", + "from": "jsonfile@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.3.1.tgz" }, "rimraf": { - "version": "2.5.2", - "from": "rimraf@^2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", + "version": "2.5.4", + "from": "rimraf@>=2.2.8 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", "dependencies": { "glob": { - "version": "7.0.3", - "from": "glob@^7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", + "version": "7.0.5", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.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.5", - "from": "inflight@^1.0.4", + "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { - "version": "3.0.0", - "from": "minimatch@2 || 3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "version": "3.0.3", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@^0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", @@ -2722,19 +2846,19 @@ }, "once": { "version": "1.3.3", - "from": "once@^1.3.0", + "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "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.0", - "from": "path-is-absolute@^1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -2757,7 +2881,7 @@ }, "growl": { "version": "1.8.1", - "from": "growl@1.8.x", + "from": "growl@>=1.8.0 <1.9.0", "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz" }, "jade": { @@ -2806,29 +2930,29 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@~0.2.11", + "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", + "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", + "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", + "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.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -2847,7 +2971,7 @@ "dependencies": { "redis": { "version": "0.11.0", - "from": "redis@0.11.x", + "from": "redis@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/redis/-/redis-0.11.0.tgz" }, "q": { @@ -2881,19 +3005,19 @@ "dependencies": { "formatio": { "version": "1.0.2", - "from": "formatio@~1.0", + "from": "formatio@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.0.2.tgz", "dependencies": { "samsam": { "version": "1.1.3", - "from": "samsam@~1.1", + "from": "samsam@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.3.tgz" } } }, "util": { "version": "0.10.3", - "from": "util@>=0.10.3 <1", + "from": "util@>=0.10.3 <1.0.0", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "dependencies": { "inherits": { @@ -2913,58 +3037,58 @@ } }, "request": { - "version": "2.72.0", - "from": "request@^2.69.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.72.0.tgz", + "version": "2.74.0", + "from": "request@>=2.69.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", "dependencies": { "aws-sign2": { "version": "0.6.0", - "from": "aws-sign2@~0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, "aws4": { "version": "1.4.1", - "from": "aws4@^1.2.1", + "from": "aws4@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" }, "bl": { "version": "1.1.2", - "from": "bl@~1.1.2", + "from": "bl@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", "dependencies": { "readable-stream": { "version": "2.0.6", - "from": "readable-stream@~2.0.5", + "from": "readable-stream@>=2.0.5 <2.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@~1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", "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", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@~1.0.1", + "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -2973,124 +3097,124 @@ }, "caseless": { "version": "0.11.0", - "from": "caseless@~0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@~1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", "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", + "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "extend": { "version": "3.0.0", - "from": "extend@~3.0.0", + "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@~0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "1.0.0-rc4", - "from": "form-data@~1.0.0-rc3", + "from": "form-data@>=1.0.0-rc4 <1.1.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", "dependencies": { "async": { "version": "1.5.2", - "from": "async@^1.5.2", + "from": "async@>=1.5.2 <2.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, "har-validator": { "version": "2.0.6", - "from": "har-validator@~2.0.6", + "from": "har-validator@>=2.0.6 <2.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "dependencies": { "chalk": { "version": "1.1.3", - "from": "chalk@^1.1.1", + "from": "chalk@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@^2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@^1.0.2", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@^2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@^2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@^3.0.0", + "from": "strip-ansi@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@^2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@^2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@^2.9.0", + "from": "commander@>=2.9.0 <3.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>= 1.0.0", + "from": "graceful-readlink@>=1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.13.1", - "from": "is-my-json-valid@^2.12.4", + "from": "is-my-json-valid@>=2.12.4 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "generate-function@^2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@^1.1.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "dependencies": { "is-property": { "version": "1.0.2", - "from": "is-property@^1.0.0", + "from": "is-property@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } @@ -3102,19 +3226,19 @@ }, "xtend": { "version": "4.0.1", - "from": "xtend@^4.0.0", + "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@^2.0.0", + "from": "pinkie-promise@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@^2.0.0", + "from": "pinkie@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } @@ -3123,45 +3247,45 @@ }, "hawk": { "version": "3.1.3", - "from": "hawk@~3.1.3", + "from": "hawk@>=3.1.3 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@2.x.x", + "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.x.x", + "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@2.x.x", + "from": "cryptiles@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@1.x.x", + "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "http-signature": { "version": "1.1.1", - "from": "http-signature@~1.1.0", + "from": "http-signature@>=1.1.0 <1.2.0", "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", + "from": "assert-plus@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, "jsprim": { - "version": "1.2.2", - "from": "jsprim@^1.2.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "version": "1.3.0", + "from": "jsprim@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", "dependencies": { "extsprintf": { "version": "1.0.2", @@ -3181,48 +3305,48 @@ } }, "sshpk": { - "version": "1.8.3", - "from": "sshpk@^1.7.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", + "version": "1.9.2", + "from": "sshpk@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.9.2.tgz", "dependencies": { "asn1": { "version": "0.2.3", - "from": "asn1@~0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "assert-plus": { "version": "1.0.0", - "from": "assert-plus@^1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" }, "dashdash": { "version": "1.14.0", - "from": "dashdash@^1.12.0", + "from": "dashdash@>=1.12.0 <2.0.0", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz" }, "getpass": { "version": "0.1.6", - "from": "getpass@^0.1.1", + "from": "getpass@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz" }, "jsbn": { "version": "0.1.0", - "from": "jsbn@~0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" }, "tweetnacl": { "version": "0.13.3", - "from": "tweetnacl@~0.13.0", + "from": "tweetnacl@>=0.13.0 <0.14.0", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" }, "jodid25519": { "version": "1.0.2", - "from": "jodid25519@^1.0.0", + "from": "jodid25519@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" }, "ecc-jsbn": { "version": "0.1.1", - "from": "ecc-jsbn@~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" } } @@ -3231,118 +3355,118 @@ }, "is-typedarray": { "version": "1.0.0", - "from": "is-typedarray@~1.0.0", + "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, "isstream": { "version": "0.1.2", - "from": "isstream@~0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", "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", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.1.11", - "from": "mime-types@~2.1.7", + "from": "mime-types@>=2.1.7 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@~1.23.0", + "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@~1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "oauth-sign": { "version": "0.8.2", - "from": "oauth-sign@~0.8.1", + "from": "oauth-sign@>=0.8.1 <0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" }, "qs": { - "version": "6.1.0", - "from": "qs@~6.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz" + "version": "6.2.1", + "from": "qs@>=6.2.0 <6.3.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@~0.0.4", + "from": "stringstream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "tough-cookie": { - "version": "2.2.2", - "from": "tough-cookie@~2.2.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" + "version": "2.3.1", + "from": "tough-cookie@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz" }, "tunnel-agent": { "version": "0.4.3", - "from": "tunnel-agent@~0.4.1", + "from": "tunnel-agent@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" } } }, "requests": { "version": "0.1.7", - "from": "requests@^0.1.7", + "from": "requests@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/requests/-/requests-0.1.7.tgz", "dependencies": { "axo": { "version": "0.0.1", - "from": "axo@0.0.x", + "from": "axo@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/axo/-/axo-0.0.1.tgz" }, "eventemitter3": { "version": "1.1.1", - "from": "eventemitter3@1.1.x", + "from": "eventemitter3@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz" }, "extendible": { "version": "0.1.1", - "from": "extendible@0.1.x", + "from": "extendible@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/extendible/-/extendible-0.1.1.tgz" }, "hang": { "version": "1.0.0", - "from": "hang@1.0.x", + "from": "hang@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/hang/-/hang-1.0.0.tgz" }, "loads": { "version": "0.0.4", - "from": "loads@0.0.x", + "from": "loads@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/loads/-/loads-0.0.4.tgz", "dependencies": { "failure": { "version": "1.1.1", - "from": "failure@1.1.x", + "from": "failure@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/failure/-/failure-1.1.1.tgz" }, "one-time": { "version": "0.0.4", - "from": "one-time@0.0.x", + "from": "one-time@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz" }, "xhr-response": { "version": "1.0.1", - "from": "xhr-response@1.0.x", + "from": "xhr-response@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/xhr-response/-/xhr-response-1.0.1.tgz" }, "xhr-status": { "version": "1.0.0", - "from": "xhr-status@1.0.x", + "from": "xhr-status@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/xhr-status/-/xhr-status-1.0.0.tgz" } } }, "xhr-send": { "version": "1.0.0", - "from": "xhr-send@1.0.x", + "from": "xhr-send@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/xhr-send/-/xhr-send-1.0.0.tgz" } } @@ -3357,9 +3481,117 @@ "from": "sanitizer@0.1.1", "resolved": "https://registry.npmjs.org/sanitizer/-/sanitizer-0.1.1.tgz" }, + "sequelize": { + "version": "3.23.6", + "from": "sequelize@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-3.23.6.tgz", + "dependencies": { + "bluebird": { + "version": "3.4.1", + "from": "bluebird@>=3.3.4 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.1.tgz" + }, + "depd": { + "version": "1.1.0", + "from": "depd@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" + }, + "dottie": { + "version": "1.1.1", + "from": "dottie@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-1.1.1.tgz" + }, + "generic-pool": { + "version": "2.4.2", + "from": "generic-pool@2.4.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.2.tgz" + }, + "inflection": { + "version": "1.10.0", + "from": "inflection@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.10.0.tgz" + }, + "lodash": { + "version": "4.12.0", + "from": "lodash@4.12.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz" + }, + "moment": { + "version": "2.14.1", + "from": "moment@>=2.13.0 <3.0.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.14.1.tgz" + }, + "moment-timezone": { + "version": "0.5.5", + "from": "moment-timezone@>=0.5.4 <0.6.0", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.5.tgz" + }, + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.4 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "retry-as-promised": { + "version": "2.0.1", + "from": "retry-as-promised@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.0.1.tgz", + "dependencies": { + "debug": { + "version": "2.2.0", + "from": "debug@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + } + } + } + }, + "semver": { + "version": "5.3.0", + "from": "semver@>=5.0.1 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" + }, + "shimmer": { + "version": "1.1.0", + "from": "shimmer@1.1.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.1.0.tgz" + }, + "terraformer-wkt-parser": { + "version": "1.1.0", + "from": "terraformer-wkt-parser@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.0.tgz", + "dependencies": { + "terraformer": { + "version": "1.0.5", + "from": "terraformer@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.5.tgz" + } + } + }, + "toposort-class": { + "version": "1.0.1", + "from": "toposort-class@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz" + }, + "validator": { + "version": "5.5.0", + "from": "validator@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-5.5.0.tgz" + }, + "wkx": { + "version": "0.2.0", + "from": "wkx@0.2.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.2.0.tgz" + } + } + }, "settings-sharelatex": { "version": "1.0.0", - "from": "settings-sharelatex@git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", + "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#cbc5e41c1dbe6789721a14b3fdae05bf22546559", "dependencies": { "coffee-script": { @@ -3371,17 +3603,17 @@ }, "sixpack-client": { "version": "1.0.0", - "from": "sixpack-client@^1.0.0", + "from": "sixpack-client@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sixpack-client/-/sixpack-client-1.0.0.tgz" }, "temp": { "version": "0.8.3", - "from": "temp@^0.8.3", + "from": "temp@>=0.8.3 <0.9.0", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "dependencies": { "os-tmpdir": { "version": "1.0.1", - "from": "os-tmpdir@^1.0.0", + "from": "os-tmpdir@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" } } @@ -3393,22 +3625,22 @@ }, "v8-profiler": { "version": "5.6.5", - "from": "v8-profiler@^5.2.3", + "from": "v8-profiler@>=5.2.3 <6.0.0", "resolved": "https://registry.npmjs.org/v8-profiler/-/v8-profiler-5.6.5.tgz", "dependencies": { "nan": { - "version": "2.3.5", - "from": "nan@^2.3.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" + "version": "2.4.0", + "from": "nan@>=2.3.2 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz" }, "node-pre-gyp": { - "version": "0.6.28", - "from": "node-pre-gyp@^0.6.5", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.28.tgz", + "version": "0.6.29", + "from": "node-pre-gyp@>=0.6.5 <0.7.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz", "dependencies": { "mkdirp": { "version": "0.5.1", - "from": "mkdirp@~0.5.0", + "from": "mkdirp@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { @@ -3420,228 +3652,240 @@ }, "nopt": { "version": "3.0.6", - "from": "nopt@~3.0.1", + "from": "nopt@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "dependencies": { "abbrev": { - "version": "1.0.7", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + "version": "1.0.9", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" } } }, "npmlog": { - "version": "2.0.4", - "from": "npmlog@~2.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "version": "3.1.2", + "from": "npmlog@>=3.1.2 <3.2.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz", "dependencies": { - "ansi": { - "version": "0.3.1", - "from": "ansi@~0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz" - }, "are-we-there-yet": { "version": "1.1.2", - "from": "are-we-there-yet@~1.1.2", + "from": "are-we-there-yet@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", "dependencies": { "delegates": { "version": "1.0.0", - "from": "delegates@^1.0.0", + "from": "delegates@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" }, "readable-stream": { "version": "2.1.4", - "from": "readable-stream@^2.0.0 || ^1.1.13", + "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", "dependencies": { "buffer-shims": { "version": "1.0.0", - "from": "buffer-shims@^1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", "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", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@~1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", "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", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@~1.0.1", + "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } } } }, + "console-control-strings": { + "version": "1.1.0", + "from": "console-control-strings@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + }, "gauge": { - "version": "1.2.7", - "from": "gauge@~1.2.5", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "version": "2.6.0", + "from": "gauge@>=2.6.0 <2.7.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz", "dependencies": { + "aproba": { + "version": "1.0.4", + "from": "aproba@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz" + }, + "has-color": { + "version": "0.1.7", + "from": "has-color@>=0.1.7 <0.2.0", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz" + }, "has-unicode": { - "version": "2.0.0", - "from": "has-unicode@^2.0.0", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" + "version": "2.0.1", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" }, - "lodash.pad": { - "version": "4.4.0", - "from": "lodash.pad@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.4.0.tgz", + "object-assign": { + "version": "4.1.0", + "from": "object-assign@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + }, + "signal-exit": { + "version": "3.0.0", + "from": "signal-exit@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz" + }, + "string-width": { + "version": "1.0.1", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", "dependencies": { - "lodash._baseslice": { - "version": "4.0.0", - "from": "lodash._baseslice@~4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-4.0.0.tgz" + "code-point-at": { + "version": "1.0.0", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } }, - "lodash._basetostring": { - "version": "4.12.0", - "from": "lodash._basetostring@~4.12.0", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz" - }, - "lodash.tostring": { - "version": "4.1.3", - "from": "lodash.tostring@^4.0.0", - "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.3.tgz" + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } } } }, - "lodash.padend": { - "version": "4.5.0", - "from": "lodash.padend@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.5.0.tgz", + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { - "lodash._baseslice": { - "version": "4.0.0", - "from": "lodash._baseslice@~4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-4.0.0.tgz" - }, - "lodash._basetostring": { - "version": "4.12.0", - "from": "lodash._basetostring@~4.12.0", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz" - }, - "lodash.tostring": { - "version": "4.1.3", - "from": "lodash.tostring@^4.0.0", - "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.3.tgz" + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, - "lodash.padstart": { - "version": "4.5.0", - "from": "lodash.padstart@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.5.0.tgz", - "dependencies": { - "lodash._baseslice": { - "version": "4.0.0", - "from": "lodash._baseslice@~4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-4.0.0.tgz" - }, - "lodash._basetostring": { - "version": "4.12.0", - "from": "lodash._basetostring@~4.12.0", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz" - }, - "lodash.tostring": { - "version": "4.1.3", - "from": "lodash.tostring@^4.0.0", - "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.3.tgz" - } - } + "wide-align": { + "version": "1.1.0", + "from": "wide-align@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz" } } + }, + "set-blocking": { + "version": "2.0.0", + "from": "set-blocking@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" } } }, "rc": { "version": "1.1.6", - "from": "rc@~1.1.0", + "from": "rc@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", "dependencies": { "deep-extend": { "version": "0.4.1", - "from": "deep-extend@~0.4.0", + "from": "deep-extend@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" }, "ini": { "version": "1.3.4", - "from": "ini@~1.3.0", + "from": "ini@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "minimist": { "version": "1.2.0", - "from": "minimist@^1.2.0", + "from": "minimist@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "strip-json-comments": { "version": "1.0.4", - "from": "strip-json-comments@~1.0.4", + "from": "strip-json-comments@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" } } }, "rimraf": { - "version": "2.5.2", - "from": "rimraf@~2.5.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", + "version": "2.5.4", + "from": "rimraf@>=2.5.0 <2.6.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", "dependencies": { "glob": { - "version": "7.0.3", - "from": "glob@^7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", + "version": "7.0.5", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.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.5", - "from": "inflight@^1.0.4", + "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { - "version": "3.0.0", - "from": "minimatch@2 || 3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "version": "3.0.3", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@^0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", @@ -3654,19 +3898,19 @@ }, "once": { "version": "1.3.3", - "from": "once@^1.3.0", + "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "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.0", - "from": "path-is-absolute@^1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -3674,13 +3918,13 @@ } }, "semver": { - "version": "5.1.0", - "from": "semver@~5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + "version": "5.2.0", + "from": "semver@>=5.2.0 <5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz" }, "tar": { "version": "2.2.1", - "from": "tar@~2.2.0", + "from": "tar@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "dependencies": { "block-stream": { @@ -3689,32 +3933,32 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" }, "fstream": { - "version": "1.0.9", - "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.9.tgz", + "version": "1.0.10", + "from": "fstream@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", "dependencies": { "graceful-fs": { - "version": "4.1.4", - "from": "graceful-fs@^4.1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + "version": "4.1.5", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.5.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "tar-pack": { - "version": "3.1.3", - "from": "tar-pack@~3.1.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz", + "version": "3.1.4", + "from": "tar-pack@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz", "dependencies": { "debug": { "version": "2.2.0", - "from": "debug@~2.2.0", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -3725,46 +3969,46 @@ } }, "fstream": { - "version": "1.0.9", - "from": "fstream@~1.0.8", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.9.tgz", + "version": "1.0.10", + "from": "fstream@>=1.0.10 <1.1.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", "dependencies": { "graceful-fs": { - "version": "4.1.4", - "from": "graceful-fs@^4.1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + "version": "4.1.5", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.5.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.0", + "from": "inherits@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "fstream-ignore": { "version": "1.0.5", - "from": "fstream-ignore@~1.0.3", + "from": "fstream-ignore@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { - "version": "3.0.0", - "from": "minimatch@^3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "version": "3.0.3", + "from": "minimatch@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@^0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", @@ -3779,56 +4023,61 @@ }, "once": { "version": "1.3.3", - "from": "once@~1.3.3", + "from": "once@>=1.3.3 <1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@1", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@~2.0.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "version": "2.1.4", + "from": "readable-stream@>=2.1.4 <2.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", + "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", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@~1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", "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", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@~1.0.1", + "from": "util-deprecate@>=1.0.1 <1.1.0", "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", + "from": "uid-number@>=0.0.6 <0.1.0", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" } } diff --git a/services/web/package.json b/services/web/package.json index 71fba8f719..83381005f0 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -46,6 +46,8 @@ "nodemailer-sendgrid-transport": "^0.2.0", "nodemailer-ses-transport": "^1.3.0", "optimist": "0.6.1", + "pg": "^6.0.3", + "pg-hstore": "^2.3.2", "redback": "0.4.0", "redis": "0.10.1", "redis-sharelatex": "0.0.9", @@ -53,6 +55,7 @@ "requests": "^0.1.7", "rimraf": "2.2.6", "sanitizer": "0.1.1", + "sequelize": "^3.2.0", "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", "sixpack-client": "^1.0.0", "temp": "^0.8.3", diff --git a/services/web/public/coffee/filters/wrapLongWords.coffee b/services/web/public/coffee/filters/wrapLongWords.coffee new file mode 100644 index 0000000000..db502e848a --- /dev/null +++ b/services/web/public/coffee/filters/wrapLongWords.coffee @@ -0,0 +1,25 @@ +define [ + "base" +], (App) -> + DEF_MIN_LENGTH = 20 + + _decodeHTMLEntities = (str) -> + str.replace /&#(\d+);/g, (match, dec) -> + String.fromCharCode dec; + + _getWrappedWordsString = (baseStr, wrapperElName, minLength) -> + minLength = minLength || DEF_MIN_LENGTH + words = baseStr.split ' ' + + wordsWrapped = for word in words + if _decodeHTMLEntities(word).length >= minLength + "<#{wrapperElName} class=\"break-word\">#{word}" + else + word + + outputStr = wordsWrapped.join ' ' + + + App.filter "wrapLongWords", () -> + (input, minLength) -> + _getWrappedWordsString input, "span", minLength \ No newline at end of file diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 4c75ab5d77..be82aa72a8 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -9,6 +9,7 @@ define [ "ide/pdf/PdfManager" "ide/binary-files/BinaryFilesManager" "ide/references/ReferencesManager" + "ide/SafariScrollPatcher" "ide/settings/index" "ide/share/index" "ide/chat/index" @@ -40,6 +41,7 @@ define [ PdfManager BinaryFilesManager ReferencesManager + SafariScrollPatcher ) -> App.controller "IdeController", ($scope, $timeout, ide, localStorage, event_tracking) -> @@ -72,13 +74,16 @@ define [ # Tracking code. $scope.$watch "ui.view", (newView, oldView) -> if newView? and newView != "editor" and newView != "pdf" - event_tracking.sendCountlyOnce "ide-open-view-#{ newView }-once" + event_tracking.sendMBOnce "ide-open-view-#{ newView }-once" $scope.$watch "ui.chatOpen", (isOpen) -> - event_tracking.sendCountlyOnce "ide-open-chat-once" if isOpen + event_tracking.sendMBOnce "ide-open-chat-once" if isOpen $scope.$watch "ui.leftMenuShown", (isOpen) -> - event_tracking.sendCountlyOnce "ide-open-left-menu-once" if isOpen + event_tracking.sendMBOnce "ide-open-left-menu-once" if isOpen + + $scope.trackHover = (feature) -> + event_tracking.sendMBOnce "ide-hover-#{feature}-once" # End of tracking code. window._ide = ide @@ -135,6 +140,9 @@ define [ catch err console.error err + if ide.browserIsSafari + ide.safariScrollPatcher = new SafariScrollPatcher($scope) + # User can append ?ft=somefeature to url to activate a feature toggle ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1] diff --git a/services/web/public/coffee/ide/SafariScrollPatcher.coffee b/services/web/public/coffee/ide/SafariScrollPatcher.coffee new file mode 100644 index 0000000000..07ad2e7565 --- /dev/null +++ b/services/web/public/coffee/ide/SafariScrollPatcher.coffee @@ -0,0 +1,78 @@ +define [ +], () -> + class SafariScrollPatcher + constructor: ($scope) -> + @isOverAce = false # Flag to control if the pointer is over Ace. + @pdfDiv = null + @aceDiv = null + + # Start listening to PDF wheel events when the pointer leaves the PDF region. + # P.S. This is the problem in a nutshell: although the pointer is elsewhere, + # wheel events keep being dispatched to the PDF. + @handlePdfDivMouseLeave = () => + @pdfDiv.addEventListener "wheel", @dispatchToAce + + # Stop listening to wheel events when the pointer enters the PDF region. If + # the pointer is over the PDF, native behaviour is adequate. + @handlePdfDivMouseEnter = () => + @pdfDiv.removeEventListener "wheel", @dispatchToAce + + # Set the "pointer over Ace" flag as false, when the mouse leaves its area. + @handleAceDivMouseLeave = () => + @isOverAce = false + + # Set the "pointer over Ace" flag as true, when the mouse enters its area. + @handleAceDivMouseEnter = () => + @isOverAce = true + + # Grab the elements (pdfDiv, aceDiv) and set the "hover" event listeners. + # If elements are already defined, clear existing event listeners and do + # the process again (grab elements, set listeners). + @setListeners = () => + @isOverAce = false + + # If elements aren't null, remove existing listeners. + if @pdfDiv? + @pdfDiv.removeEventListener @handlePdfDivMouseLeave + @pdfDiv.removeEventListener @handlePdfDivMouseEnter + + if @aceDiv? + @aceDiv.removeEventListener @handleAceDivMouseLeave + @aceDiv.removeEventListener @handleAceDivMouseEnter + + # Grab elements. + @pdfDiv = document.querySelector ".pdfjs-viewer" # Grab the PDF div. + @aceDiv = document.querySelector ".ace_content" # Also the editor. + + # Set hover-related listeners. + @pdfDiv.addEventListener "mouseleave", @handlePdfDivMouseLeave + @pdfDiv.addEventListener "mouseenter", @handlePdfDivMouseEnter + @aceDiv.addEventListener "mouseleave", @handleAceDivMouseLeave + @aceDiv.addEventListener "mouseenter", @handleAceDivMouseEnter + + # Handler for wheel events on the PDF. + # If the pointer is over Ace, grab the event, prevent default behaviour + # and dispatch it to Ace. + @dispatchToAce = (e) => + if @isOverAce + # If this is logged, the problem just happened: the event arrived + # here (the PDF wheel handler), but it should've gone to Ace. + + # Small timeout - if we dispatch immediately, an exception is thrown. + window.setTimeout(() => + # Dispatch the exact same event to Ace (this will keep values + # values e.g. `wheelDelta` consistent with user interaction). + @aceDiv.dispatchEvent e + , 1) + + # Avoid scrolling the PDF, as we assume this was intended to the + # editor. + e.preventDefault() + + # "loaded" event is emitted from the pdfViewer controller $scope. This means + # that the previous PDF DOM element was destroyed and a new one is available, + # so we need to grab the elements and set the listeners again. + $scope.$on "loaded", () => + @setListeners() + + diff --git a/services/web/public/coffee/ide/chat/index.coffee b/services/web/public/coffee/ide/chat/index.coffee index d5a537903b..de9c46d62d 100644 --- a/services/web/public/coffee/ide/chat/index.coffee +++ b/services/web/public/coffee/ide/chat/index.coffee @@ -3,4 +3,5 @@ define [ "ide/chat/controllers/ChatController" "ide/chat/controllers/ChatMessageController" "ide/chat/directives/mathjax" + "filters/wrapLongWords" ], () -> \ No newline at end of file diff --git a/services/web/public/coffee/ide/editor/EditorManager.coffee b/services/web/public/coffee/ide/editor/EditorManager.coffee index 54d56cac19..64cbe1d884 100644 --- a/services/web/public/coffee/ide/editor/EditorManager.coffee +++ b/services/web/public/coffee/ide/editor/EditorManager.coffee @@ -46,7 +46,7 @@ define [ done = () => if options.gotoLine? - @$scope.$broadcast "editor:gotoLine", options.gotoLine + @$scope.$broadcast "editor:gotoLine", options.gotoLine, options.gotoColumn if doc.id == @$scope.editor.open_doc_id and !options.forceReopen @$scope.$apply () => diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee index 7019b213b5..6e238122e1 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee @@ -23,10 +23,10 @@ define [], () -> @storeCursorPosition(@editor.getSession()) @storeScrollTopPosition(@editor.getSession()) - @$scope.$on "#{@$scope.name}:gotoLine", (editor, value) => - if value? + @$scope.$on "#{@$scope.name}:gotoLine", (editor, line, column) => + if line? setTimeout () => - @gotoLine(value) + @gotoLine(line, column) , 10 # Hack: Must happen after @gotoStoredPosition storeScrollTopPosition: (session) -> @@ -53,6 +53,6 @@ define [], () -> @editor.getSession().setScrollTop(pos.scrollTop or 0) delete @ignoreCursorPositionChanges - gotoLine: (line) -> - @editor.gotoLine(line) - @editor.focus() \ No newline at end of file + gotoLine: (line, column) -> + @editor.gotoLine(line, column) + @editor.focus() diff --git a/services/web/public/coffee/ide/hotkeys/controllers/HotkeysController.coffee b/services/web/public/coffee/ide/hotkeys/controllers/HotkeysController.coffee index 36eaa5d555..18d075c094 100644 --- a/services/web/public/coffee/ide/hotkeys/controllers/HotkeysController.coffee +++ b/services/web/public/coffee/ide/hotkeys/controllers/HotkeysController.coffee @@ -4,7 +4,7 @@ define [ ], (App) -> App.controller "HotkeysController", ($scope, $modal, event_tracking) -> $scope.openHotkeysModal = -> - event_tracking.sendCountly "ide-open-hotkeys-modal" + event_tracking.sendMB "ide-open-hotkeys-modal" $modal.open { templateUrl: "hotkeysModalTemplate" diff --git a/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogs.coffee b/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogs.coffee index 747ca1ad08..e59e35a40c 100644 --- a/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogs.coffee +++ b/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogs.coffee @@ -3,7 +3,10 @@ define [ "ide/human-readable-logs/HumanReadableLogsRules" ], (LogParser, ruleset) -> parse : (rawLog, options) -> - parsedLogEntries = LogParser.parse(rawLog, options) + if typeof rawLog is 'string' + parsedLogEntries = LogParser.parse(rawLog, options) + else + parsedLogEntries = rawLog _getRule = (logMessage) -> return rule for rule in ruleset when rule.regexToMatch.test logMessage @@ -12,7 +15,12 @@ define [ ruleDetails = _getRule entry.message if (ruleDetails?) - entry.ruleId = 'hint_' + ruleDetails.regexToMatch.toString().replace(/\s/g, '_').slice(1, -1) if ruleDetails.regexToMatch? + if ruleDetails.ruleId? + entry.ruleId = ruleDetails.ruleId + else if ruleDetails.regexToMatch? + entry.ruleId = 'hint_' + ruleDetails.regexToMatch.toString().replace(/\s/g, '_').slice(1, -1) + if ruleDetails.newMessage? + entry.message = entry.message.replace ruleDetails.regexToMatch, ruleDetails.newMessage entry.humanReadableHint = ruleDetails.humanReadableHint if ruleDetails.humanReadableHint? entry.extraInfoURL = ruleDetails.extraInfoURL if ruleDetails.extraInfoURL? diff --git a/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogsRules.coffee b/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogsRules.coffee index f123515deb..c61c61506b 100644 --- a/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogsRules.coffee +++ b/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogsRules.coffee @@ -88,4 +88,19 @@ define -> [ humanReadableHint: """ You have used a font command which is only available in math mode. To use this command, you must be in maths mode (E.g. $ \u2026 $ or \\begin{math} \u2026 \\end{math}). If you want to use it outside of math mode, use the text version instead: \\textrm, \\textit, etc. """ + , + ruleId: "hint_mismatched_environment" + regexToMatch: /Error: `([^']{2,})' expected, found `([^']{2,})'.*/ + newMessage: "Error: environment does not match \\begin{$1} ... \\end{$2}" + humanReadableHint: """ + You have used \\begin{...} without a corresponding \\end{...}. + """ + , + ruleId: "hint_mismatched_brackets" + regexToMatch: /Error: `([^a-zA-Z0-9])' expected, found `([^a-zA-Z0-9])'.*/ + newMessage: "Error: brackets do not match, found '$2' instead of '$1'" + humanReadableHint: """ + You have used an open bracket without a corresponding close bracket. + """ + ] diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 0f8134258c..fd133e1bc3 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -36,11 +36,11 @@ define [ $scope.logHintsNegFeedbackValues = logHintsFeedback.feedbackOpts $scope.trackLogHintsLearnMore = () -> - event_tracking.sendCountly "logs-hints-learn-more" + event_tracking.sendMB "logs-hints-learn-more" trackLogHintsFeedback = (isPositive, hintId) -> event_tracking.send "log-hints", (if isPositive then "feedback-positive" else "feedback-negative"), hintId - event_tracking.sendCountly (if isPositive then "log-hints-feedback-positive" else "log-hints-feedback-negative"), { hintId } + event_tracking.sendMB (if isPositive then "log-hints-feedback-positive" else "log-hints-feedback-negative"), { hintId } $scope.trackLogHintsNegFeedbackDetails = (hintId, feedbackOpt, feedbackOtherVal) -> logHintsFeedback.submitFeedback hintId, feedbackOpt, feedbackOtherVal @@ -86,11 +86,15 @@ define [ return $http.post url, { rootDoc_id: options.rootDocOverride_id or null draft: $scope.draft + check: if options.check then "validate" else null _csrf: window.csrfToken }, {params: params} parseCompileResponse = (response) -> + # keep last url + last_pdf_url = $scope.pdf.url + # Reset everything $scope.pdf.error = false $scope.pdf.timedout = false @@ -120,11 +124,23 @@ define [ if response.status == "timedout" $scope.pdf.view = 'errors' $scope.pdf.timedout = true - fetchLogs(fileByPath['output.log'], fileByPath['output.blg']) + fetchLogs(fileByPath) else if response.status == "terminated" $scope.pdf.view = 'errors' $scope.pdf.compileTerminated = true - fetchLogs(fileByPath['output.log'], fileByPath['output.blg']) + fetchLogs(fileByPath) + else if response.status in ["validation-fail", "validation-pass"] + $scope.pdf.view = 'pdf' + $scope.pdf.compileExited = true + $scope.pdf.url = last_pdf_url + $scope.shouldShowLogs = true + fetchLogs(fileByPath, { validation: true }) + else if response.status == "exited" + $scope.pdf.view = 'pdf' + $scope.pdf.compileExited = true + $scope.pdf.url = last_pdf_url + $scope.shouldShowLogs = true + fetchLogs(fileByPath) else if response.status == "autocompile-backoff" $scope.pdf.view = 'uncompiled' else if response.status == "project-too-large" @@ -134,7 +150,7 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.failure = true $scope.shouldShowLogs = true - fetchLogs(fileByPath['output.log'], fileByPath['output.blg']) + fetchLogs(fileByPath) else if response.status == 'clsi-maintenance' $scope.pdf.view = 'errors' $scope.pdf.clsiMaintenance = true @@ -165,7 +181,7 @@ define [ qs.popupDownload = true $scope.pdf.downloadUrl = "/project/#{$scope.project_id}/output/output.pdf" + createQueryString(qs) - fetchLogs(fileByPath['output.log'], fileByPath['output.blg']) + fetchLogs(fileByPath) IGNORE_FILES = ["output.fls", "output.fdb_latexmk"] $scope.pdf.outputFiles = [] @@ -186,7 +202,13 @@ define [ } - fetchLogs = (logFile, blgFile) -> + fetchLogs = (fileByPath, options) -> + + if options?.validation + chktexFile = fileByPath['output.chktex'] + else + logFile = fileByPath['output.log'] + blgFile = fileByPath['output.blg'] getFile = (name, file) -> opts = @@ -213,6 +235,8 @@ define [ accumulateResults = (newEntries) -> for key in ['all', 'errors', 'warnings'] + if newEntries.type? + entry.type = newEntries.type for entry in newEntries[key] logEntries[key] = logEntries[key].concat newEntries[key] # use the parsers for each file type @@ -222,10 +246,24 @@ define [ all = [].concat errors, warnings, typesetting accumulateResults {all, errors, warnings} + processChkTex = (log) -> + errors = [] + warnings = [] + for line in log.split("\n") + if m = line.match /^(\S+):(\d+):(\d+): (Error|Warning): (.*)/ + result = { file:m[1], line:m[2], column:m[3], level:m[4].toLowerCase(), message: "#{m[4]}: #{m[5]}"} + if result.level is 'error' + errors.push result + else + warnings.push result + all = [].concat errors, warnings + logHints = HumanReadableLogs.parse {type: "Validation", all, errors, warnings} + accumulateResults logHints + processBiber = (log) -> {errors, warnings} = BibLogParser.parse(log, {}) all = [].concat errors, warnings - accumulateResults {all, errors, warnings} + accumulateResults {type: "BibTeX", all, errors, warnings} # output the results handleError = () -> @@ -248,19 +286,35 @@ define [ } # retrieve the logfile and process it - response = getFile('output.log', logFile) - .success processLog - .error handleError + if logFile? + response = getFile('output.log', logFile) + .then (response) -> processLog(response.data) - if blgFile? # retrieve the blg file if present - response.success () -> - getFile('output.blg', blgFile) - # ignore errors in biber file - .success processBiber - # display the combined result - .then annotateFiles - else # otherwise just display the result - response.success annotateFiles + if blgFile? # retrieve the blg file if present + response = response.then () -> + getFile('output.blg', blgFile) + .then( + (response) -> processBiber(response.data), + () -> true # ignore errors in biber file + ) + + if response? + response.catch handleError + else + handleError() + + if chktexFile? + getChkTex = () -> + getFile('output.chktex', chktexFile) + .then (response) -> processChkTex(response.data) + # always retrieve the chktex file if present + if response? + response = response.then getChkTex, getChkTex + else + response = getChkTex() + + # display the combined result + response.finally annotateFiles getRootDocOverride_id = () -> doc = ide.editorManager.getCurrentDocValue() @@ -284,7 +338,7 @@ define [ $scope.recompile = (options = {}) -> return if $scope.pdf.compiling - event_tracking.sendCountlySampled "editor-recompile-sampled", options + event_tracking.sendMBSampled "editor-recompile-sampled", options $scope.pdf.compiling = true @@ -333,7 +387,7 @@ define [ $scope.toggleLogs = () -> $scope.shouldShowLogs = !$scope.shouldShowLogs - event_tracking.sendCountlyOnce "ide-open-logs-once" if $scope.shouldShowLogs + event_tracking.sendMBOnce "ide-open-logs-once" if $scope.shouldShowLogs $scope.showPdf = () -> $scope.pdf.view = "pdf" @@ -341,7 +395,7 @@ define [ $scope.toggleRawLog = () -> $scope.pdf.showRawLog = !$scope.pdf.showRawLog - event_tracking.sendCountly "logs-view-raw" if $scope.pdf.showRawLog + event_tracking.sendMB "logs-view-raw" if $scope.pdf.showRawLog $scope.openClearCacheModal = () -> modalInstance = $modal.open( @@ -376,7 +430,7 @@ define [ $scope.startFreeTrial = (source) -> ga?('send', 'event', 'subscription-funnel', 'compile-timeout', source) - event_tracking.sendCountly "subscription-start-trial", { source } + event_tracking.sendMB "subscription-start-trial", { source } window.open("/user/subscription/new?planCode=student_free_trial_7_days") $scope.startedFreeTrial = true @@ -499,12 +553,14 @@ define [ App.controller "PdfLogEntryController", ["$scope", "ide", "event_tracking", ($scope, ide, event_tracking) -> $scope.openInEditor = (entry) -> - event_tracking.sendCountlyOnce "logs-jump-to-location-once" + event_tracking.sendMBOnce "logs-jump-to-location-once" entity = ide.fileTreeManager.findEntityByPath(entry.file) return if !entity? or entity.type != "doc" if entry.line? line = entry.line - ide.editorManager.openDoc(entity, gotoLine: line) + if entry.column? + column = entry.column + ide.editorManager.openDoc(entity, gotoLine: line, gotoColumn: column) ] App.controller 'ClearCacheModalController', ["$scope", "$modalInstance", ($scope, $modalInstance) -> diff --git a/services/web/public/coffee/ide/settings/services/settings.coffee b/services/web/public/coffee/ide/settings/services/settings.coffee index 14dfe92f56..04a9ccb5e3 100644 --- a/services/web/public/coffee/ide/settings/services/settings.coffee +++ b/services/web/public/coffee/ide/settings/services/settings.coffee @@ -8,7 +8,7 @@ define [ for key in Object.keys(data) changedSetting = key changedSettingVal = data[key] - event_tracking.sendCountly "setting-changed", { changedSetting, changedSettingVal } + event_tracking.sendMB "setting-changed", { changedSetting, changedSettingVal } # End of tracking code. data._csrf = window.csrfToken @@ -20,7 +20,7 @@ define [ for key in Object.keys(data) changedSetting = key changedSettingVal = data[key] - event_tracking.sendCountly "project-setting-changed", { changedSetting, changedSettingVal} + event_tracking.sendMB "project-setting-changed", { changedSetting, changedSettingVal} # End of tracking code. data._csrf = window.csrfToken @@ -32,7 +32,7 @@ define [ for key in Object.keys(data) changedSetting = key changedSettingVal = data[key] - event_tracking.sendCountly "project-admin-setting-changed", { changedSetting, changedSettingVal } + event_tracking.sendMB "project-admin-setting-changed", { changedSetting, changedSettingVal } # End of tracking code. data._csrf = window.csrfToken diff --git a/services/web/public/coffee/ide/share/controllers/ShareController.coffee b/services/web/public/coffee/ide/share/controllers/ShareController.coffee index 1400a47371..9fdf4d31e2 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareController.coffee @@ -4,7 +4,7 @@ define [ App.controller "ShareController", ["$scope", "$modal", "ide", "projectInvites", "projectMembers", "event_tracking", ($scope, $modal, ide, projectInvites, projectMembers, event_tracking) -> $scope.openShareProjectModal = () -> - event_tracking.sendCountlyOnce "ide-open-share-modal-once" + event_tracking.sendMBOnce "ide-open-share-modal-once" $modal.open( templateUrl: "shareProjectModalTemplate" diff --git a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee index 5270754db7..ecd3b5a7f8 100644 --- a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee @@ -117,6 +117,9 @@ define [ diff.error = true else diff.deleted = true + diff.restoreInProgress = false + diff.restoreDeletedSuccess = false + diff.restoredDocNewId = null restoreDeletedDoc: (doc) -> url = "/project/#{@$scope.project_id}/doc/#{doc.id}/restore" diff --git a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee index 16547a491a..a32acfb2b3 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee @@ -1,13 +1,21 @@ define [ "base" ], (App) -> - App.controller "TrackChangesDiffController", ($scope, $modal, ide) -> + App.controller "TrackChangesDiffController", ($scope, $modal, ide, event_tracking) -> $scope.restoreDeletedDoc = () -> - ide.trackChangesManager.restoreDeletedDoc( - $scope.trackChanges.diff.doc - ) + event_tracking.sendMB "track-changes-restore-deleted" + $scope.trackChanges.diff.restoreInProgress = true + ide.trackChangesManager + .restoreDeletedDoc( + $scope.trackChanges.diff.doc + ) + .success (response) -> + $scope.trackChanges.diff.restoredDocNewId = response.doc_id + $scope.trackChanges.diff.restoreInProgress = false + $scope.trackChanges.diff.restoreDeletedSuccess = true $scope.openRestoreDiffModal = () -> + event_tracking.sendMB "track-changes-restore-modal" $modal.open { templateUrl: "trackChangesRestoreDiffModalTemplate" controller: "TrackChangesRestoreDiffModalController" @@ -15,13 +23,17 @@ define [ diff: () -> $scope.trackChanges.diff } - App.controller "TrackChangesRestoreDiffModalController", ($scope, $modalInstance, diff, ide) -> + $scope.backToEditorAfterRestore = () -> + ide.editorManager.openDoc({ id: $scope.trackChanges.diff.restoredDocNewId }) + + App.controller "TrackChangesRestoreDiffModalController", ($scope, $modalInstance, diff, ide, event_tracking) -> $scope.state = inflight: false $scope.diff = diff $scope.restore = () -> + event_tracking.sendMB "track-changes-restored" $scope.state.inflight = true ide.trackChangesManager .restoreDiff(diff) diff --git a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee index 8172b00727..3511ddf6c1 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee @@ -78,7 +78,7 @@ define [ $scope.recalculateSelectedUpdates() ] - App.controller "TrackChangesListItemController", ["$scope", ($scope) -> + App.controller "TrackChangesListItemController", ["$scope", "event_tracking", ($scope, event_tracking) -> $scope.$watch "update.selectedFrom", (selectedFrom, oldSelectedFrom) -> if selectedFrom for update in $scope.trackChanges.updates @@ -92,6 +92,7 @@ define [ $scope.recalculateSelectedUpdates() $scope.select = () -> + event_tracking.sendMB "track-changes-view-change" $scope.update.selectedTo = true $scope.update.selectedFrom = true diff --git a/services/web/public/coffee/main/account-upgrade.coffee b/services/web/public/coffee/main/account-upgrade.coffee index 956c340d14..be842b6907 100644 --- a/services/web/public/coffee/main/account-upgrade.coffee +++ b/services/web/public/coffee/main/account-upgrade.coffee @@ -6,7 +6,7 @@ define [ $scope.buttonClass = "btn-primary" $scope.startFreeTrial = (source, couponCode) -> - event_tracking.sendCountly "subscription-start-trial", { source } + event_tracking.sendMB "subscription-start-trial", { source } w = window.open() sixpack.convert "track-changes-discount", -> diff --git a/services/web/public/coffee/main/contact-us.coffee b/services/web/public/coffee/main/contact-us.coffee index 0f722df369..2f3a2c61e0 100644 --- a/services/web/public/coffee/main/contact-us.coffee +++ b/services/web/public/coffee/main/contact-us.coffee @@ -24,7 +24,7 @@ define [ url :"/learn/kb/#{page_underscored}" name : hit._highlightResult.pageName.value - event_tracking.sendCountly "contact-form-suggestions-shown" if results.hits.length + event_tracking.sendMB "contact-form-suggestions-shown" if results.hits.length $scope.$applyAsync () -> $scope.suggestions = suggestions @@ -60,7 +60,7 @@ define [ $scope.suggestions = []; $scope.clickSuggestionLink = (url) -> - event_tracking.sendCountly "contact-form-suggestions-clicked", { url } + event_tracking.sendMB "contact-form-suggestions-clicked", { url } $scope.close = () -> $modalInstance.close() diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index 371bd1004e..b2847bc5a0 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -2,9 +2,14 @@ define [ "base" "modules/localStorage" ], (App) -> - CACHE_KEY = "countlyEvents" + CACHE_KEY = "mbEvents" - App.factory "event_tracking", (localStorage) -> + send = (category, action, attributes = {})-> + ga('send', 'event', category, action) + event_name = "#{action}-#{category}" + Intercom?("trackEvent", event_name, attributes) + + App.factory "event_tracking", ($http, localStorage) -> _getEventCache = () -> eventCache = localStorage CACHE_KEY @@ -29,18 +34,23 @@ define [ send: (category, action, label, value)-> ga('send', 'event', category, action, label, value) - sendCountly: (key, segmentation) -> - eventData = { key } - eventData.segmentation = segmentation if segmentation? - Countly?.q.push([ "add_event", eventData ]) + sendMB: (key, segmentation = {}) -> + $http { + url: "/event/#{key}", + method: "POST", + data: segmentation + headers: { + "X-CSRF-Token": window.csrfToken + } + } - sendCountlySampled: (key, segmentation) -> - @sendCountly key, segmentation if Math.random() < .01 + sendMBSampled: (key, segmentation) -> + @sendMB key, segmentation if Math.random() < .01 - sendCountlyOnce: (key, segmentation) -> + sendMBOnce: (key, segmentation) -> if ! _eventInCache(key) _addEventToCache(key) - @sendCountly key, segmentation + @sendMB key, segmentation } # App.directive "countlyTrack", () -> diff --git a/services/web/public/coffee/main/new-subscription.coffee b/services/web/public/coffee/main/new-subscription.coffee index bdae2b219e..c153392c15 100644 --- a/services/web/public/coffee/main/new-subscription.coffee +++ b/services/web/public/coffee/main/new-subscription.coffee @@ -51,7 +51,7 @@ define [ .done() pricing.on "change", => - event_tracking.sendCountly "subscription-form", { plan : pricing.items.plan.code } + event_tracking.sendMB "subscription-form", { plan : pricing.items.plan.code } $scope.planName = pricing.items.plan.name $scope.price = pricing.price @@ -125,7 +125,7 @@ define [ state: $scope.data.state postal_code: $scope.data.postal_code - event_tracking.sendCountly "subscription-form-submitted", { + event_tracking.sendMB "subscription-form-submitted", { currencyCode : postData.subscriptionDetails.currencyCode, plan_code : postData.subscriptionDetails.plan_code, coupon_code : postData.subscriptionDetails.coupon_code, @@ -135,7 +135,7 @@ define [ $http.post("/user/subscription/create", postData) .success (data, status, headers)-> sixpack.convert "in-editor-free-trial-plan", pricing.items.plan.code, (err)-> - event_tracking.sendCountly "subscription-submission-success" + event_tracking.sendMB "subscription-submission-success" window.location.href = "/user/subscription/thank-you" .error (data, status, headers)-> $scope.processing = false diff --git a/services/web/public/img/crests/harvard.gif b/services/web/public/img/crests/harvard.gif index f9ba6a2298..092e17f4b3 100644 Binary files a/services/web/public/img/crests/harvard.gif and b/services/web/public/img/crests/harvard.gif differ diff --git a/services/web/public/stylesheets/app/editor/chat.less b/services/web/public/stylesheets/app/editor/chat.less index 495ac6dce0..592d39ecf4 100644 --- a/services/web/public/stylesheets/app/editor/chat.less +++ b/services/web/public/stylesheets/app/editor/chat.less @@ -129,6 +129,10 @@ } } +.break-word { + word-break: break-all; +} + .editor-dark { .chat { .new-message { diff --git a/services/web/public/stylesheets/app/editor/track-changes.less b/services/web/public/stylesheets/app/editor/track-changes.less index b57e71ede0..6cf98e53eb 100644 --- a/services/web/public/stylesheets/app/editor/track-changes.less +++ b/services/web/public/stylesheets/app/editor/track-changes.less @@ -267,6 +267,10 @@ } } +.diff-deleted { + padding-top: 15px; +} + .editor-dark { #trackChanges { aside.change-list { diff --git a/services/web/test/UnitTests/coffee/Authentication/AuthenticationControllerTests.coffee b/services/web/test/UnitTests/coffee/Authentication/AuthenticationControllerTests.coffee index 4e9b248f25..86c5e5840f 100644 --- a/services/web/test/UnitTests/coffee/Authentication/AuthenticationControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Authentication/AuthenticationControllerTests.coffee @@ -19,6 +19,7 @@ describe "AuthenticationController", -> "../../infrastructure/Metrics": @Metrics = { inc: sinon.stub() } "../Security/LoginRateLimiter": @LoginRateLimiter = { processLoginRequest:sinon.stub(), recordSuccessfulLogin:sinon.stub() } "../User/UserHandler": @UserHandler = {setupLoginData:sinon.stub()} + "../Analytics/AnalyticsManager": @AnalyticsManager = { recordEvent: sinon.stub() } "logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub() } "settings-sharelatex": {} "../User/UserSessionsManager": @UserSessionsManager = @@ -100,6 +101,11 @@ describe "AuthenticationController", -> .calledWith(email: @email.toLowerCase(), user_id: @user._id.toString(), "successful log in") .should.equal true + it "should track the login event", -> + @AnalyticsManager.recordEvent + .calledWith(@user._id, "user-logged-in") + .should.equal true + describe 'when the user is not authenticated', -> beforeEach -> diff --git a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee index 2fb980b461..a3eeebcaaa 100644 --- a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee @@ -174,6 +174,7 @@ describe "ClsiManager", -> timeout : 100 imageName: @image draft: false + check: undefined rootResourcePath: "main.tex" resources: [{ path: "main.tex" diff --git a/services/web/test/UnitTests/coffee/References/ReferencesHandlerTests.coffee b/services/web/test/UnitTests/coffee/References/ReferencesHandlerTests.coffee index c46e71a542..c69cb3ee0a 100644 --- a/services/web/test/UnitTests/coffee/References/ReferencesHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/References/ReferencesHandlerTests.coffee @@ -322,6 +322,11 @@ describe 'ReferencesHandler', -> result = @handler._findBibDocIds(@fakeProject) expect(result).to.deep.equal @expectedIds + it 'should not error with a non array of folders from dirty data', -> + @fakeProject.rootFolder[0].folders[0].folders = {} + result = @handler._findBibDocIds(@fakeProject) + expect(result).to.deep.equal @expectedIds + describe '_findBibFileIds', -> beforeEach -> diff --git a/services/web/test/UnitTests/coffee/User/UserRegistrationHandlerTests.coffee b/services/web/test/UnitTests/coffee/User/UserRegistrationHandlerTests.coffee index ec220e27f8..d0b96da2de 100644 --- a/services/web/test/UnitTests/coffee/User/UserRegistrationHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/User/UserRegistrationHandlerTests.coffee @@ -33,6 +33,7 @@ describe "UserRegistrationHandler", -> "crypto": @crypto = {} "../Email/EmailHandler": @EmailHandler "../Security/OneTimeTokenHandler": @OneTimeTokenHandler + "../Analytics/AnalyticsManager": @AnalyticsManager = { recordEvent: sinon.stub() } "settings-sharelatex": @settings = {siteUrl: "http://sl.example.com"} @passingRequest = {email:"something@email.com", password:"123"} @@ -132,6 +133,13 @@ describe "UserRegistrationHandler", -> @NewsLetterManager.subscribe.calledWith(@user).should.equal true done() + it "should track the registration event", (done)-> + @handler.registerNewUser @passingRequest, (err)=> + @AnalyticsManager.recordEvent + .calledWith(@user._id, "user-registered") + .should.equal true + done() + it "should call the ReferalAllocator", (done)-> done()