From e0d5075fdb349968269cb80a5af5f98dce95c739 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 26 Jul 2016 16:25:19 +0100 Subject: [PATCH 01/45] include check option when compiling --- services/web/app/coffee/Features/Compile/ClsiManager.coffee | 1 + .../web/app/coffee/Features/Compile/CompileController.coffee | 2 ++ .../web/public/coffee/ide/pdf/controllers/PdfController.coffee | 1 + 3 files changed, 4 insertions(+) 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..e52693d4c4 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 "error" then "error" else "warn" 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/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 0f8134258c..5144e0e73e 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -86,6 +86,7 @@ define [ return $http.post url, { rootDoc_id: options.rootDocOverride_id or null draft: $scope.draft + check: if options.check then "error" else "warn" _csrf: window.csrfToken }, {params: params} From ef85f1014c93e7b32856076e7755b1297f425d60 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 26 Jul 2016 16:26:27 +0100 Subject: [PATCH 02/45] add menu option for checking with chktex --- .../web/app/views/project/editor/pdf.jade | 8 +- .../ide/pdf/controllers/PdfController.coffee | 80 ++++++++++++++----- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index 200c609d97..b2d821f753 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -36,6 +36,11 @@ div.full-size.pdf(ng-controller="PdfController") i.fa.fa-fw(ng-class="{'fa-check': draft}") |  #{translate("fast")}  span.subdued [draft] + li.dropdown-header #{translate("file_checks")} + li + a(href, ng-click="recompile({check:true})") + i.fa.fa-fw() + |  #{translate("syntax check")} a( href ng-click="stop()" @@ -115,7 +120,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" diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 5144e0e73e..5a0b232a4c 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -92,6 +92,9 @@ define [ parseCompileResponse = (response) -> + # keep last url + last_pdf_url = $scope.pdf.url + # Reset everything $scope.pdf.error = false $scope.pdf.timedout = false @@ -121,11 +124,17 @@ 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 == "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" @@ -135,7 +144,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 @@ -166,7 +175,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 = [] @@ -187,7 +196,11 @@ define [ } - fetchLogs = (logFile, blgFile) -> + fetchLogs = (fileByPath) -> + + logFile = fileByPath['output.log']; + blgFile = fileByPath['output.blg']; + chktexFile = fileByPath['output.chktex']; getFile = (name, file) -> opts = @@ -214,6 +227,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 @@ -223,10 +238,23 @@ 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 + accumulateResults {type: "ChkTeX", all, errors, warnings} + 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 = () -> @@ -249,19 +277,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() From e99176c0d089b15e6d2ffda2745d9a29030b7194 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 27 Jul 2016 10:55:24 +0100 Subject: [PATCH 03/45] fix tests --- .../web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee | 1 + 1 file changed, 1 insertion(+) 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" From d4c5028350696289d2b391a4040d86ede4e1449b Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 27 Jul 2016 16:51:13 +0100 Subject: [PATCH 04/45] allow HumanReadableLogs to accept an already parsed log --- .../coffee/ide/human-readable-logs/HumanReadableLogs.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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..ae9c3c1e4f 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 From 14a0499b56789f279baf1dda7b97091a46e1e4e4 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 27 Jul 2016 16:52:36 +0100 Subject: [PATCH 05/45] allow HumanReadableLogs to rewrite messages with regex also allow an explicit hintId for each rule --- .../ide/human-readable-logs/HumanReadableLogs.coffee | 7 ++++++- .../ide/human-readable-logs/HumanReadableLogsRules.coffee | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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 ae9c3c1e4f..e59e35a40c 100644 --- a/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogs.coffee +++ b/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogs.coffee @@ -15,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..021ff5d284 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,11 @@ 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{...} + """ ] From 5da1b9041897f4b61d492bb00eb9b8ad105d38ba Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 27 Jul 2016 16:53:22 +0100 Subject: [PATCH 06/45] use validate as keyword for syntax checks --- .../coffee/Features/Compile/CompileController.coffee | 2 +- .../coffee/ide/pdf/controllers/PdfController.coffee | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/web/app/coffee/Features/Compile/CompileController.coffee b/services/web/app/coffee/Features/Compile/CompileController.coffee index e52693d4c4..000465a83c 100755 --- a/services/web/app/coffee/Features/Compile/CompileController.coffee +++ b/services/web/app/coffee/Features/Compile/CompileController.coffee @@ -30,7 +30,7 @@ module.exports = CompileController = if req.body?.draft options.draft = req.body.draft if req.body?.check - options.check = if req.body.check is "error" then "error" else "warn" + 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/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 5a0b232a4c..968cd1b60f 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -86,7 +86,7 @@ define [ return $http.post url, { rootDoc_id: options.rootDocOverride_id or null draft: $scope.draft - check: if options.check then "error" else "warn" + check: if options.check then "validate" else null _csrf: window.csrfToken }, {params: params} @@ -129,6 +129,12 @@ define [ $scope.pdf.view = 'errors' $scope.pdf.compileTerminated = true 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) else if response.status == "exited" $scope.pdf.view = 'pdf' $scope.pdf.compileExited = true @@ -249,7 +255,8 @@ define [ else warnings.push result all = [].concat errors, warnings - accumulateResults {type: "ChkTeX", all, errors, warnings} + logHints = HumanReadableLogs.parse {type: "Validation", all, errors, warnings} + accumulateResults logHints processBiber = (log) -> {errors, warnings} = BibLogParser.parse(log, {}) From a3c8202d0eba75b84a54c2c2ebded0d46a507f3b Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 28 Jul 2016 16:18:36 +0100 Subject: [PATCH 07/45] support jumping to position with line and column from log entries --- .../public/coffee/ide/editor/EditorManager.coffee | 2 +- .../cursor-position/CursorPositionManager.coffee | 12 ++++++------ .../coffee/ide/pdf/controllers/PdfController.coffee | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) 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/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 968cd1b60f..5dff3acb04 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -556,7 +556,9 @@ define [ 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) -> From 4d3b743e4de0000e9990029b1715600e277c7193 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 28 Jul 2016 16:19:10 +0100 Subject: [PATCH 08/45] display validation errors only when doing validation --- .../coffee/ide/pdf/controllers/PdfController.coffee | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 5dff3acb04..780fda5aa3 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -134,7 +134,7 @@ define [ $scope.pdf.compileExited = true $scope.pdf.url = last_pdf_url $scope.shouldShowLogs = true - fetchLogs(fileByPath) + fetchLogs(fileByPath, { validation: true }) else if response.status == "exited" $scope.pdf.view = 'pdf' $scope.pdf.compileExited = true @@ -202,11 +202,13 @@ define [ } - fetchLogs = (fileByPath) -> + fetchLogs = (fileByPath, options) -> - logFile = fileByPath['output.log']; - blgFile = fileByPath['output.blg']; - chktexFile = fileByPath['output.chktex']; + if options?.validation + chktexFile = fileByPath['output.chktex'] + else + logFile = fileByPath['output.log'] + blgFile = fileByPath['output.blg'] getFile = (name, file) -> opts = From 208798ebe3f6d86cb27ce256d9b341644dd94747 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 28 Jul 2016 16:19:35 +0100 Subject: [PATCH 09/45] add a log hint for mismatched brackets --- .../human-readable-logs/HumanReadableLogsRules.coffee | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 021ff5d284..c61c61506b 100644 --- a/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogsRules.coffee +++ b/services/web/public/coffee/ide/human-readable-logs/HumanReadableLogsRules.coffee @@ -93,6 +93,14 @@ define -> [ 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{...} + 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. + """ + ] From 0742db7732face70b61a2914081a247501fcbcc5 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 28 Jul 2016 16:40:40 +0100 Subject: [PATCH 10/45] enable validation option only for beta programme users --- services/web/app/views/project/editor/pdf.jade | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index b2d821f753..832134c0d5 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -36,11 +36,12 @@ div.full-size.pdf(ng-controller="PdfController") i.fa.fa-fw(ng-class="{'fa-check': draft}") |  #{translate("fast")}  span.subdued [draft] - li.dropdown-header #{translate("file_checks")} - li - a(href, ng-click="recompile({check:true})") - i.fa.fa-fw() - |  #{translate("syntax check")} + if user.betaProgram + li.dropdown-header #{translate("file_checks")} + li + a(href, ng-click="recompile({check:true})") + i.fa.fa-fw() + |  #{translate("syntax_check")} a( href ng-click="stop()" From e508f7b8a99e460e1e9afb64aaff100ee4e306f0 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 28 Jul 2016 16:41:02 +0100 Subject: [PATCH 11/45] don't try to display a log hint link if there isn't one --- services/web/app/views/project/editor/pdf.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index 832134c0d5..973562abc0 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -133,7 +133,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()" From f012a6fe327252aa08d414aeccb8f81650cc2abe Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 29 Jul 2016 17:24:45 +0100 Subject: [PATCH 12/45] Scroll patcher for Safari. --- .../coffee/ide/SafariScrollPatcher.coffee | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 services/web/public/coffee/ide/SafariScrollPatcher.coffee diff --git a/services/web/public/coffee/ide/SafariScrollPatcher.coffee b/services/web/public/coffee/ide/SafariScrollPatcher.coffee new file mode 100644 index 0000000000..4c77802926 --- /dev/null +++ b/services/web/public/coffee/ide/SafariScrollPatcher.coffee @@ -0,0 +1,59 @@ +define [ +], () -> + class SafariScrollPatcher + constructor: (ide, $scope) -> + @isBootstrapped = false + @isOverAce = false + @pdfDiv = null + @aceDiv = null + + $scope.$on "loaded", () => + console.log this + if !@isBootstrapped + console.log "bootstrapping" + + @isBootstrapped = true; + @pdfDiv = document.querySelector ".pdfjs-viewer" # Grab the PDF div. + @aceDiv = document.querySelector ".ace_content" # Also the editor. + @isOverAce = false # Flag to control if the pointer is over Ace. + + # 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. + @pdfDiv.addEventListener "mouseleave", () => + @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. + @pdfDiv.addEventListener "mouseenter", () => + @pdfDiv.removeEventListener "wheel", dispatchToAce + + # Set the "pointer over Ace" flag as false, when the mouse leaves its area. + @aceDiv.addEventListener "mouseleave", () => + @isOverAce = false + + # Set the "pointer over Ace" flag as true, when the mouse enters its area. + @aceDiv.addEventListener "mouseenter", () => + @isOverAce = true + + # 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. + console.log "Event was bound to the PDF, dispatching 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 + , 5) + + # Avoid scrolling the PDF, as we assume this was intended to the + # editor. + e.preventDefault() + + From 9b3a28048e62e8c560d6843950254ecebfef5785 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 29 Jul 2016 17:24:55 +0100 Subject: [PATCH 13/45] Integrate Safari scroll patcher. --- services/web/public/coffee/ide.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 4c75ab5d77..d22ec949fb 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) -> @@ -135,6 +137,9 @@ define [ catch err console.error err + if ide.browserIsSafari + ide.safariScrollPatcher = new SafariScrollPatcher(ide, $scope) + # User can append ?ft=somefeature to url to activate a feature toggle ide.featureToggle = location?.search?.match(/^\?ft=(\w+)$/)?[1] From 16e8cd7820108369d7544ea0bcf98792ce403fb6 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 29 Jul 2016 17:45:50 +0100 Subject: [PATCH 14/45] Refactor Safari scroll patcher; ensure it works after PDF is reloaded. --- .../coffee/ide/SafariScrollPatcher.coffee | 119 ++++++++++-------- 1 file changed, 70 insertions(+), 49 deletions(-) diff --git a/services/web/public/coffee/ide/SafariScrollPatcher.coffee b/services/web/public/coffee/ide/SafariScrollPatcher.coffee index 4c77802926..c1535e3d27 100644 --- a/services/web/public/coffee/ide/SafariScrollPatcher.coffee +++ b/services/web/public/coffee/ide/SafariScrollPatcher.coffee @@ -2,58 +2,79 @@ define [ ], () -> class SafariScrollPatcher constructor: (ide, $scope) -> - @isBootstrapped = false - @isOverAce = false + @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 = () => + console.log "dispatching to ace enabled" + @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 = () => + console.log "dispatching to ace disabled" + @pdfDiv.removeEventListener "wheel", @dispatchToAce + + # Set the "pointer over Ace" flag as false, when the mouse leaves its area. + @handleAceDivMouseLeave = () => + @isOverAce = false + console.log 'is over ace = ' + @isOverAce + + # Set the "pointer over Ace" flag as true, when the mouse enters its area. + @handleAceDivMouseEnter = () => + @isOverAce = true + console.log 'is over ace = ' + @isOverAce + + # 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. + console.log "Event was bound to the PDF, dispatching 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 + , 5) + + # Avoid scrolling the PDF, as we assume this was intended to the + # editor. + e.preventDefault() + $scope.$on "loaded", () => - console.log this - if !@isBootstrapped - console.log "bootstrapping" - - @isBootstrapped = true; - @pdfDiv = document.querySelector ".pdfjs-viewer" # Grab the PDF div. - @aceDiv = document.querySelector ".ace_content" # Also the editor. - @isOverAce = false # Flag to control if the pointer is over Ace. - - # 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. - @pdfDiv.addEventListener "mouseleave", () => - @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. - @pdfDiv.addEventListener "mouseenter", () => - @pdfDiv.removeEventListener "wheel", dispatchToAce - - # Set the "pointer over Ace" flag as false, when the mouse leaves its area. - @aceDiv.addEventListener "mouseleave", () => - @isOverAce = false - - # Set the "pointer over Ace" flag as true, when the mouse enters its area. - @aceDiv.addEventListener "mouseenter", () => - @isOverAce = true - - # 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. - console.log "Event was bound to the PDF, dispatching 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 - , 5) - - # Avoid scrolling the PDF, as we assume this was intended to the - # editor. - e.preventDefault() + @setListeners() From 0d4e1e5495113a6eaf3c7f27459533ee17f10f22 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 Aug 2016 11:12:50 +0100 Subject: [PATCH 15/45] Try a smaller timeout + minor fixes. --- services/web/public/coffee/ide.coffee | 2 +- .../web/public/coffee/ide/SafariScrollPatcher.coffee | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index d22ec949fb..e62227c9be 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -138,7 +138,7 @@ define [ console.error err if ide.browserIsSafari - ide.safariScrollPatcher = new SafariScrollPatcher(ide, $scope) + 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 index c1535e3d27..1859511c99 100644 --- a/services/web/public/coffee/ide/SafariScrollPatcher.coffee +++ b/services/web/public/coffee/ide/SafariScrollPatcher.coffee @@ -1,7 +1,7 @@ define [ ], () -> class SafariScrollPatcher - constructor: (ide, $scope) -> + constructor: ($scope) -> @isOverAce = false # Flag to control if the pointer is over Ace. @pdfDiv = null @aceDiv = null @@ -10,24 +10,20 @@ define [ # P.S. This is the problem in a nutshell: although the pointer is elsewhere, # wheel events keep being dispatched to the PDF. @handlePdfDivMouseLeave = () => - console.log "dispatching to ace enabled" @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 = () => - console.log "dispatching to ace disabled" @pdfDiv.removeEventListener "wheel", @dispatchToAce # Set the "pointer over Ace" flag as false, when the mouse leaves its area. @handleAceDivMouseLeave = () => @isOverAce = false - console.log 'is over ace = ' + @isOverAce # Set the "pointer over Ace" flag as true, when the mouse enters its area. @handleAceDivMouseEnter = () => @isOverAce = true - console.log 'is over ace = ' + @isOverAce # Grab the elements (pdfDiv, aceDiv) and set the "hover" event listeners. # If elements are already defined, clear existing event listeners and do @@ -46,7 +42,7 @@ define [ # Grab elements. @pdfDiv = document.querySelector ".pdfjs-viewer" # Grab the PDF div. - @aceDiv = document.querySelector ".ace_content" # Also the editor. + @aceDiv = document.querySelector ".ace_content" # Also the editor. # Set hover-related listeners. @pdfDiv.addEventListener "mouseleave", @handlePdfDivMouseLeave @@ -61,14 +57,13 @@ define [ 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. - console.log "Event was bound to the PDF, dispatching 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 - , 5) + , 1) # Avoid scrolling the PDF, as we assume this was intended to the # editor. From 4b8ab2dbba64f950e28cbf4834189b20def391ac Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 Aug 2016 13:35:49 +0100 Subject: [PATCH 16/45] More comments. --- services/web/public/coffee/ide/SafariScrollPatcher.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/web/public/coffee/ide/SafariScrollPatcher.coffee b/services/web/public/coffee/ide/SafariScrollPatcher.coffee index 1859511c99..07ad2e7565 100644 --- a/services/web/public/coffee/ide/SafariScrollPatcher.coffee +++ b/services/web/public/coffee/ide/SafariScrollPatcher.coffee @@ -69,6 +69,9 @@ define [ # 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() From c6334ffab719d7120e175c4bb3a8341a203a95f4 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 Aug 2016 16:35:28 +0100 Subject: [PATCH 17/45] Add Angular filter for wrapping words larger than N characters. --- .../public/coffee/filters/wrapLongWords.coffee | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 services/web/public/coffee/filters/wrapLongWords.coffee diff --git a/services/web/public/coffee/filters/wrapLongWords.coffee b/services/web/public/coffee/filters/wrapLongWords.coffee new file mode 100644 index 0000000000..b639de763b --- /dev/null +++ b/services/web/public/coffee/filters/wrapLongWords.coffee @@ -0,0 +1,17 @@ +define [ + "base" +], (App) -> + DEF_MIN_LENGTH = 20 + + _getWrappedWordsString = (baseStr, wrapperElName, minLength) -> + minLength = minLength || DEF_MIN_LENGTH + + findWordsRegEx = new RegExp "\\w{#{minLength},}", "g" + wrappingTemplate = "<#{wrapperElName} style='word-break: break-all;'>$&" + + baseStr.replace findWordsRegEx, wrappingTemplate + + + App.filter "wrapLongWords", () -> + (input, minLength) -> + _getWrappedWordsString input, "span", minLength \ No newline at end of file From ff62e505301b75e3f85108381b4f5cead9508539 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 1 Aug 2016 16:42:54 +0100 Subject: [PATCH 18/45] Integrate word wrapping filter in the chat component. --- services/web/app/views/project/editor/chat.jade | 2 +- services/web/public/coffee/filters/wrapLongWords.coffee | 2 +- services/web/public/coffee/ide/chat/index.coffee | 1 + services/web/public/stylesheets/app/editor/chat.less | 5 +++++ 4 files changed, 8 insertions(+), 2 deletions(-) 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/public/coffee/filters/wrapLongWords.coffee b/services/web/public/coffee/filters/wrapLongWords.coffee index b639de763b..ea97a58fec 100644 --- a/services/web/public/coffee/filters/wrapLongWords.coffee +++ b/services/web/public/coffee/filters/wrapLongWords.coffee @@ -7,7 +7,7 @@ define [ minLength = minLength || DEF_MIN_LENGTH findWordsRegEx = new RegExp "\\w{#{minLength},}", "g" - wrappingTemplate = "<#{wrapperElName} style='word-break: break-all;'>$&" + wrappingTemplate = "<#{wrapperElName} class=\"break-word\">$&" baseStr.replace findWordsRegEx, wrappingTemplate 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/stylesheets/app/editor/chat.less b/services/web/public/stylesheets/app/editor/chat.less index 495ac6dce0..7e1ad95b8d 100644 --- a/services/web/public/stylesheets/app/editor/chat.less +++ b/services/web/public/stylesheets/app/editor/chat.less @@ -129,6 +129,11 @@ } } +.break-word { + word-break: break-all; + color: red; +} + .editor-dark { .chat { .new-message { From 01637386bd142560a1551e0d250f61f7948c68a1 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Tue, 2 Aug 2016 11:59:43 +0100 Subject: [PATCH 19/45] Use string split instead of regex. --- .../web/public/coffee/filters/wrapLongWords.coffee | 14 +++++++++++--- .../web/public/stylesheets/app/editor/chat.less | 1 - 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/services/web/public/coffee/filters/wrapLongWords.coffee b/services/web/public/coffee/filters/wrapLongWords.coffee index ea97a58fec..db502e848a 100644 --- a/services/web/public/coffee/filters/wrapLongWords.coffee +++ b/services/web/public/coffee/filters/wrapLongWords.coffee @@ -3,13 +3,21 @@ define [ ], (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 ' ' - findWordsRegEx = new RegExp "\\w{#{minLength},}", "g" - wrappingTemplate = "<#{wrapperElName} class=\"break-word\">$&" + wordsWrapped = for word in words + if _decodeHTMLEntities(word).length >= minLength + "<#{wrapperElName} class=\"break-word\">#{word}" + else + word - baseStr.replace findWordsRegEx, wrappingTemplate + outputStr = wordsWrapped.join ' ' App.filter "wrapLongWords", () -> diff --git a/services/web/public/stylesheets/app/editor/chat.less b/services/web/public/stylesheets/app/editor/chat.less index 7e1ad95b8d..592d39ecf4 100644 --- a/services/web/public/stylesheets/app/editor/chat.less +++ b/services/web/public/stylesheets/app/editor/chat.less @@ -131,7 +131,6 @@ .break-word { word-break: break-all; - color: red; } .editor-dark { From 38f76b305ba10f5044fd340f2c97695310ede33c Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 2 Aug 2016 14:43:09 +0100 Subject: [PATCH 20/45] change message to "Run syntax check" --- services/web/app/views/project/editor/pdf.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index 973562abc0..cf5129708a 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -41,7 +41,7 @@ div.full-size.pdf(ng-controller="PdfController") li a(href, ng-click="recompile({check:true})") i.fa.fa-fw() - |  #{translate("syntax_check")} + |  #{translate("run_syntax_check")} a( href ng-click="stop()" From 2ad0bab9764a94a8cb53d21428ec9709253cb5d1 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 2 Aug 2016 15:28:53 +0100 Subject: [PATCH 21/45] =?UTF-8?q?use=20underscore.each=20so=20it=20doesn?= =?UTF-8?q?=E2=80=99t=20blow=20up=20on=20non=20array.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/References/ReferencesHandler.coffee | 14 +++++++------- .../References/ReferencesHandlerTests.coffee | 5 +++++ 2 files changed, 12 insertions(+), 7 deletions(-) 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/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 -> From 928777b61ce6522ea4b09047ff1fc6ef02c9a896 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 2 Aug 2016 15:34:44 +0100 Subject: [PATCH 22/45] add null check to redis return value for getValueFromTokenAndExpire --- .../web/app/coffee/Features/Security/OneTimeTokenHandler.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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] From 418d1c56da241ace30725c312c82ea357d23de14 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 2 Aug 2016 15:36:59 +0100 Subject: [PATCH 23/45] nullcheck qqfile on upload files --- .../coffee/Features/Uploads/ProjectUploadController.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 892511820ec66ceeaf53446546d4a47f5adc6db7 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 2 Aug 2016 17:09:42 +0100 Subject: [PATCH 24/45] fix logging on groupPlan invite notification --- .../coffee/Features/Notifications/NotificationsBuilder.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Notifications/NotificationsBuilder.coffee b/services/web/app/coffee/Features/Notifications/NotificationsBuilder.coffee index 9f960b1d15..6f89525629 100644 --- a/services/web/app/coffee/Features/Notifications/NotificationsBuilder.coffee +++ b/services/web/app/coffee/Features/Notifications/NotificationsBuilder.coffee @@ -9,7 +9,7 @@ module.exports = messageOpts = groupName: licence.name subscription_id: licence.subscription_id - logger.log user_id:user._id, key:key, "creating notification key for user" + logger.log user_id:user._id, key:@key, "creating notification key for user" NotificationsHandler.createNotification user._id, @key, "notification_group_invite", messageOpts, callback read: (callback = ->)-> From e6898d64c953ae10f15e0ca552af42dfd5d6c54d Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 3 Aug 2016 12:17:19 +0100 Subject: [PATCH 25/45] Track hovering of header features. --- services/web/app/views/project/editor/header.jade | 3 +++ services/web/public/coffee/ide.coffee | 3 +++ .../public/coffee/ide/track-changes/TrackChangesManager.coffee | 1 + .../controllers/TrackChangesDiffController.coffee | 2 ++ .../controllers/TrackChangesListController.coffee | 1 + 5 files changed, 10 insertions(+) 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/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index e62227c9be..f18260d7d4 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -81,6 +81,9 @@ define [ $scope.$watch "ui.leftMenuShown", (isOpen) -> event_tracking.sendCountlyOnce "ide-open-left-menu-once" if isOpen + + $scope.trackHover = (feature) -> + event_tracking.sendCountlyOnce "ide-hover-#{feature}-once" # End of tracking code. window._ide = ide diff --git a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee index 5270754db7..270c69bc6a 100644 --- a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee @@ -119,6 +119,7 @@ define [ diff.deleted = true restoreDeletedDoc: (doc) -> + console.log("track-changes-restore-deleted") url = "/project/#{@$scope.project_id}/doc/#{doc.id}/restore" @ide.$http.post(url, name: doc.name, _csrf: window.csrfToken) 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..7e9354b887 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee @@ -8,6 +8,7 @@ define [ ) $scope.openRestoreDiffModal = () -> + console.log("track-changes-restore-modal") $modal.open { templateUrl: "trackChangesRestoreDiffModalTemplate" controller: "TrackChangesRestoreDiffModalController" @@ -22,6 +23,7 @@ define [ $scope.diff = diff $scope.restore = () -> + console.log("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..1b85035b28 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee @@ -92,6 +92,7 @@ define [ $scope.recalculateSelectedUpdates() $scope.select = () -> + console.log("track-changes-view") $scope.update.selectedTo = true $scope.update.selectedFrom = true From 216779fafe141977b9f621055bfed73b71b37eec Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 3 Aug 2016 12:36:42 +0100 Subject: [PATCH 26/45] Track-changes usage. --- .../coffee/ide/track-changes/TrackChangesManager.coffee | 1 - .../controllers/TrackChangesDiffController.coffee | 9 +++++---- .../controllers/TrackChangesListController.coffee | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee index 270c69bc6a..5270754db7 100644 --- a/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/track-changes/TrackChangesManager.coffee @@ -119,7 +119,6 @@ define [ diff.deleted = true restoreDeletedDoc: (doc) -> - console.log("track-changes-restore-deleted") url = "/project/#{@$scope.project_id}/doc/#{doc.id}/restore" @ide.$http.post(url, name: doc.name, _csrf: window.csrfToken) 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 7e9354b887..94044f8956 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee @@ -1,14 +1,15 @@ define [ "base" ], (App) -> - App.controller "TrackChangesDiffController", ($scope, $modal, ide) -> + App.controller "TrackChangesDiffController", ($scope, $modal, ide, event_tracking) -> $scope.restoreDeletedDoc = () -> + event_tracking.sendCountly "track-changes-restore-deleted" ide.trackChangesManager.restoreDeletedDoc( $scope.trackChanges.diff.doc ) $scope.openRestoreDiffModal = () -> - console.log("track-changes-restore-modal") + event_tracking.sendCountly "track-changes-restore-modal" $modal.open { templateUrl: "trackChangesRestoreDiffModalTemplate" controller: "TrackChangesRestoreDiffModalController" @@ -16,14 +17,14 @@ define [ diff: () -> $scope.trackChanges.diff } - App.controller "TrackChangesRestoreDiffModalController", ($scope, $modalInstance, diff, ide) -> + App.controller "TrackChangesRestoreDiffModalController", ($scope, $modalInstance, diff, ide, event_tracking) -> $scope.state = inflight: false $scope.diff = diff $scope.restore = () -> - console.log("track-changes-restored") + event_tracking.sendCountly "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 1b85035b28..88ab0053ed 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee @@ -2,7 +2,7 @@ define [ "base" ], (App) -> - App.controller "TrackChangesPremiumPopup", ($scope, ide, sixpack)-> + App.controller "TrackChangesPremiumPopup", ($scope, ide, sixpack, event_tracking)-> $scope.$watch "ui.view", -> if $scope.ui.view == "track-changes" if $scope.project?.features?.versioning @@ -92,7 +92,7 @@ define [ $scope.recalculateSelectedUpdates() $scope.select = () -> - console.log("track-changes-view") + event_tracking.sendCountly "track-changes-view-change" $scope.update.selectedTo = true $scope.update.selectedFrom = true From cf5c8e27e1627da080d33b57ea017da766151719 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 3 Aug 2016 16:05:19 +0100 Subject: [PATCH 27/45] UI fix - do not allow multiple clicks to restore a deleted file. --- .../views/project/editor/track-changes.jade | 18 +++++++++++++++--- .../track-changes/TrackChangesManager.coffee | 3 +++ .../TrackChangesDiffController.coffee | 15 ++++++++++++--- .../TrackChangesListController.coffee | 4 ++-- .../stylesheets/app/editor/track-changes.less | 4 ++++ 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/services/web/app/views/project/editor/track-changes.jade b/services/web/app/views/project/editor/track-changes.jade index dc7ce38708..684b89e814 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 Your file ({{ trackChanges.diff.doc.name }}) has been recovered. + p.text-serif You can go back to the editor and work on it again. + p + a.btn.btn-default( + href, + ng-click="backToEditorAfterRestore()", + ) Back to editor + .loading-panel(ng-show="trackChanges.diff.loading") i.fa.fa-spin.fa-refresh |   #{translate("loading")}... 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 94044f8956..77c2720a4f 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee @@ -4,9 +4,15 @@ define [ App.controller "TrackChangesDiffController", ($scope, $modal, ide, event_tracking) -> $scope.restoreDeletedDoc = () -> event_tracking.sendCountly "track-changes-restore-deleted" - ide.trackChangesManager.restoreDeletedDoc( - $scope.trackChanges.diff.doc - ) + $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.sendCountly "track-changes-restore-modal" @@ -17,6 +23,9 @@ define [ diff: () -> $scope.trackChanges.diff } + $scope.backToEditorAfterRestore = () -> + ide.editorManager.openDoc({ id: $scope.trackChanges.diff.restoredDocNewId }) + App.controller "TrackChangesRestoreDiffModalController", ($scope, $modalInstance, diff, ide, event_tracking) -> $scope.state = inflight: false 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 88ab0053ed..e0beb3ef4f 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee @@ -2,7 +2,7 @@ define [ "base" ], (App) -> - App.controller "TrackChangesPremiumPopup", ($scope, ide, sixpack, event_tracking)-> + App.controller "TrackChangesPremiumPopup", ($scope, ide, sixpack)-> $scope.$watch "ui.view", -> if $scope.ui.view == "track-changes" if $scope.project?.features?.versioning @@ -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 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 { From 73f115fc5781e041871a6556b07098c134bf0b21 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 3 Aug 2016 16:09:45 +0100 Subject: [PATCH 28/45] Add i18n keys. --- services/web/app/views/project/editor/track-changes.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/app/views/project/editor/track-changes.jade b/services/web/app/views/project/editor/track-changes.jade index 684b89e814..de3c0e1730 100644 --- a/services/web/app/views/project/editor/track-changes.jade +++ b/services/web/app/views/project/editor/track-changes.jade @@ -156,13 +156,13 @@ div#trackChanges(ng-show="ui.view == 'track-changes'") .diff-deleted.text-centered( ng-show="trackChanges.diff.deleted && trackChanges.diff.restoreDeletedSuccess" ) - p.text-serif Your file ({{ trackChanges.diff.doc.name }}) has been recovered. - p.text-serif You can go back to the editor and work on it again. + 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()", - ) Back to editor + ) #{translate("file_restored_back_to_editor_btn")} .loading-panel(ng-show="trackChanges.diff.loading") i.fa.fa-spin.fa-refresh From 4d3629e5db00618a8b76ea7b50d5bd5debeb3a01 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 3 Aug 2016 16:29:34 +0100 Subject: [PATCH 29/45] add beta feature badge to syntax check --- services/web/app/views/project/editor/pdf.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index cf5129708a..2754e8499d 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -42,6 +42,7 @@ div.full-size.pdf(ng-controller="PdfController") a(href, ng-click="recompile({check:true})") i.fa.fa-fw() |  #{translate("run_syntax_check")} + span.beta-feature-badge a( href ng-click="stop()" From 7ce406dd384ccd66c41cddf0cdcbb67406df54fd Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 3 Aug 2016 16:30:18 +0100 Subject: [PATCH 30/45] switch the compile dropdown menu to left, to avoid overflow into editor --- services/web/app/views/project/editor/pdf.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index 2754e8499d..37f3b53822 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") From 42388f8b762aa5549298ba3d26aff090ab17efff Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Wed, 3 Aug 2016 16:30:33 +0100 Subject: [PATCH 31/45] fix missing space in pdf jade template --- services/web/app/views/project/editor/pdf.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor/pdf.jade b/services/web/app/views/project/editor/pdf.jade index 37f3b53822..844f0f51dc 100644 --- a/services/web/app/views/project/editor/pdf.jade +++ b/services/web/app/views/project/editor/pdf.jade @@ -123,7 +123,7 @@ 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.type }} {{ entry.message }} + | {{ entry.type }} {{ entry.message }} .card.card-hint( ng-if="entry.humanReadableHint" stop-propagation="click" From 24d3eed77cb9f9cfa9eea881b6bdea1d1ed05790 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 5 Aug 2016 15:15:29 +0100 Subject: [PATCH 32/45] resized harvard --- services/web/public/img/crests/harvard.gif | Bin 3314 -> 3314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/services/web/public/img/crests/harvard.gif b/services/web/public/img/crests/harvard.gif index f9ba6a2298dfb1c55d58b3dcab97a93f09f297b5..092e17f4b3b2771bf63f7c7c773d81fc6344a38b 100644 GIT binary patch delta 21 ccmew)`AL$;-P6s&GVuw66~i}%jXckI09D-wjsO4v delta 21 ccmew)`AL$;-P6s&GVuw66~nW*jXckI09R87+yDRo From 90e0f829f54a0326e7c64ddc55e097088c29ce61 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 5 Aug 2016 15:15:45 +0100 Subject: [PATCH 33/45] removed old grunt tasks, moved to sharelatex/sharelatex --- services/web/Gruntfile.coffee | 54 ----------------------------------- 1 file changed, 54 deletions(-) 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 From 93af1a70ac29cc69e3d4b0879908118423e2276d Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 5 Aug 2016 15:15:56 +0100 Subject: [PATCH 34/45] added notifications into settings.defaults --- services/web/config/settings.defaults.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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" From 93cd51121107fe778030b5fd342740240c2dd72e Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 10 Aug 2016 16:42:56 +0100 Subject: [PATCH 35/45] Send events to custom DB backend --- .../Analytics/AnalyticsController.coffee | 7 +++ .../Analytics/AnalyticsManager.coffee | 45 +++++++++++++++++++ services/web/app/coffee/router.coffee | 6 ++- services/web/package.json | 3 ++ services/web/public/coffee/main/event.coffee | 17 +++++++ 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 services/web/app/coffee/Features/Analytics/AnalyticsController.coffee create mode 100644 services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee 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..abdd9ebef8 --- /dev/null +++ b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee @@ -0,0 +1,45 @@ +Settings = require "settings-sharelatex" +logger = require "logger-sharelatex" +_ = require "underscore" + +if !Settings.analytics?.postgres? + module.exports = + recordEvent: (user_id, event, metadata, callback = () ->) -> + logger.log {user_id, event, metadata}, "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, + metadata: Sequelize.STRING + }) + + module.exports = + recordEvent: (user_id, event, metadata = {}, callback = (error) ->) -> + if typeof(metadata) != "string" + metadata = JSON.stringify(metadata) + 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, metadata }) + .then( + (result) -> callback(), + (error) -> + logger.err {err: error, user_id, event, metadata}, "error recording analytics event" + callback(error) + ) + + sync: () -> sequelize.sync() \ No newline at end of file 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/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/main/event.coffee b/services/web/public/coffee/main/event.coffee index 371bd1004e..48ed802442 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -3,6 +3,11 @@ define [ "modules/localStorage" ], (App) -> CACHE_KEY = "countlyEvents" + send = (category, action, attributes = {})-> + ga('send', 'event', category, action) + event_name = "#{action}-#{category}" + Intercom?("trackEvent", event_name, attributes) + App.factory "event_tracking", (localStorage) -> _getEventCache = () -> @@ -41,6 +46,18 @@ define [ if ! _eventInCache(key) _addEventToCache(key) @sendCountly key, segmentation + + send: (category, action, attributes = {})-> + event_name = "#{action}-#{category}" + $.ajax { + url: "/event/#{event_name}", + method: "POST", + data: attributes, + dataType: "json", + headers: { + "X-CSRF-Token": window.csrfToken + } + } } # App.directive "countlyTrack", () -> From 056bb6b0f49e98a5d44e05e14944d8fdfbbb44f7 Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 10 Aug 2016 17:17:59 +0100 Subject: [PATCH 36/45] Use a JSON column for metadata --- .../web/app/coffee/Features/Analytics/AnalyticsManager.coffee | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee index abdd9ebef8..a902005ff0 100644 --- a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee +++ b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee @@ -21,13 +21,11 @@ else Event = sequelize.define("Event", { user_id: Sequelize.STRING, event: Sequelize.STRING, - metadata: Sequelize.STRING + metadata: Sequelize.JSON }) module.exports = recordEvent: (user_id, event, metadata = {}, callback = (error) ->) -> - if typeof(metadata) != "string" - metadata = JSON.stringify(metadata) if user_id? and typeof(user_id) != "string" user_id = user_id.toString() if user_id == Settings.smokeTest?.userId From 4886e8ba0ec9bdcb66219cbd21d1c5a77e1937f0 Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 10 Aug 2016 17:22:35 +0100 Subject: [PATCH 37/45] Rename metadata -> segmentation in Events table to play well with metabase --- .../Features/Analytics/AnalyticsManager.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee index a902005ff0..df1ba0be7c 100644 --- a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee +++ b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee @@ -4,8 +4,8 @@ _ = require "underscore" if !Settings.analytics?.postgres? module.exports = - recordEvent: (user_id, event, metadata, callback = () ->) -> - logger.log {user_id, event, metadata}, "no event tracking configured, logging event" + recordEvent: (user_id, event, segmentation, callback = () ->) -> + logger.log {user_id, event, segmentation}, "no event tracking configured, logging event" callback() else Sequelize = require "sequelize" @@ -21,22 +21,22 @@ else Event = sequelize.define("Event", { user_id: Sequelize.STRING, event: Sequelize.STRING, - metadata: Sequelize.JSON + segmentation: Sequelize.JSON }) module.exports = - recordEvent: (user_id, event, metadata = {}, callback = (error) ->) -> + 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, metadata }) + .create({ user_id, event, segmentation }) .then( (result) -> callback(), (error) -> - logger.err {err: error, user_id, event, metadata}, "error recording analytics event" + logger.err {err: error, user_id, event, segmentation}, "error recording analytics event" callback(error) ) From 0ec8e22ccf60f92519d9e112169b0f695e201104 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 10 Aug 2016 17:28:13 +0100 Subject: [PATCH 38/45] Send events to Postgre. --- services/web/public/coffee/main/event.coffee | 37 ++++++++------------ 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index 48ed802442..b2847bc5a0 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -2,14 +2,14 @@ define [ "base" "modules/localStorage" ], (App) -> - CACHE_KEY = "countlyEvents" + CACHE_KEY = "mbEvents" + send = (category, action, attributes = {})-> ga('send', 'event', category, action) event_name = "#{action}-#{category}" Intercom?("trackEvent", event_name, attributes) - - App.factory "event_tracking", (localStorage) -> + App.factory "event_tracking", ($http, localStorage) -> _getEventCache = () -> eventCache = localStorage CACHE_KEY @@ -34,30 +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 ]) - - sendCountlySampled: (key, segmentation) -> - @sendCountly key, segmentation if Math.random() < .01 - - sendCountlyOnce: (key, segmentation) -> - if ! _eventInCache(key) - _addEventToCache(key) - @sendCountly key, segmentation - - send: (category, action, attributes = {})-> - event_name = "#{action}-#{category}" - $.ajax { - url: "/event/#{event_name}", + sendMB: (key, segmentation = {}) -> + $http { + url: "/event/#{key}", method: "POST", - data: attributes, - dataType: "json", + data: segmentation headers: { "X-CSRF-Token": window.csrfToken } } + + sendMBSampled: (key, segmentation) -> + @sendMB key, segmentation if Math.random() < .01 + + sendMBOnce: (key, segmentation) -> + if ! _eventInCache(key) + _addEventToCache(key) + @sendMB key, segmentation } # App.directive "countlyTrack", () -> From 6a3372fcbf4819dca9e26ba49a82d2e295698a91 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 10 Aug 2016 17:29:43 +0100 Subject: [PATCH 39/45] Use new event tracking methods. --- services/web/public/coffee/ide.coffee | 8 ++++---- .../hotkeys/controllers/HotkeysController.coffee | 2 +- .../ide/pdf/controllers/PdfController.coffee | 14 +++++++------- .../coffee/ide/settings/services/settings.coffee | 6 +++--- .../ide/share/controllers/ShareController.coffee | 2 +- .../controllers/TrackChangesDiffController.coffee | 6 +++--- .../controllers/TrackChangesListController.coffee | 2 +- .../web/public/coffee/main/account-upgrade.coffee | 2 +- services/web/public/coffee/main/contact-us.coffee | 4 ++-- .../web/public/coffee/main/new-subscription.coffee | 6 +++--- 10 files changed, 26 insertions(+), 26 deletions(-) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index f18260d7d4..be82aa72a8 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -74,16 +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.sendCountlyOnce "ide-hover-#{feature}-once" + event_tracking.sendMBOnce "ide-hover-#{feature}-once" # End of tracking code. window._ide = ide 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/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 780fda5aa3..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 @@ -338,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 @@ -387,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" @@ -395,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( @@ -430,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 @@ -553,7 +553,7 @@ 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? 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 2378391974..51a7043191 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareController.coffee @@ -3,7 +3,7 @@ define [ ], (App) -> App.controller "ShareController", ["$scope", "$modal", "event_tracking", ($scope, $modal, 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/controllers/TrackChangesDiffController.coffee b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee index 77c2720a4f..a32acfb2b3 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesDiffController.coffee @@ -3,7 +3,7 @@ define [ ], (App) -> App.controller "TrackChangesDiffController", ($scope, $modal, ide, event_tracking) -> $scope.restoreDeletedDoc = () -> - event_tracking.sendCountly "track-changes-restore-deleted" + event_tracking.sendMB "track-changes-restore-deleted" $scope.trackChanges.diff.restoreInProgress = true ide.trackChangesManager .restoreDeletedDoc( @@ -15,7 +15,7 @@ define [ $scope.trackChanges.diff.restoreDeletedSuccess = true $scope.openRestoreDiffModal = () -> - event_tracking.sendCountly "track-changes-restore-modal" + event_tracking.sendMB "track-changes-restore-modal" $modal.open { templateUrl: "trackChangesRestoreDiffModalTemplate" controller: "TrackChangesRestoreDiffModalController" @@ -33,7 +33,7 @@ define [ $scope.diff = diff $scope.restore = () -> - event_tracking.sendCountly "track-changes-restored" + 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 e0beb3ef4f..3511ddf6c1 100644 --- a/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee +++ b/services/web/public/coffee/ide/track-changes/controllers/TrackChangesListController.coffee @@ -92,7 +92,7 @@ define [ $scope.recalculateSelectedUpdates() $scope.select = () -> - event_tracking.sendCountly "track-changes-view-change" + 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/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 From b405b4dce6647682e4e86897d25986c427ee87da Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 10 Aug 2016 17:34:32 +0100 Subject: [PATCH 40/45] Remove Countly integration. --- services/web/app/views/layout.jade | 70 ------------------------------ 1 file changed, 70 deletions(-) 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}"; From 64d0b8bc7c363d01beed41bd1449ec486928e0bc Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 10 Aug 2016 17:46:22 +0100 Subject: [PATCH 41/45] Update shrinkwrap. --- services/web/npm-shrinkwrap.json | 1503 +++++++++++++++++------------- 1 file changed, 876 insertions(+), 627 deletions(-) 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" } } From 0270d34d0f3b3a22d0037d94cac86b5c0d158179 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 11 Aug 2016 10:18:58 +0100 Subject: [PATCH 42/45] Use JSONB not JSON column type --- .../web/app/coffee/Features/Analytics/AnalyticsManager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee index df1ba0be7c..f906118b16 100644 --- a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee +++ b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee @@ -21,7 +21,7 @@ else Event = sequelize.define("Event", { user_id: Sequelize.STRING, event: Sequelize.STRING, - segmentation: Sequelize.JSON + segmentation: Sequelize.JSONB }) module.exports = From 6a210978fe312ce9720e4c937cf998a01beb87c3 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 11 Aug 2016 12:29:58 +0100 Subject: [PATCH 43/45] Track registration events. --- .../web/app/coffee/Features/User/UserRegistrationHandler.coffee | 2 ++ 1 file changed, 2 insertions(+) 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) ->) -> From 9bf9df9a4a822cdc67cf3f63962adb3f2df74b14 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 11 Aug 2016 14:09:45 +0100 Subject: [PATCH 44/45] Track login events. --- .../Features/Authentication/AuthenticationController.coffee | 2 ++ 1 file changed, 2 insertions(+) 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() From 228de5332e625c42347452cacdede5f2673edad1 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 11 Aug 2016 14:09:57 +0100 Subject: [PATCH 45/45] Unit test tracking code. --- .../Authentication/AuthenticationControllerTests.coffee | 6 ++++++ .../coffee/User/UserRegistrationHandlerTests.coffee | 8 ++++++++ 2 files changed, 14 insertions(+) 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/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()