From d9a7b1248ab5b7d7cce8044f648b38ec46cef2a7 Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 17 Apr 2018 14:43:54 +0100 Subject: [PATCH 01/87] Re-order compile rate limits to do project/user check before everyone check --- .../Features/Compile/CompileManager.coffee | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/services/web/app/coffee/Features/Compile/CompileManager.coffee b/services/web/app/coffee/Features/Compile/CompileManager.coffee index 3022a214c4..4f4fe89e94 100755 --- a/services/web/app/coffee/Features/Compile/CompileManager.coffee +++ b/services/web/app/coffee/Features/Compile/CompileManager.coffee @@ -18,15 +18,16 @@ module.exports = CompileManager = timer.done() _callback(args...) - @_checkIfAutoCompileLimitHasBeenHit options.isAutoCompile, "everyone", (err, canCompile)-> - if !canCompile - return callback null, "autocompile-backoff", [] - logger.log project_id: project_id, user_id: user_id, "compiling project" - CompileManager._checkIfRecentlyCompiled project_id, user_id, (error, recentlyCompiled) -> - return callback(error) if error? - if recentlyCompiled - logger.warn {project_id, user_id}, "project was recently compiled so not continuing" - return callback null, "too-recently-compiled", [] + logger.log project_id: project_id, user_id: user_id, "compiling project" + CompileManager._checkIfRecentlyCompiled project_id, user_id, (error, recentlyCompiled) -> + return callback(error) if error? + if recentlyCompiled + logger.warn {project_id, user_id}, "project was recently compiled so not continuing" + return callback null, "too-recently-compiled", [] + + CompileManager._checkIfAutoCompileLimitHasBeenHit options.isAutoCompile, "everyone", (err, canCompile)-> + if !canCompile + return callback null, "autocompile-backoff", [] CompileManager._ensureRootDocumentIsSet project_id, (error) -> return callback(error) if error? From 5d266c7f04a0f4500ecae9bdb5878ce7a03412da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Tue, 17 Apr 2018 16:09:22 +0100 Subject: [PATCH 02/87] Show export user CSV even if the group has reached max capacity --- .../app/views/subscriptions/group_admin.pug | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/services/web/app/views/subscriptions/group_admin.pug b/services/web/app/views/subscriptions/group_admin.pug index 39312fd57a..3fe93f3b94 100644 --- a/services/web/app/views/subscriptions/group_admin.pug +++ b/services/web/app/views/subscriptions/group_admin.pug @@ -59,24 +59,29 @@ block content .col-md-12.text-centered small #{translate("no_members")} + hr div(ng-if="users.length < groupSize", ng-cloak) - hr - p - .small #{translate("add_more_members")} - form.form - .row - .col-xs-6 - input.form-control( - name="email", - type="text", - placeholder="jane@example.com, joe@example.com", - ng-model="inputs.emails", - on-enter="addMembers()" - ) - .col-xs-4 - button.btn.btn-primary(ng-click="addMembers()") #{translate("add")} - .col-xs-2 - a(href="/subscription/group/export") Export CSV + p.small #{translate("add_more_members")} + form.form + .row + .col-xs-6 + input.form-control( + name="email", + type="text", + placeholder="jane@example.com, joe@example.com", + ng-model="inputs.emails", + on-enter="addMembers()" + ) + .col-xs-4 + button.btn.btn-primary(ng-click="addMembers()") #{translate("add")} + .col-xs-2 + a(href="/subscription/group/export") Export CSV + + div(ng-if="users.length >= groupSize && users.length > 0", ng-cloak) + .row + .col-xs-2.col-xs-offset-10 + a(href="/subscription/group/export") Export CSV + script(type="text/javascript"). window.users = !{JSON.stringify(users)}; @@ -84,5 +89,3 @@ block content - - From ea2e58569949c660f294f4bcb4a87a3dd516d080 Mon Sep 17 00:00:00 2001 From: hugh-obrien Date: Tue, 24 Apr 2018 16:51:01 +0100 Subject: [PATCH 03/87] basic publish menu styling --- .../web/public/stylesheets/app/editor.less | 1 + .../stylesheets/app/editor/publish-modal.less | 91 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 services/web/public/stylesheets/app/editor/publish-modal.less diff --git a/services/web/public/stylesheets/app/editor.less b/services/web/public/stylesheets/app/editor.less index 46a35c440f..1fcbde35d6 100644 --- a/services/web/public/stylesheets/app/editor.less +++ b/services/web/public/stylesheets/app/editor.less @@ -13,6 +13,7 @@ @import "./editor/hotkeys.less"; @import "./editor/review-panel.less"; @import "./editor/rich-text.less"; +@import "./editor/publish-modal.less"; @ui-layout-toggler-def-height: 50px; @ui-resizer-size: 7px; diff --git a/services/web/public/stylesheets/app/editor/publish-modal.less b/services/web/public/stylesheets/app/editor/publish-modal.less new file mode 100644 index 0000000000..46c86395c5 --- /dev/null +++ b/services/web/public/stylesheets/app/editor/publish-modal.less @@ -0,0 +1,91 @@ +@import "core/ol-variables.less"; + +.modal-body-publish { + #search-input-container { + overflow: hidden; + margin: 5px 0 10px; + } + .table-content-name { + width: 100%; + margin-bottom: 10px; + font-weight: 300; + } + .table-content-category { + font-weight: 300; + text-align: right; + font-style: italic; + width: 30%; + float: right; + text-transform: capitalize + } + .table-content-category ~ .table-content-name { + width: 70%; + display: inline-block; + } + .wl-icon:before{ + font-size: 14px; + } + .button-as-link{ + color: @ol-green; + text-transform: none; + background: none; + padding: 0; + border: none; + border-radius: 0; + font-size: 14px; + @extend a; + &:hover, + &:active, + &:focus { + color: @ol-dark-green; + background: none; + } + text-align: left; + } + .affix-content-title { + color: @gray-light; + font-size: 1.2em; + padding-left: 10px; + } + + .affix-subcontent { + margin: 5px 0 50px; + } + .overbox { + padding: @line-height-computed / 2; + background-color: white; + margin-top: @line-height-computed / 2; + border: 1px solid @gray-lighter; + } + .content-as-table { + .table-content, + .table-content > * { + display: table; + } + .table-content-icon { + float: left; + height: 80px; + width: 106px; + border: 1px solid @gray-lightest; + display: flex; + align-items: center; + overflow: hidden; + * { + width: 100%; + } + } + .table-content-text { + float: right; + width: calc(~'100% - 106px'); + vertical-align: top; + padding-left: 15px; + } + .table-content-slogan { + height: 80px; + overflow: hidden; + } + .table-content-link { + padding-top: 10px; + } + } +} From e76a15e4e08e9925c3dd4969025e55c2190a348f Mon Sep 17 00:00:00 2001 From: hugh-obrien Date: Fri, 27 Apr 2018 14:50:52 +0100 Subject: [PATCH 04/87] remove ol core variables --- .../web/public/stylesheets/app/editor/publish-modal.less | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/services/web/public/stylesheets/app/editor/publish-modal.less b/services/web/public/stylesheets/app/editor/publish-modal.less index 46c86395c5..e3320f85f0 100644 --- a/services/web/public/stylesheets/app/editor/publish-modal.less +++ b/services/web/public/stylesheets/app/editor/publish-modal.less @@ -1,5 +1,3 @@ -@import "core/ol-variables.less"; - .modal-body-publish { #search-input-container { overflow: hidden; @@ -26,7 +24,7 @@ font-size: 14px; } .button-as-link{ - color: @ol-green; + color: green; text-transform: none; background: none; padding: 0; @@ -37,7 +35,7 @@ &:hover, &:active, &:focus { - color: @ol-dark-green; + color: green; background: none; } text-align: left; From 157efa6d96c28b574570d4f685c8c758a0029d13 Mon Sep 17 00:00:00 2001 From: hugh-obrien Date: Fri, 27 Apr 2018 15:50:11 +0100 Subject: [PATCH 05/87] make publish modal accessible from query string --- .../web/app/coffee/Features/Project/ProjectController.coffee | 1 + services/web/app/coffee/infrastructure/Features.coffee | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 77aabd8524..0b41bec1d2 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -302,6 +302,7 @@ module.exports = ProjectController = maxDocLength: Settings.max_doc_length useV2History: !!project.overleaf?.history?.display showRichText: req.query?.rt == 'true' + showPublishModal: req.query?.pm == 'true' timer.done() _buildProjectList: (allProjects, v1Projects = [])-> diff --git a/services/web/app/coffee/infrastructure/Features.coffee b/services/web/app/coffee/infrastructure/Features.coffee index be7cd21d89..519cfda6da 100644 --- a/services/web/app/coffee/infrastructure/Features.coffee +++ b/services/web/app/coffee/infrastructure/Features.coffee @@ -14,8 +14,6 @@ module.exports = Features = return Settings.enableGithubSync when 'v1-return-message' return Settings.accountMerge? and Settings.overleaf? - when 'publish-modal' - return Settings.showPublishModal when 'custom-togglers' return Settings.overleaf? else From 5c87a2aa90a739fdf2f7d25f89d3f1653bb1f987 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 27 Apr 2018 16:50:46 +0100 Subject: [PATCH 06/87] Display last modified as a relative date in v2 --- services/web/app/views/project/list/item.pug | 5 ++++- services/web/app/views/project/list/v1-item.pug | 2 +- services/web/public/coffee/filters/formatDate.coffee | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/services/web/app/views/project/list/item.pug b/services/web/app/views/project/list/item.pug index a4bb240c4b..bfc53a8360 100644 --- a/services/web/app/views/project/list/item.pug +++ b/services/web/app/views/project/list/item.pug @@ -38,4 +38,7 @@ tooltip-append-to-body="true" ) .col-xs-4 - span.last-modified {{project.lastUpdated | formatDate}} \ No newline at end of file + if settings.overleaf + span.last-modified(tooltip="{{project.lastUpdated | formatDate}}") {{project.lastUpdated | fromNowDate}} + else + span.last-modified {{project.lastUpdated | formatDate}} diff --git a/services/web/app/views/project/list/v1-item.pug b/services/web/app/views/project/list/v1-item.pug index 68f7b2af63..b4a3ccb99d 100644 --- a/services/web/app/views/project/list/v1-item.pug +++ b/services/web/app/views/project/list/v1-item.pug @@ -22,4 +22,4 @@ span.owner {{ownerName()}} .col-xs-4 - span.last-modified {{project.lastUpdated | formatDate}} \ No newline at end of file + span.last-modified(tooltip="{{project.lastUpdated | formatDate}}") {{project.lastUpdated | fromNowDate}} \ No newline at end of file diff --git a/services/web/public/coffee/filters/formatDate.coffee b/services/web/public/coffee/filters/formatDate.coffee index 5b8c9e10c6..28c4ad23ba 100644 --- a/services/web/public/coffee/filters/formatDate.coffee +++ b/services/web/public/coffee/filters/formatDate.coffee @@ -17,3 +17,7 @@ define [ App.filter "relativeDate", () -> (date) -> moment(date).calendar() + + App.filter "fromNowDate", () -> + (date) -> + moment(date).fromNow() From b2e3997e8381dd281b8ae4670404050277fed72f Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 30 Apr 2018 10:18:01 +0100 Subject: [PATCH 07/87] Add modules public/coffee dir to nodemon frontend watch --- services/web/nodemon.frontend.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/web/nodemon.frontend.json b/services/web/nodemon.frontend.json index d0f321fa14..d4d2fdbb26 100644 --- a/services/web/nodemon.frontend.json +++ b/services/web/nodemon.frontend.json @@ -8,7 +8,8 @@ "exec": "make compile || exit 1", "watch": [ "public/coffee/", - "public/stylesheets/" + "public/stylesheets/", + "modules/**/public/coffee/" ], "ext": "coffee less" } \ No newline at end of file From 6399621d1f1b0dd95886f9e9cb89c33e9727c1c2 Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 30 Apr 2018 17:13:57 +0100 Subject: [PATCH 08/87] Show front widget for paid and sampled free users --- .../Features/Project/ProjectController.coffee | 11 +++++++- .../web/app/views/project/list/front-chat.pug | 6 ++--- .../Project/ProjectControllerTests.coffee | 27 +++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 77aabd8524..c33e62d12d 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -157,7 +157,7 @@ module.exports = ProjectController = hasSubscription: (cb)-> LimitationsManager.userHasSubscriptionOrIsGroupMember currentUser, cb user: (cb) -> - User.findById user_id, "featureSwitches overleaf awareOfV2", cb + User.findById user_id, "featureSwitches overleaf awareOfV2 features", cb }, (err, results)-> if err? logger.err err:err, "error getting data for project list page" @@ -172,6 +172,7 @@ module.exports = ProjectController = user = results.user warnings = ProjectController._buildWarningsList results.v1Projects + ProjectController._injectProjectOwners projects, (error, projects) -> return next(error) if error? viewModel = { @@ -193,6 +194,14 @@ module.exports = ProjectController = else viewModel.showUserDetailsArea = false + paidUser = user.features?.github # use a heuristic for paid account + freeUserProportion = 0.85 + sampleFreeUser = parseInt(user._id.toString().slice(-2), 16) < freeUserProportion * 255 + showFrontWidget = paidUser or sampleFreeUser + logger.log {paidUser, sampleFreeUser, showFrontWidget}, 'deciding whether to show front widget' + if showFrontWidget + viewModel.frontChatWidgetRoomId = Settings.overleaf?.front_chat_widget_room_id + res.render 'project/list', viewModel timer.done() diff --git a/services/web/app/views/project/list/front-chat.pug b/services/web/app/views/project/list/front-chat.pug index 7f0939de29..7e1c9a7123 100644 --- a/services/web/app/views/project/list/front-chat.pug +++ b/services/web/app/views/project/list/front-chat.pug @@ -1,4 +1,4 @@ -- if (settings.overleaf && settings.overleaf.front_chat_widget_room_id != null) +- if (frontChatWidgetRoomId) script. - window.FCSP = '#{settings.overleaf.front_chat_widget_room_id}'; - script(src="https://chat-assets.frontapp.com/v1/chat.bundle.js") \ No newline at end of file + window.FCSP = '#{frontChatWidgetRoomId}'; + script(src="https://chat-assets.frontapp.com/v1/chat.bundle.js") diff --git a/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee b/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee index 4e1402429b..65ca033cab 100644 --- a/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee @@ -15,6 +15,7 @@ describe "ProjectController", -> @user = _id:"588f3ddae8ebc1bac07c9fa4" first_name: "bjkdsjfk" + features: {} @settings = apis: chat: @@ -300,6 +301,32 @@ describe "ProjectController", -> done() @ProjectController.projectListPage @req, @res + describe 'front widget', (done) -> + beforeEach -> + @settings.overleaf = + front_chat_widget_room_id: 'chat-room-id' + + it 'should show for paid users', (done) -> + @user.features.github = true + @res.render = (pageName, opts)=> + opts.frontChatWidgetRoomId.should.equal @settings.overleaf.front_chat_widget_room_id + done() + @ProjectController.projectListPage @req, @res + + it 'should show for sample users', (done) -> + @user._id = '588f3ddae8ebc1bac07c9faa' # last two digits + @res.render = (pageName, opts)=> + opts.frontChatWidgetRoomId.should.equal @settings.overleaf.front_chat_widget_room_id + done() + @ProjectController.projectListPage @req, @res + + it 'should not show for non sample users', (done) -> + @user._id = '588f3ddae8ebc1bac07c9fff' # last two digits + @res.render = (pageName, opts)=> + expect(opts.frontChatWidgetRoomId).to.equal undefined + done() + @ProjectController.projectListPage @req, @res + describe 'with overleaf-integration-web-module hook', -> beforeEach -> @V1Response = From d454be8053d80979819c64cf6d149ffb3a36d5d4 Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 30 Apr 2018 17:19:21 +0100 Subject: [PATCH 09/87] Bring down proportion to 10% --- .../web/app/coffee/Features/Project/ProjectController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index c33e62d12d..9312ba0b1b 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -195,7 +195,7 @@ module.exports = ProjectController = viewModel.showUserDetailsArea = false paidUser = user.features?.github # use a heuristic for paid account - freeUserProportion = 0.85 + freeUserProportion = 0.10 sampleFreeUser = parseInt(user._id.toString().slice(-2), 16) < freeUserProportion * 255 showFrontWidget = paidUser or sampleFreeUser logger.log {paidUser, sampleFreeUser, showFrontWidget}, 'deciding whether to show front widget' From 40da785363629a136b4278e241463040712d9dde Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 1 May 2018 09:02:43 +0100 Subject: [PATCH 10/87] Fix test for sampling front users --- .../web/test/unit/coffee/Project/ProjectControllerTests.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee b/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee index 65ca033cab..ccae21ba70 100644 --- a/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee @@ -314,7 +314,7 @@ describe "ProjectController", -> @ProjectController.projectListPage @req, @res it 'should show for sample users', (done) -> - @user._id = '588f3ddae8ebc1bac07c9faa' # last two digits + @user._id = '588f3ddae8ebc1bac07c9f00' # last two digits @res.render = (pageName, opts)=> opts.frontChatWidgetRoomId.should.equal @settings.overleaf.front_chat_widget_room_id done() From 387108da48137338c494928a17225f3b8c41f06c Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Tue, 1 May 2018 10:16:56 +0100 Subject: [PATCH 11/87] Make links in chat messages white (same as text), with underline --- services/web/public/stylesheets/_ol_style_includes.less | 1 + services/web/public/stylesheets/app/ol-chat.less | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 services/web/public/stylesheets/app/ol-chat.less diff --git a/services/web/public/stylesheets/_ol_style_includes.less b/services/web/public/stylesheets/_ol_style_includes.less index 921b20f727..70820f9b68 100644 --- a/services/web/public/stylesheets/_ol_style_includes.less +++ b/services/web/public/stylesheets/_ol_style_includes.less @@ -1,2 +1,3 @@ @import "app/sidebar-v2-dash-pane.less"; @import "app/front-chat-widget.less"; +@import "app/ol-chat.less"; diff --git a/services/web/public/stylesheets/app/ol-chat.less b/services/web/public/stylesheets/app/ol-chat.less new file mode 100644 index 0000000000..dd1cf692b6 --- /dev/null +++ b/services/web/public/stylesheets/app/ol-chat.less @@ -0,0 +1,6 @@ +// Styles for Chat panel in Overleaf v2 + +.chat .message-wrapper .message .message-content a { + color: inherit; + text-decoration: underline; +} From af70ef0dc4a429d6c1da7761905fa5b5f19f7f6e Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Tue, 1 May 2018 14:01:52 +0100 Subject: [PATCH 12/87] Add `templates` to the `hasFeature` function --- services/web/app/coffee/infrastructure/Features.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/web/app/coffee/infrastructure/Features.coffee b/services/web/app/coffee/infrastructure/Features.coffee index be7cd21d89..15d273e9d7 100644 --- a/services/web/app/coffee/infrastructure/Features.coffee +++ b/services/web/app/coffee/infrastructure/Features.coffee @@ -18,5 +18,7 @@ module.exports = Features = return Settings.showPublishModal when 'custom-togglers' return Settings.overleaf? + when 'templates' + return !Settings.overleaf? else throw new Error("unknown feature: #{feature}") From ba0e06d0fe07380079c56a8feb91f6225c2cd002 Mon Sep 17 00:00:00 2001 From: Hayden Faulds Date: Wed, 2 May 2018 13:18:43 +0100 Subject: [PATCH 13/87] add V1HistoryNotSyncedError --- services/web/app/coffee/Features/Errors/Errors.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/web/app/coffee/Features/Errors/Errors.coffee b/services/web/app/coffee/Features/Errors/Errors.coffee index 1b138d646f..b2ed088d15 100644 --- a/services/web/app/coffee/Features/Errors/Errors.coffee +++ b/services/web/app/coffee/Features/Errors/Errors.coffee @@ -47,6 +47,13 @@ UnsupportedExportRecordsError = (message) -> return error UnsupportedExportRecordsError.prototype.__proto___ = Error.prototype +V1HistoryNotSyncedError = (message) -> + error = new Error(message) + error.name = "V1HistoryNotSyncedError" + error.__proto__ = V1HistoryNotSyncedError.prototype + return error +V1HistoryNotSyncedError.prototype.__proto___ = Error.prototype + ProjectHistoryDisabledError = (message) -> error = new Error(message) error.name = "ProjectHistoryDisabledError " @@ -62,4 +69,5 @@ module.exports = Errors = UnsupportedFileTypeError: UnsupportedFileTypeError UnsupportedBrandError: UnsupportedBrandError UnsupportedExportRecordsError: UnsupportedExportRecordsError + V1HistoryNotSyncedError: V1HistoryNotSyncedError ProjectHistoryDisabledError: ProjectHistoryDisabledError From 09486f2eea757a811868b2e1472edafbacc9e239 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 3 May 2018 12:20:53 +0100 Subject: [PATCH 14/87] Recompile on Cmd-S and :w --- .../web/app/views/project/editor/editor.pug | 1 + .../ide/editor/directives/aceEditor.coffee | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/services/web/app/views/project/editor/editor.pug b/services/web/app/views/project/editor/editor.pug index fed1889d79..352db77b7e 100644 --- a/services/web/app/views/project/editor/editor.pug +++ b/services/web/app/views/project/editor/editor.pug @@ -58,6 +58,7 @@ div.full-size( read-only="!permissions.write", file-name="editor.open_doc_name", on-ctrl-enter="recompileViaKey", + on-save="recompileViaKey", on-ctrl-j="toggleReviewPanel", on-ctrl-shift-c="addNewCommentFromKbdShortcut", on-ctrl-shift-a="toggleTrackChangesFromKbdShortcut", diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index fd6a8224e4..2552a7a95d 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -3,6 +3,7 @@ define [ "ace/ace" "ace/ext-searchbox" "ace/ext-modelist" + "ace/keybinding-vim" "ide/editor/directives/aceEditor/undo/UndoManager" "ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager" "ide/editor/directives/aceEditor/spell-check/SpellCheckManager" @@ -14,9 +15,10 @@ define [ "ide/graphics/services/graphics" "ide/preamble/services/preamble" "ide/files/services/files" -], (App, Ace, SearchBox, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) -> +], (App, Ace, SearchBox, Vim, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) -> EditSession = ace.require('ace/edit_session').EditSession ModeList = ace.require('ace/ext/modelist') + Vim = ace.require('ace/keyboard/vim').Vim # set the path for ace workers if using a CDN (from editor.pug) if window.aceWorkerPath != "" @@ -60,6 +62,7 @@ define [ onCtrlJ: "=" # Toggle the review panel onCtrlShiftC: "=" # Add a new comment onCtrlShiftA: "=" # Toggle track-changes on/off + onSave: "=" # Cmd/Ctrl-S or :w in Vim syntaxValidation: "=" reviewPanel: "=" eventsBridge: "=" @@ -107,15 +110,20 @@ define [ autoCompleteManager = new AutoCompleteManager(scope, editor, element, metadataManager, graphics, preamble, files) # Prevert Ctrl|Cmd-S from triggering save dialog - editor.commands.addCommand - name: "save", - bindKey: win: "Ctrl-S", mac: "Command-S" - exec: () -> - readOnly: true + scope.$watch "onSave", (callback) -> + if callback? + editor.commands.addCommand + name: "save", + bindKey: win: "Ctrl-S", mac: "Command-S" + exec: () -> + callback() + readOnly: true + Vim.defineEx 'write', 'w', callback editor.commands.removeCommand "transposeletters" editor.commands.removeCommand "showSettingsMenu" editor.commands.removeCommand "foldall" + # For European keyboards, the / is above 7 so needs Shift pressing. # This comes through as Command-Shift-/ on OS X, which is mapped to # toggleBlockComment. From 8ecd073efca5264cbd6a410361e7d5d55383360a Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 3 May 2018 12:28:14 +0100 Subject: [PATCH 15/87] Support Ctrl-. to compile for v1 compabitility --- .../coffee/ide/editor/directives/aceEditor.coffee | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 2552a7a95d..61760d0117 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -112,13 +112,21 @@ define [ # Prevert Ctrl|Cmd-S from triggering save dialog scope.$watch "onSave", (callback) -> if callback? + Vim.defineEx 'write', 'w', callback editor.commands.addCommand name: "save", bindKey: win: "Ctrl-S", mac: "Command-S" exec: () -> callback() readOnly: true - Vim.defineEx 'write', 'w', callback + # Not technically 'save', but Ctrl-. recompiles in OL v1 + # so maintain compatibility + editor.commands.addCommand + name: "recompile_v1", + bindKey: win: "Ctrl-.", mac: "Ctrl-." + exec: () -> + callback() + readOnly: true editor.commands.removeCommand "transposeletters" editor.commands.removeCommand "showSettingsMenu" editor.commands.removeCommand "foldall" From 42ac8faaae8771bb9f9f9e4ce5ff55e1d043fc6c Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 3 May 2018 17:01:34 +0100 Subject: [PATCH 16/87] Add dependency mapping for vim keybindings --- services/web/app/views/project/editor.pug | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor.pug b/services/web/app/views/project/editor.pug index a9ba703a32..7415c2ed77 100644 --- a/services/web/app/views/project/editor.pug +++ b/services/web/app/views/project/editor.pug @@ -154,7 +154,10 @@ block requirejs }, "ace/ext-language_tools": { "deps": ["ace/ace"] - } + }, + "ace/keybinding-vim": { + "deps": ["ace/ace"] + }, }, "config":{ "moment":{ From 7e250be66dcddb0d906af4b607caf529555e1a63 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 3 May 2018 17:04:49 +0100 Subject: [PATCH 17/87] Update font and line spacing in Ace to match OL v1 --- .../web/public/coffee/ide/editor/directives/aceEditor.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index fd6a8224e4..97fca8a359 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -81,6 +81,9 @@ define [ editor = ace.edit(element.find(".ace-editor-body")[0]) editor.$blockScrolling = Infinity + editor.container.style.lineHeight = 1.6 + editor.setOption('fontFamily', '"Lucida Console", monospace') + # auto-insertion of braces, brackets, dollars editor.setOption('behavioursEnabled', scope.autoPairDelimiters || false) editor.setOption('wrapBehavioursEnabled', false) From e414100c410b37519ef0c87bf76c70162a2e53f7 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Fri, 4 May 2018 13:22:33 +0100 Subject: [PATCH 18/87] add support for unique lock values --- .../coffee/infrastructure/LockManager.coffee | 45 ++++++++++++++----- .../ProjectStructureMongoLockTest.coffee | 7 ++- .../LockManager/ReleasingTheLock.coffee | 13 +++--- .../LockManager/tryLockTests.coffee | 3 +- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/services/web/app/coffee/infrastructure/LockManager.coffee b/services/web/app/coffee/infrastructure/LockManager.coffee index dd29bd0bde..60f6d00cc0 100644 --- a/services/web/app/coffee/infrastructure/LockManager.coffee +++ b/services/web/app/coffee/infrastructure/LockManager.coffee @@ -3,6 +3,13 @@ Settings = require('settings-sharelatex') RedisWrapper = require("./RedisWrapper") rclient = RedisWrapper.client("lock") logger = require "logger-sharelatex" +os = require "os" +crypto = require "crypto" + +HOST = os.hostname() +PID = process.pid +RND = crypto.randomBytes(4).toString('hex') +COUNT = 0 module.exports = LockManager = LOCK_TEST_INTERVAL: 50 # 50ms between each test of the lock @@ -10,13 +17,22 @@ module.exports = LockManager = REDIS_LOCK_EXPIRY: 30 # seconds. Time until lock auto expires in redis SLOW_EXECUTION_THRESHOLD: 5000 # 5s, if execution takes longer than this then log + # Use a signed lock value as described in + # http://redis.io/topics/distlock#correct-implementation-with-a-single-instance + # to prevent accidental unlocking by multiple processes + randomLock : () -> + time = Date.now() + return "locked:host=#{HOST}:pid=#{PID}:random=#{RND}:time=#{time}:count=#{COUNT++}" + + unlockScript: 'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end' + runWithLock: (namespace, id, runner = ( (releaseLock = (error) ->) -> ), callback = ( (error) -> )) -> # This error is defined here so we get a useful stacktrace slowExecutionError = new Error "slow execution during lock" timer = new metrics.Timer("lock.#{namespace}") key = "lock:web:#{namespace}:#{id}" - LockManager._getLock key, namespace, (error) -> + LockManager._getLock key, namespace, (error, lockValue) -> return callback(error) if error? # The lock can expire in redis but the process carry on. This setTimout call @@ -27,7 +43,7 @@ module.exports = LockManager = exceededLockTimeout = setTimeout countIfExceededLockTimeout, LockManager.REDIS_LOCK_EXPIRY * 1000 runner (error1, values...) -> - LockManager._releaseLock key, (error2) -> + LockManager._releaseLock key, lockValue, (error2) -> clearTimeout exceededLockTimeout timeTaken = new Date - timer.start @@ -39,18 +55,19 @@ module.exports = LockManager = return callback(error) if error? callback null, values... - _tryLock : (key, namespace, callback = (err, isFree)->)-> - rclient.set key, "locked", "EX", LockManager.REDIS_LOCK_EXPIRY, "NX", (err, gotLock)-> + _tryLock : (key, namespace, callback = (err, isFree, lockValue)->)-> + lockValue = LockManager.randomLock() + rclient.set key, lockValue, "EX", LockManager.REDIS_LOCK_EXPIRY, "NX", (err, gotLock)-> return callback(err) if err? if gotLock == "OK" metrics.inc "lock.#{namespace}.try.success" - callback err, true + callback err, true, lockValue else metrics.inc "lock.#{namespace}.try.failed" logger.log key: key, redis_response: gotLock, "lock is locked" callback err, false - _getLock: (key, namespace, callback = (error) ->) -> + _getLock: (key, namespace, callback = (error, lockValue) ->) -> startTime = Date.now() attempts = 0 do attempt = () -> @@ -59,13 +76,21 @@ module.exports = LockManager = return callback(new Error("Timeout")) attempts += 1 - LockManager._tryLock key, namespace, (error, gotLock) -> + LockManager._tryLock key, namespace, (error, gotLock, lockValue) -> return callback(error) if error? if gotLock metrics.gauge "lock.#{namespace}.get.success.tries", attempts - callback(null) + callback(null, lockValue) else setTimeout attempt, LockManager.LOCK_TEST_INTERVAL - _releaseLock: (key, callback)-> - rclient.del key, callback + _releaseLock: (key, lockValue, callback)-> + rclient.eval LockManager.unlockScript, 1, key, lockValue, (err, result) -> + if err? + return callback(err) + else if result? and result isnt 1 # successful unlock should release exactly one key + logger.error {key:key, lockValue:lockValue, redis_err:err, redis_result:result}, "unlocking error" + metrics.inc "unlock-error" + return callback(new Error("tried to release timed out lock")) + else + callback(null,result) diff --git a/services/web/test/acceptance/coffee/ProjectStructureMongoLockTest.coffee b/services/web/test/acceptance/coffee/ProjectStructureMongoLockTest.coffee index 02019b74dd..7745a12ac5 100644 --- a/services/web/test/acceptance/coffee/ProjectStructureMongoLockTest.coffee +++ b/services/web/test/acceptance/coffee/ProjectStructureMongoLockTest.coffee @@ -22,6 +22,7 @@ describe "ProjectStructureMongoLock", -> before (done) -> # We want to instantly fail if the lock is taken LockManager.MAX_LOCK_WAIT_TIME = 1 + @lockValue = "lock-value" userDetails = holdingAccount:false, email: 'test@example.com' @@ -33,11 +34,13 @@ describe "ProjectStructureMongoLock", -> @locked_project = project namespace = ProjectEntityMongoUpdateHandler.LOCK_NAMESPACE @lock_key = "lock:web:#{namespace}:#{project._id}" - LockManager._getLock @lock_key, namespace, done + LockManager._getLock @lock_key, namespace, (err, lockValue) => + @lockValue = lockValue + done() return after (done) -> - LockManager._releaseLock @lock_key, done + LockManager._releaseLock @lock_key, @lockValue, done describe 'interacting with the locked project', -> LOCKING_UPDATE_METHODS = ['addDoc', 'addFile', 'mkdirp', 'moveEntity', 'renameEntity', 'addFolder'] diff --git a/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee b/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee index 256f72f95f..1fbe7b07f4 100644 --- a/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee +++ b/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee @@ -3,23 +3,26 @@ assert = require('assert') path = require('path') modulePath = path.join __dirname, '../../../../../app/js/infrastructure/LockManager.js' lockKey = "lock:web:{#{5678}}" +lockValue = "123456" SandboxedModule = require('sandboxed-module') describe 'LockManager - releasing the lock', ()-> - deleteStub = sinon.stub().callsArgWith(1) + deleteStub = sinon.stub().callsArgWith(4) mocks = "logger-sharelatex": log:-> "./RedisWrapper": client: ()-> auth:-> - del:deleteStub + eval:deleteStub + LockManager = SandboxedModule.require(modulePath, requires: mocks) - + LockManager.unlockScript = "this is the unlock script" + it 'should put a all data into memory', (done)-> - LockManager._releaseLock lockKey, -> - deleteStub.calledWith(lockKey).should.equal true + LockManager._releaseLock lockKey, lockValue, -> + deleteStub.calledWith(LockManager.unlockScript, 1, lockKey, lockValue).should.equal true done() diff --git a/services/web/test/unit/coffee/infrastructure/LockManager/tryLockTests.coffee b/services/web/test/unit/coffee/infrastructure/LockManager/tryLockTests.coffee index b3719623bb..9988b8583b 100644 --- a/services/web/test/unit/coffee/infrastructure/LockManager/tryLockTests.coffee +++ b/services/web/test/unit/coffee/infrastructure/LockManager/tryLockTests.coffee @@ -22,10 +22,11 @@ describe 'LockManager - trying the lock', -> describe "when the lock is not set", -> beforeEach -> @set.callsArgWith(5, null, "OK") + @LockManager.randomLock = sinon.stub().returns("random-lock-value") @LockManager._tryLock @key, @namespace, @callback it "should set the lock key with an expiry if it is not set", -> - @set.calledWith(@key, "locked", "EX", 30, "NX") + @set.calledWith(@key, "random-lock-value", "EX", 30, "NX") .should.equal true it "should return the callback with true", -> From b847638ed1bf733c30bb71a217de40f4e49e9b45 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 4 May 2018 13:31:26 +0100 Subject: [PATCH 19/87] Clean up comments and callbacks --- .../public/coffee/ide/editor/directives/aceEditor.coffee | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 61760d0117..1f6d7908a0 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -109,23 +109,20 @@ define [ metadataManager = new MetadataManager(scope, editor, element, metadata) autoCompleteManager = new AutoCompleteManager(scope, editor, element, metadataManager, graphics, preamble, files) - # Prevert Ctrl|Cmd-S from triggering save dialog scope.$watch "onSave", (callback) -> if callback? Vim.defineEx 'write', 'w', callback editor.commands.addCommand name: "save", bindKey: win: "Ctrl-S", mac: "Command-S" - exec: () -> - callback() + exec: callback readOnly: true # Not technically 'save', but Ctrl-. recompiles in OL v1 # so maintain compatibility editor.commands.addCommand name: "recompile_v1", bindKey: win: "Ctrl-.", mac: "Ctrl-." - exec: () -> - callback() + exec: callback readOnly: true editor.commands.removeCommand "transposeletters" editor.commands.removeCommand "showSettingsMenu" From 1aadd7d3690d7ac5cff4bdf0f62366881bc0fd21 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 4 May 2018 14:05:20 +0100 Subject: [PATCH 20/87] Configure line height and font family separately for v2 --- .../app/coffee/infrastructure/ExpressLocals.coffee | 2 ++ services/web/app/views/project/editor/editor.pug | 2 ++ services/web/public/coffee/ide.coffee | 2 ++ .../coffee/ide/editor/directives/aceEditor.coffee | 13 ++++++++++--- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/services/web/app/coffee/infrastructure/ExpressLocals.coffee b/services/web/app/coffee/infrastructure/ExpressLocals.coffee index 37cce62ddd..11fc1d157e 100644 --- a/services/web/app/coffee/infrastructure/ExpressLocals.coffee +++ b/services/web/app/coffee/infrastructure/ExpressLocals.coffee @@ -321,5 +321,7 @@ module.exports = (app, webRouter, privateApiRouter, publicApiRouter)-> chatMessageBorderLightness : if isOl then "40%" else "70%" chatMessageBgSaturation : if isOl then "85%" else "60%" chatMessageBgLightness : if isOl then "40%" else "97%" + editorFontFamily : if isOl then '\\"Lucida Console\\", monospace' else null + editorLineHeight : if isOl then 1.6 else null renderAnnouncements : !isOl next() diff --git a/services/web/app/views/project/editor/editor.pug b/services/web/app/views/project/editor/editor.pug index fed1889d79..08fdfa898e 100644 --- a/services/web/app/views/project/editor/editor.pug +++ b/services/web/app/views/project/editor/editor.pug @@ -68,6 +68,8 @@ div.full-size( track-changes= "editor.trackChanges", doc-id="editor.open_doc_id" renderer-data="reviewPanel.rendererData" + font-family="ui.editorFontFamily" + line-height="ui.editorLineHeight" ) != moduleIncludes('editor:body', locals) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 078202655f..053db2396f 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -80,6 +80,8 @@ define [ miniReviewPanelVisible: false chatResizerSizeOpen: window.uiConfig.chatResizerSizeOpen chatResizerSizeClosed: window.uiConfig.chatResizerSizeClosed + editorFontFamily: window.uiConfig.editorFontFamily + editorLineHeight: window.uiConfig.editorLineHeight } $scope.user = window.user diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 97fca8a359..b79681ddcb 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -67,6 +67,8 @@ define [ trackChangesEnabled: "=" docId: "=" rendererData: "=" + lineHeight: "=" + fontFamily: "=" } link: (scope, element, attrs) -> # Don't freak out if we're already in an apply callback @@ -81,9 +83,6 @@ define [ editor = ace.edit(element.find(".ace-editor-body")[0]) editor.$blockScrolling = Infinity - editor.container.style.lineHeight = 1.6 - editor.setOption('fontFamily', '"Lucida Console", monospace') - # auto-insertion of braces, brackets, dollars editor.setOption('behavioursEnabled', scope.autoPairDelimiters || false) editor.setOption('wrapBehavioursEnabled', false) @@ -269,6 +268,14 @@ define [ "font-size": value + "px" }) + scope.$watch "fontFamily", (value) -> + if value? + editor.setOption('fontFamily', value) + + scope.$watch "lineHeight", (value) -> + if value? + editor.container.style.lineHeight = value + scope.$watch "sharejsDoc", (sharejs_doc, old_sharejs_doc) -> if old_sharejs_doc? detachFromAce(old_sharejs_doc) From afd4a10a19342216a58360e525b0c8c74fd3fa0a Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Fri, 4 May 2018 13:43:12 +0100 Subject: [PATCH 21/87] retry lock with exponential backoff --- services/web/app/coffee/infrastructure/LockManager.coffee | 6 +++++- .../infrastructure/LockManager/ReleasingTheLock.coffee | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/infrastructure/LockManager.coffee b/services/web/app/coffee/infrastructure/LockManager.coffee index 60f6d00cc0..b117ce49ea 100644 --- a/services/web/app/coffee/infrastructure/LockManager.coffee +++ b/services/web/app/coffee/infrastructure/LockManager.coffee @@ -13,6 +13,7 @@ COUNT = 0 module.exports = LockManager = LOCK_TEST_INTERVAL: 50 # 50ms between each test of the lock + MAX_TEST_INTERVAL: 1000 # back off to 1s between each test of the lock MAX_LOCK_WAIT_TIME: 10000 # 10s maximum time to spend trying to get the lock REDIS_LOCK_EXPIRY: 30 # seconds. Time until lock auto expires in redis SLOW_EXECUTION_THRESHOLD: 5000 # 5s, if execution takes longer than this then log @@ -69,6 +70,7 @@ module.exports = LockManager = _getLock: (key, namespace, callback = (error, lockValue) ->) -> startTime = Date.now() + testInterval = LockManager.LOCK_TEST_INTERVAL attempts = 0 do attempt = () -> if Date.now() - startTime > LockManager.MAX_LOCK_WAIT_TIME @@ -82,7 +84,9 @@ module.exports = LockManager = metrics.gauge "lock.#{namespace}.get.success.tries", attempts callback(null, lockValue) else - setTimeout attempt, LockManager.LOCK_TEST_INTERVAL + setTimeout attempt, testInterval + # back off when the lock is taken to avoid overloading + testInterval = Math.min(testInterval * 2, LockManager.MAX_TEST_INTERVAL) _releaseLock: (key, lockValue, callback)-> rclient.eval LockManager.unlockScript, 1, key, lockValue, (err, result) -> diff --git a/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee b/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee index 1fbe7b07f4..76747defbb 100644 --- a/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee +++ b/services/web/test/unit/coffee/infrastructure/LockManager/ReleasingTheLock.coffee @@ -17,7 +17,6 @@ describe 'LockManager - releasing the lock', ()-> auth:-> eval:deleteStub - LockManager = SandboxedModule.require(modulePath, requires: mocks) LockManager.unlockScript = "this is the unlock script" From b7be63f3a8aeefba8bad13f74af4b77e625edeb9 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 3 May 2018 17:34:51 +0100 Subject: [PATCH 22/87] Import Overleaf v1 theme from sharelatex/ace --- .../web/public/js/ace-1.2.5/theme-overleaf.js | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 services/web/public/js/ace-1.2.5/theme-overleaf.js diff --git a/services/web/public/js/ace-1.2.5/theme-overleaf.js b/services/web/public/js/ace-1.2.5/theme-overleaf.js new file mode 100644 index 0000000000..85bd3b0737 --- /dev/null +++ b/services/web/public/js/ace-1.2.5/theme-overleaf.js @@ -0,0 +1,72 @@ +ace.define("ace/theme/overleaf",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-overleaf"; +exports.cssText = ".ace-overleaf .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-overleaf .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-overleaf {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-overleaf .ace_cursor {\ +color: black;\ +}\ +.ace-overleaf .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-overleaf.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-overleaf .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-overleaf .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #cc7;\ +}\ +.ace-overleaf .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-overleaf .ace_gutter-active-line {\ +background-color: #dcdcdc;\ +}\ +.ace-overleaf .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-overleaf .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-overleaf .ace_comment {\ +color: #0080FF;\ +font-style: italic;\ +}\ +.ace-overleaf .ace_storage,\ +.ace-overleaf .ace_keyword {\ +color: #3F7F7F;\ +}\ +.ace-overleaf .ace_variable,\ +.ace-overleaf .ace_string {\ +color: #5A5CAD;\ +}\ +"; +exports.$id = "ace/theme/overleaf"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); + (function() { + ace.require(["ace/theme/overleaf"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file From 1278e2da450fffa19f08d3c9208bef6c94e06e22 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 3 May 2018 12:04:44 +0100 Subject: [PATCH 23/87] fix project structure version when deleting folder --- .../Project/ProjectEntityUpdateHandler.coffee | 48 ++++++++++++------- .../ProjectEntityUpdateHandlerTests.coffee | 19 +++++--- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee index ebf34a9acb..faa82e6f37 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee @@ -405,14 +405,37 @@ module.exports = ProjectEntityUpdateHandler = self = DocumentUpdaterHandler.resyncProjectHistory project_id, projectHistoryId, docs, files, callback _cleanUpEntity: (project, entity, entityType, path, userId, callback = (error) ->) -> + self._updateProjectStructure project, entity, entityType, path, userId, (error) -> + return callback(error) if error? + if(entityType.indexOf("file") != -1) + self._cleanUpFile project, entity, path, userId, callback + else if (entityType.indexOf("doc") != -1) + self._cleanUpDoc project, entity, path, userId, callback + else if (entityType.indexOf("folder") != -1) + self._cleanUpFolder project, entity, path, userId, callback + else + callback() + + _updateProjectStructure: (project, entity, entityType, entityPath, userId, callback = (error) ->) -> + # compute the changes to the project structure if(entityType.indexOf("file") != -1) - self._cleanUpFile project, entity, path, userId, callback + changes = oldFiles: [ {file: entity, path: entityPath} ] else if (entityType.indexOf("doc") != -1) - self._cleanUpDoc project, entity, path, userId, callback + changes = oldDocs: [ {doc: entity, path: entityPath} ] else if (entityType.indexOf("folder") != -1) - self._cleanUpFolder project, entity, path, userId, callback - else - callback() + changes = {oldDocs: [], oldFiles: []} + _recurseFolder = (folder, folderPath) -> + for doc in folder.docs + changes.oldDocs.push {doc, path: path.join(folderPath, doc.name)} + for file in folder.fileRefs + changes.oldFiles.push {file, path: path.join(folderPath, file.name)} + for childFolder in folder.folders + _recurseFolder(childFolder, path.join(folderPath, childFolder.name)) + _recurseFolder entity, entityPath + # now send the project structure changes to the docupdater + project_id = project._id.toString() + projectHistoryId = project.overleaf?.history?.id + DocumentUpdaterHandler.updateProjectStructure project_id, projectHistoryId, userId, changes, callback _cleanUpDoc: (project, doc, path, userId, callback = (error) ->) -> project_id = project._id.toString() @@ -429,21 +452,10 @@ module.exports = ProjectEntityUpdateHandler = self = return callback(error) if error? DocumentUpdaterHandler.deleteDoc project_id, doc_id, (error) -> return callback(error) if error? - DocstoreManager.deleteDoc project_id, doc_id, (error) -> - return callback(error) if error? - changes = oldDocs: [ {doc, path} ] - projectHistoryId = project.overleaf?.history?.id - DocumentUpdaterHandler.updateProjectStructure project_id, projectHistoryId, userId, changes, callback + DocstoreManager.deleteDoc project_id, doc_id, callback _cleanUpFile: (project, file, path, userId, callback = (error) ->) -> - ProjectEntityMongoUpdateHandler._insertDeletedFileReference project._id, file, (error) -> - return callback(error) if error? - project_id = project._id.toString() - projectHistoryId = project.overleaf?.history?.id - changes = oldFiles: [ {file, path} ] - # we are now keeping a copy of every file versio so we no longer delete - # the file from the filestore - DocumentUpdaterHandler.updateProjectStructure project_id, projectHistoryId, userId, changes, callback + ProjectEntityMongoUpdateHandler._insertDeletedFileReference project._id, file, callback _cleanUpFolder: (project, folder, folderPath, userId, callback = (error) ->) -> jobs = [] diff --git a/services/web/test/unit/coffee/Project/ProjectEntityUpdateHandlerTests.coffee b/services/web/test/unit/coffee/Project/ProjectEntityUpdateHandlerTests.coffee index 2838db9c56..3a5b7a58bd 100644 --- a/services/web/test/unit/coffee/Project/ProjectEntityUpdateHandlerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectEntityUpdateHandlerTests.coffee @@ -872,6 +872,12 @@ describe 'ProjectEntityUpdateHandler', -> .calledWith(@project, @entity, @path, userId) .should.equal true + it "should should send the update to the doc updater", -> + oldDocs = [ doc: @entity, path: @path ] + @DocumentUpdaterHandler.updateProjectStructure + .calledWith(project_id, projectHistoryId, userId, {oldDocs}) + .should.equal true + describe "a folder", -> beforeEach (done) -> @folder = @@ -905,6 +911,13 @@ describe 'ProjectEntityUpdateHandler', -> .calledWith(@project, @doc2, "/folder/doc-name-2", userId) .should.equal true + it "should should send one update to the doc updater for all docs and files", -> + oldFiles = [ {file: @file2, path: "/folder/file-name-2"}, {file: @file1, path: "/folder/subfolder/file-name-1"} ] + oldDocs = [ {doc: @doc2, path: "/folder/doc-name-2"}, { doc: @doc1, path: "/folder/subfolder/doc-name-1"} ] + @DocumentUpdaterHandler.updateProjectStructure + .calledWith(project_id, projectHistoryId, userId, {oldFiles, oldDocs}) + .should.equal true + describe "_cleanUpDoc", -> beforeEach -> @doc = @@ -941,12 +954,6 @@ describe 'ProjectEntityUpdateHandler', -> .calledWith(project_id, @doc._id.toString()) .should.equal true - it "should should send the update to the doc updater", -> - oldDocs = [ doc: @doc, path: @path ] - @DocumentUpdaterHandler.updateProjectStructure - .calledWith(project_id, projectHistoryId, userId, {oldDocs}) - .should.equal true - it "should call the callback", -> @callback.called.should.equal true From f34ce5b12b3870c67256f0d47b6e95dd3f735c6b Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 8 May 2018 11:19:21 +0100 Subject: [PATCH 24/87] rename _updateProjectStructure to _updateProjectStructureWithDeletedEntity --- .../coffee/Features/Project/ProjectEntityUpdateHandler.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee index faa82e6f37..6853bb1715 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee @@ -405,7 +405,7 @@ module.exports = ProjectEntityUpdateHandler = self = DocumentUpdaterHandler.resyncProjectHistory project_id, projectHistoryId, docs, files, callback _cleanUpEntity: (project, entity, entityType, path, userId, callback = (error) ->) -> - self._updateProjectStructure project, entity, entityType, path, userId, (error) -> + self._updateProjectStructureWithDeletedEntity project, entity, entityType, path, userId, (error) -> return callback(error) if error? if(entityType.indexOf("file") != -1) self._cleanUpFile project, entity, path, userId, callback @@ -416,7 +416,7 @@ module.exports = ProjectEntityUpdateHandler = self = else callback() - _updateProjectStructure: (project, entity, entityType, entityPath, userId, callback = (error) ->) -> + _updateProjectStructureWithDeletedEntity: (project, entity, entityType, entityPath, userId, callback = (error) ->) -> # compute the changes to the project structure if(entityType.indexOf("file") != -1) changes = oldFiles: [ {file: entity, path: entityPath} ] From 2bb2d9615f53c52ebbd1911ecae9d7eaad10953d Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 8 May 2018 11:24:31 +0100 Subject: [PATCH 25/87] added comment about using a project entity iterator --- .../coffee/Features/Project/ProjectEntityUpdateHandler.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee index 6853bb1715..27ead91841 100644 --- a/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEntityUpdateHandler.coffee @@ -416,6 +416,10 @@ module.exports = ProjectEntityUpdateHandler = self = else callback() + # Note: the _cleanUpEntity code and _updateProjectStructureWithDeletedEntity + # methods both need to recursively iterate over the entities in folder. + # These are currently using separate implementations of the recursion. In + # future, these could be simplified using a common project entity iterator. _updateProjectStructureWithDeletedEntity: (project, entity, entityType, entityPath, userId, callback = (error) ->) -> # compute the changes to the project structure if(entityType.indexOf("file") != -1) From c131dcd84ddfc611b391847ff63526a545724cab Mon Sep 17 00:00:00 2001 From: Nate Stemen Date: Tue, 8 May 2018 10:15:55 -0400 Subject: [PATCH 26/87] remove old test instructions --- services/web/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/services/web/README.md b/services/web/README.md index 51f73d02ec..811e7fbd33 100644 --- a/services/web/README.md +++ b/services/web/README.md @@ -43,7 +43,6 @@ Unit tests can be run in the `test_unit` container defined in `docker-compose.te The makefile contains a short cut to run these: ``` -make install # Only needs running once, or when npm packages are updated make unit_test ``` From 9ccdf073c443bd93f188dc4f86f6527d24e566d3 Mon Sep 17 00:00:00 2001 From: Hayden Faulds Date: Thu, 10 May 2018 11:39:23 +0100 Subject: [PATCH 27/87] accept attributes rather than projectHistoryId to ProjectCreationHandler --- .../Project/ProjectCreationHandler.coffee | 28 +++++++++++-------- .../ProjectCreationHandlerTests.coffee | 6 +++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectCreationHandler.coffee b/services/web/app/coffee/Features/Project/ProjectCreationHandler.coffee index 0b66b38ad6..529164a49e 100644 --- a/services/web/app/coffee/Features/Project/ProjectCreationHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectCreationHandler.coffee @@ -16,38 +16,42 @@ AnalyticsManger = require("../Analytics/AnalyticsManager") module.exports = ProjectCreationHandler = - createBlankProject : (owner_id, projectName, projectHistoryId, callback = (error, project) ->)-> + createBlankProject : (owner_id, projectName, attributes, callback = (error, project) ->)-> metrics.inc("project-creation") if arguments.length == 3 - callback = projectHistoryId - projectHistoryId = null + callback = attributes + attributes = null ProjectDetailsHandler.validateProjectName projectName, (error) -> return callback(error) if error? logger.log owner_id:owner_id, projectName:projectName, "creating blank project" - if projectHistoryId? - ProjectCreationHandler._createBlankProject owner_id, projectName, projectHistoryId, (error, project) -> + if attributes? + ProjectCreationHandler._createBlankProject owner_id, projectName, attributes, (error, project) -> return callback(error) if error? AnalyticsManger.recordEvent( - owner_id, 'project-imported', { projectId: project._id, projectHistoryId: projectHistoryId } + owner_id, 'project-imported', { projectId: project._id, attributes: attributes } ) callback(error, project) else HistoryManager.initializeProject (error, history) -> return callback(error) if error? - ProjectCreationHandler._createBlankProject owner_id, projectName, history?.overleaf_id, (error, project) -> + attributes = overleaf: history: id: history?.overleaf_id + ProjectCreationHandler._createBlankProject owner_id, projectName, attributes, (error, project) -> return callback(error) if error? AnalyticsManger.recordEvent( owner_id, 'project-created', { projectId: project._id } ) callback(error, project) - _createBlankProject : (owner_id, projectName, projectHistoryId, callback = (error, project) ->)-> + _createBlankProject : (owner_id, projectName, attributes, callback = (error, project) ->)-> rootFolder = new Folder {'name':'rootFolder'} - project = new Project - owner_ref : new ObjectId(owner_id) - name : projectName - project.overleaf.history.id = projectHistoryId + + attributes.owner_ref = new ObjectId(owner_id) + attributes.name = projectName + project = new Project attributes + + Object.assign(project, attributes) + if Settings.apis?.project_history?.displayHistoryForNewProjects project.overleaf.history.display = true if Settings.currentImageName? diff --git a/services/web/test/unit/coffee/Project/ProjectCreationHandlerTests.coffee b/services/web/test/unit/coffee/Project/ProjectCreationHandlerTests.coffee index 042dc34d09..6d86545622 100644 --- a/services/web/test/unit/coffee/Project/ProjectCreationHandlerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectCreationHandlerTests.coffee @@ -98,7 +98,11 @@ describe 'ProjectCreationHandler', -> it "should set the overleaf id if overleaf id provided", (done)-> overleaf_id = 2345 - @handler.createBlankProject ownerId, projectName, overleaf_id, (err, project)-> + attributes = + overleaf: + history: + id: overleaf_id + @handler.createBlankProject ownerId, projectName, attributes, (err, project)-> project.overleaf.history.id.should.equal overleaf_id done() From dee96920b06ba0be360308e58be98dba778bfe9f Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 10 May 2018 18:03:54 +0100 Subject: [PATCH 28/87] Allow font family and line height to be user configurable --- .../Features/Project/ProjectController.coffee | 2 ++ .../Features/User/UserController.coffee | 5 +++++ .../infrastructure/ExpressLocals.coffee | 7 +++++-- services/web/app/coffee/models/User.coffee | 18 +++++++++-------- .../web/app/views/project/editor/editor.pug | 4 ++-- .../app/views/project/editor/left-menu.pug | 20 +++++++++++++++++++ services/web/public/coffee/ide.coffee | 4 ++-- .../ide/editor/directives/aceEditor.coffee | 19 ++++++++++++++++-- .../aceEditor/undo/UndoManager.coffee | 10 ++++++++-- .../controllers/SettingsController.coffee | 14 +++++++++++++ 10 files changed, 85 insertions(+), 18 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 1f9eb5f288..f2c92efcb3 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -299,6 +299,8 @@ module.exports = ProjectController = autoPairDelimiters: user.ace.autoPairDelimiters pdfViewer : user.ace.pdfViewer syntaxValidation: user.ace.syntaxValidation + fontFamily: user.ace.fontFamily + lineHeight: user.ace.lineHeight } trackChangesState: project.track_changes privilegeLevel: privilegeLevel diff --git a/services/web/app/coffee/Features/User/UserController.coffee b/services/web/app/coffee/Features/User/UserController.coffee index 7dc82c1a7b..ccbd0a86f1 100644 --- a/services/web/app/coffee/Features/User/UserController.coffee +++ b/services/web/app/coffee/Features/User/UserController.coffee @@ -81,6 +81,11 @@ module.exports = UserController = user.ace.pdfViewer = req.body.pdfViewer if req.body.syntaxValidation? user.ace.syntaxValidation = req.body.syntaxValidation + if req.body.fontFamily? + user.ace.fontFamily = req.body.fontFamily + if req.body.lineHeight? + user.ace.lineHeight = req.body.lineHeight + user.save (err)-> newEmail = req.body.email?.trim().toLowerCase() if !newEmail? or newEmail == user.email or req.externalAuthenticationSystemUsed() diff --git a/services/web/app/coffee/infrastructure/ExpressLocals.coffee b/services/web/app/coffee/infrastructure/ExpressLocals.coffee index 11fc1d157e..6943a79cb2 100644 --- a/services/web/app/coffee/infrastructure/ExpressLocals.coffee +++ b/services/web/app/coffee/infrastructure/ExpressLocals.coffee @@ -183,6 +183,9 @@ module.exports = (app, webRouter, privateApiRouter, publicApiRouter)-> # Don't include the query string parameters, otherwise Google # treats ?nocdn=true as the canonical version res.locals.currentUrl = Url.parse(req.originalUrl).pathname + res.locals.capitalize = (string) -> + return "" if string.length == 0 + return string.charAt(0).toUpperCase() + string.slice(1) next() webRouter.use (req, res, next)-> @@ -321,7 +324,7 @@ module.exports = (app, webRouter, privateApiRouter, publicApiRouter)-> chatMessageBorderLightness : if isOl then "40%" else "70%" chatMessageBgSaturation : if isOl then "85%" else "60%" chatMessageBgLightness : if isOl then "40%" else "97%" - editorFontFamily : if isOl then '\\"Lucida Console\\", monospace' else null - editorLineHeight : if isOl then 1.6 else null + defaultFontFamily : if isOl then 'lucida' else 'monaco' + defaultLineHeight : if isOl then 'normal' else 'compact' renderAnnouncements : !isOl next() diff --git a/services/web/app/coffee/models/User.coffee b/services/web/app/coffee/models/User.coffee index d3916ab4b0..009f582b2a 100644 --- a/services/web/app/coffee/models/User.coffee +++ b/services/web/app/coffee/models/User.coffee @@ -20,14 +20,16 @@ UserSchema = new Schema loginCount : {type : Number, default: 0} holdingAccount : {type : Boolean, default: false} ace : { - mode : {type : String, default: 'none'} - theme : {type : String, default: 'textmate'} - fontSize : {type : Number, default:'12'} - autoComplete: {type : Boolean, default: true} - autoPairDelimiters: {type : Boolean, default: true} - spellCheckLanguage : {type : String, default: "en"} - pdfViewer : {type : String, default: "pdfjs"} - syntaxValidation : {type : Boolean} + mode : {type : String, default: 'none'} + theme : {type : String, default: 'textmate'} + fontSize : {type : Number, default:'12'} + autoComplete : {type : Boolean, default: true} + autoPairDelimiters : {type : Boolean, default: true} + spellCheckLanguage : {type : String, default: "en"} + pdfViewer : {type : String, default: "pdfjs"} + syntaxValidation : {type : Boolean} + fontFamily : {type : String} + lineHeight : {type : String} } features : { collaborators: { type:Number, default: Settings.defaultFeatures.collaborators } diff --git a/services/web/app/views/project/editor/editor.pug b/services/web/app/views/project/editor/editor.pug index 084216a02e..3cac3a9490 100644 --- a/services/web/app/views/project/editor/editor.pug +++ b/services/web/app/views/project/editor/editor.pug @@ -69,8 +69,8 @@ div.full-size( track-changes= "editor.trackChanges", doc-id="editor.open_doc_id" renderer-data="reviewPanel.rendererData" - font-family="ui.editorFontFamily" - line-height="ui.editorLineHeight" + font-family="settings.fontFamily || ui.defaultFontFamily" + line-height="settings.lineHeight || ui.defaultLineHeight" ) != moduleIncludes('editor:body', locals) diff --git a/services/web/app/views/project/editor/left-menu.pug b/services/web/app/views/project/editor/left-menu.pug index bf7b9ba331..8a0018f26f 100644 --- a/services/web/app/views/project/editor/left-menu.pug +++ b/services/web/app/views/project/editor/left-menu.pug @@ -150,6 +150,26 @@ aside#left-menu.full-size( each size in ['10','11','12','13','14','16','20','24'] option(value=size) #{size}px + .form-controls + label(for="fontFamily") #{translate("font_family")} + select( + name="fontFamily" + ng-model="settings.fontFamily" + ) + option(value="", disabled) Default + each fontFamily in ['monaco', 'lucida'] + option(value=fontFamily) #{capitalize(fontFamily)} + + .form-controls + label(for="lineHeight") #{translate("line_height")} + select( + name="lineHeight" + ng-model="settings.lineHeight" + ) + option(value="", disabled) Default + each lineHeight in ['compact', 'normal', 'wide'] + option(value=lineHeight) #{translate(lineHeight)} + .form-controls label(for="pdfViewer") #{translate("pdf_viewer")} select( diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index 053db2396f..7c8602eb76 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -80,8 +80,8 @@ define [ miniReviewPanelVisible: false chatResizerSizeOpen: window.uiConfig.chatResizerSizeOpen chatResizerSizeClosed: window.uiConfig.chatResizerSizeClosed - editorFontFamily: window.uiConfig.editorFontFamily - editorLineHeight: window.uiConfig.editorLineHeight + defaultFontFamily: window.uiConfig.defaultFontFamily + defaultLineHeight: window.uiConfig.defaultLineHeight } $scope.user = window.user diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index c15bc03216..ef3c5b20f8 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -283,11 +283,26 @@ define [ scope.$watch "fontFamily", (value) -> if value? - editor.setOption('fontFamily', value) + switch value + when 'monaco' + editor.setOption('fontFamily', '"Monaco", "Menlo", "Ubuntu Mono", "Consolas", "source-code-pro", monospace') + when 'lucida' + editor.setOption('fontFamily', '"Lucida Console", monospace') + else + editor.setOption('fontFamily', null) scope.$watch "lineHeight", (value) -> if value? - editor.container.style.lineHeight = value + switch value + when 'compact' + editor.container.style.lineHeight = 1.33 + when 'normal' + editor.container.style.lineHeight = 1.6 + when 'wide' + editor.container.style.lineHeight = 2 + else + editor.container.style.lineHeight = 1.6 + editor.renderer.updateFontSize() scope.$watch "sharejsDoc", (sharejs_doc, old_sharejs_doc) -> if old_sharejs_doc? diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee index 1f53fffe52..918413d609 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee @@ -14,9 +14,14 @@ define [ @editor.on "changeSession", (e) => @reset() - @session = e.session + # @session = e.session e.session.setUndoManager(@) + addSession: (session) -> + @session = session + + addSelection: () -> + showUndoConflictWarning: () -> @$scope.$apply () => @$scope.undo.show_remote_warning = true @@ -31,7 +36,8 @@ define [ @undoStack = [] @redoStack = [] - execute: (options) -> + add: (delta, allowMerge, session) -> + return if @firstUpdate # The first update we receive is Ace setting the document, which we should # ignore diff --git a/services/web/public/coffee/ide/settings/controllers/SettingsController.coffee b/services/web/public/coffee/ide/settings/controllers/SettingsController.coffee index df65a2f721..9920372aab 100644 --- a/services/web/public/coffee/ide/settings/controllers/SettingsController.coffee +++ b/services/web/public/coffee/ide/settings/controllers/SettingsController.coffee @@ -8,6 +8,12 @@ define [ if $scope.settings.pdfViewer not in ["pdfjs", "native"] $scope.settings.pdfViewer = "pdfjs" + if $scope.settings.fontFamily? and $scope.settings.fontFamily not in ["monaco", "lucida"] + delete $scope.settings.fontFamily + + if $scope.settings.lineHeight? and $scope.settings.lineHeight not in ["compact", "normal", "wide"] + delete $scope.settings.lineHeight + $scope.fontSizeAsStr = (newVal) -> if newVal? $scope.settings.fontSize = newVal @@ -41,6 +47,14 @@ define [ if syntaxValidation != oldSyntaxValidation settings.saveSettings({syntaxValidation: syntaxValidation}) + $scope.$watch "settings.fontFamily", (fontFamily, oldFontFamily) => + if fontFamily != oldFontFamily + settings.saveSettings({fontFamily: fontFamily}) + + $scope.$watch "settings.lineHeight", (lineHeight, oldLineHeight) => + if lineHeight != oldLineHeight + settings.saveSettings({lineHeight: lineHeight}) + $scope.$watch "project.spellCheckLanguage", (language, oldLanguage) => return if @ignoreUpdates if oldLanguage? and language != oldLanguage From 331f9ea9df72a7a0e1630d8263ff7262da0c9f1f Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 10 May 2018 18:04:30 +0100 Subject: [PATCH 29/87] Translate default --- services/web/app/views/project/editor/left-menu.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/app/views/project/editor/left-menu.pug b/services/web/app/views/project/editor/left-menu.pug index 8a0018f26f..ed6ef85b44 100644 --- a/services/web/app/views/project/editor/left-menu.pug +++ b/services/web/app/views/project/editor/left-menu.pug @@ -156,7 +156,7 @@ aside#left-menu.full-size( name="fontFamily" ng-model="settings.fontFamily" ) - option(value="", disabled) Default + option(value="", disabled) #{translate("default")} each fontFamily in ['monaco', 'lucida'] option(value=fontFamily) #{capitalize(fontFamily)} @@ -166,7 +166,7 @@ aside#left-menu.full-size( name="lineHeight" ng-model="settings.lineHeight" ) - option(value="", disabled) Default + option(value="", disabled) #{translate("default")} each lineHeight in ['compact', 'normal', 'wide'] option(value=lineHeight) #{translate(lineHeight)} From d108b11bc02cc5d3cce592661b86a32ab43bd6fa Mon Sep 17 00:00:00 2001 From: Nate Stemen Date: Mon, 7 May 2018 17:25:29 -0400 Subject: [PATCH 30/87] Add latexmkrc in FileTypeManager --- .../Features/Uploads/FileTypeManager.coffee | 9 +++------ .../coffee/Uploads/FileTypeManagerTests.coffee | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/services/web/app/coffee/Features/Uploads/FileTypeManager.coffee b/services/web/app/coffee/Features/Uploads/FileTypeManager.coffee index 918f66df7b..524c6915e0 100644 --- a/services/web/app/coffee/Features/Uploads/FileTypeManager.coffee +++ b/services/web/app/coffee/Features/Uploads/FileTypeManager.coffee @@ -3,7 +3,7 @@ Path = require("path") module.exports = FileTypeManager = TEXT_EXTENSIONS : [ - "tex", "latex", "sty", "cls", "bst", "bib", "bibtex", "txt", "tikz", "rtex", "md", "asy" + "tex", "latex", "sty", "cls", "bst", "bib", "bibtex", "txt", "tikz", "rtex", "md", "asy", "latexmkrc" ] IGNORE_EXTENSIONS : [ @@ -34,7 +34,7 @@ module.exports = FileTypeManager = extension = parts.slice(-1)[0] if extension? extension = extension.toLowerCase() - binaryFile = (@TEXT_EXTENSIONS.indexOf(extension) == -1 or parts.length <= 1) + binaryFile = (@TEXT_EXTENSIONS.indexOf(extension) == -1 or parts.length <= 1) and parts[0] != 'latexmkrc' if binaryFile return callback null, true @@ -52,13 +52,10 @@ module.exports = FileTypeManager = if extension? extension = extension.toLowerCase() ignore = false - if name[0] == "." + if name[0] == "." and extension != 'latexmkrc' ignore = true if @IGNORE_EXTENSIONS.indexOf(extension) != -1 ignore = true if @IGNORE_FILENAMES.indexOf(name) != -1 ignore = true callback null, ignore - - - diff --git a/services/web/test/unit/coffee/Uploads/FileTypeManagerTests.coffee b/services/web/test/unit/coffee/Uploads/FileTypeManagerTests.coffee index c6fdf64829..be456c74a5 100644 --- a/services/web/test/unit/coffee/Uploads/FileTypeManagerTests.coffee +++ b/services/web/test/unit/coffee/Uploads/FileTypeManagerTests.coffee @@ -39,7 +39,7 @@ describe "FileTypeManager", -> beforeEach -> @stat = { size: 100 } @fs.stat = sinon.stub().callsArgWith(1, null, @stat) - + it "should return .tex files as not binary", -> @FileTypeManager.isBinary "file.tex", "/path/on/disk", (error, binary) -> binary.should.equal false @@ -80,10 +80,18 @@ describe "FileTypeManager", -> @FileTypeManager.isBinary "tex", "/path/on/disk", (error, binary) -> binary.should.equal true + it "should return .latexmkrc file as not binary", -> + @FileTypeManager.isBinary ".latexmkrc", "/path/on/disk", (error, binary) -> + binary.should.equal false + + it "should return latexmkrc file as not binary", -> + @FileTypeManager.isBinary "latexmkrc", "/path/on/disk", (error, binary) -> + binary.should.equal false + it "should ignore the case of an extension", -> @FileTypeManager.isBinary "file.TEX", "/path/on/disk", (error, binary) -> binary.should.equal false - + it "should return large text files as binary", -> @stat.size = 2 * 1024 * 1024 # 2Mb @FileTypeManager.isBinary "file.tex", "/path/on/disk", (error, binary) -> @@ -98,6 +106,10 @@ describe "FileTypeManager", -> @FileTypeManager.shouldIgnore "path/.git", (error, ignore) -> ignore.should.equal true + it "should not ignore .latexmkrc dotfile", -> + @FileTypeManager.shouldIgnore "path/.latexmkrc", (error, ignore) -> + ignore.should.equal false + it "should ignore __MACOSX", -> @FileTypeManager.shouldIgnore "path/__MACOSX", (error, ignore) -> ignore.should.equal true @@ -109,5 +121,3 @@ describe "FileTypeManager", -> it "should ignore the case of the extension", -> @FileTypeManager.shouldIgnore "file.AUX", (error, ignore) -> ignore.should.equal true - - From 049fe6e176f29be592d43a5232fd4ff9899b15c3 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 11 May 2018 10:24:58 +0100 Subject: [PATCH 31/87] Update bracket border colour --- services/web/public/js/ace-1.2.5/theme-overleaf.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/web/public/js/ace-1.2.5/theme-overleaf.js b/services/web/public/js/ace-1.2.5/theme-overleaf.js index 85bd3b0737..f2162a542c 100644 --- a/services/web/public/js/ace-1.2.5/theme-overleaf.js +++ b/services/web/public/js/ace-1.2.5/theme-overleaf.js @@ -28,8 +28,7 @@ box-shadow: 0 0 3px 0px white;\ background: rgb(252, 255, 0);\ }\ .ace-overleaf .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #cc7;\ +border: 1px solid #5A5CAD;\ }\ .ace-overleaf .ace_marker-layer .ace_active-line {\ background: rgba(0, 0, 0, 0.07);\ From 64061f007984672e9504171fdbb896167a9b3870 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 11 May 2018 10:11:27 +0100 Subject: [PATCH 32/87] Switch name of deleted projects to archived projects to reduce confusion --- services/web/app/views/project/list/side-bar.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/views/project/list/side-bar.pug b/services/web/app/views/project/list/side-bar.pug index d01938b72d..e342b792a5 100644 --- a/services/web/app/views/project/list/side-bar.pug +++ b/services/web/app/views/project/list/side-bar.pug @@ -41,7 +41,7 @@ li(ng-class="{active: (filter == 'shared')}", ng-click="filterProjects('shared')") a(href) #{translate("shared_with_you")} li(ng-class="{active: (filter == 'archived')}", ng-click="filterProjects('archived')") - a(href) #{translate("deleted_projects")} + a(href) #{settings.overleaf ? translate("archived_projects") : translate("deleted_projects")} if isShowingV1Projects li(ng-class="{active: (filter == 'v1')}", ng-click="filterProjects('v1')") a(href) #{translate("v1_projects")} From df9294816e95eeb8af4e3748f239eb7997e7e5be Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 11 May 2018 10:10:47 +0100 Subject: [PATCH 33/87] Show archive or leave icon based on selected projects --- services/web/app/views/project/list/project-list.pug | 6 ++++-- .../web/public/coffee/main/project-list/project-list.coffee | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/services/web/app/views/project/list/project-list.pug b/services/web/app/views/project/list/project-list.pug index 240f62bd54..df3c2bf681 100644 --- a/services/web/app/views/project/list/project-list.pug +++ b/services/web/app/views/project/list/project-list.pug @@ -32,14 +32,16 @@ ng-click="downloadSelectedProjects()" ) i.fa.fa-cloud-download + - var archiveButtonString = settings.overleaf ? translate("archive") : translate("delete") + - var archiveButtonIcon = settings.overleaf ? "fa-inbox" : "fa-trash-o" a.btn.btn-default( href, - tooltip=translate('delete'), + tooltip=`{{ isArchiveableProjectSelected ? '${archiveButtonString}' : '${translate("leave")}' }}`, tooltip-placement="bottom", tooltip-append-to-body="true", ng-click="openArchiveProjectsModal()" ) - i.fa.fa-trash-o + i.fa(ng-class=`isArchiveableProjectSelected ? '${archiveButtonIcon}' : 'fa-sign-out'`) .btn-group.dropdown(ng-hide="selectedProjects.length < 1", dropdown) a.btn.btn-default.dropdown-toggle( diff --git a/services/web/public/coffee/main/project-list/project-list.coffee b/services/web/public/coffee/main/project-list/project-list.coffee index 5880129294..36520d2cc7 100644 --- a/services/web/public/coffee/main/project-list/project-list.coffee +++ b/services/web/public/coffee/main/project-list/project-list.coffee @@ -8,6 +8,7 @@ define [ $scope.notifications = window.data.notifications $scope.allSelected = false $scope.selectedProjects = [] + $scope.isArchiveableProjectSelected = false $scope.filter = "all" $scope.predicate = "lastUpdated" $scope.nUntagged = 0 @@ -85,6 +86,8 @@ define [ $scope.updateSelectedProjects = () -> $scope.selectedProjects = $scope.projects.filter (project) -> project.selected + $scope.isArchiveableProjectSelected = $scope.selectedProjects.some (project) -> + window.user_id == project.owner._id $scope.getSelectedProjects = () -> $scope.selectedProjects From d1756436e83dc4e47ad278b2e8d9e2b5a956e1e4 Mon Sep 17 00:00:00 2001 From: hugh-obrien Date: Fri, 11 May 2018 15:34:22 +0100 Subject: [PATCH 34/87] compile react in production mode --- services/web/Jenkinsfile | 2 +- services/web/webpack.config.js | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/services/web/Jenkinsfile b/services/web/Jenkinsfile index 7953aa0dbc..7b44d70315 100644 --- a/services/web/Jenkinsfile +++ b/services/web/Jenkinsfile @@ -101,7 +101,7 @@ pipeline { } } steps { - sh 'make minify' + sh 'WEBPACK_ENV=production make minify' } } diff --git a/services/web/webpack.config.js b/services/web/webpack.config.js index da0dc8257e..95f3fe5f9e 100644 --- a/services/web/webpack.config.js +++ b/services/web/webpack.config.js @@ -1,7 +1,9 @@ const fs = require('fs') const path = require('path') +const webpack = require('webpack') const MODULES_PATH = path.join(__dirname, '/modules') +const webpackENV = process.env.WEBPACK_ENV || 'development' // Generate a hash of entry points, including modules const entryPoints = {} @@ -63,7 +65,16 @@ module.exports = { }] }, - // TODO - // plugins: {} + plugins: [ + new webpack.DefinePlugin({ + // Swaps out checks for NODE_ENV with the env. This is used by various + // libs to enable dev-only features. These checks then become something + // like `if ('production' == 'production')`. Minification will then strip + // the dev-only code from the bundle + 'process.env': { + NODE_ENV: JSON.stringify(webpackENV) + }, + }) + ] } From ed7b68169e70b08a3a3972d89983a363e921b337 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 11 May 2018 17:05:39 +0100 Subject: [PATCH 35/87] Revert accidental dev changes to UndoManager --- .../directives/aceEditor/undo/UndoManager.coffee | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee index 918413d609..1f53fffe52 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee @@ -14,14 +14,9 @@ define [ @editor.on "changeSession", (e) => @reset() - # @session = e.session + @session = e.session e.session.setUndoManager(@) - addSession: (session) -> - @session = session - - addSelection: () -> - showUndoConflictWarning: () -> @$scope.$apply () => @$scope.undo.show_remote_warning = true @@ -36,8 +31,7 @@ define [ @undoStack = [] @redoStack = [] - add: (delta, allowMerge, session) -> - return + execute: (options) -> if @firstUpdate # The first update we receive is Ace setting the document, which we should # ignore From 58b5d67bdd619e150fdcac3971108916ebc5b8db Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 14 May 2018 10:29:42 +0100 Subject: [PATCH 36/87] Enable the v2 banner for everyone if showV2Banner is set --- services/web/app/coffee/infrastructure/Features.coffee | 2 ++ services/web/app/views/project/list/notifications.pug | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/services/web/app/coffee/infrastructure/Features.coffee b/services/web/app/coffee/infrastructure/Features.coffee index 519cfda6da..b1899e38bc 100644 --- a/services/web/app/coffee/infrastructure/Features.coffee +++ b/services/web/app/coffee/infrastructure/Features.coffee @@ -14,6 +14,8 @@ module.exports = Features = return Settings.enableGithubSync when 'v1-return-message' return Settings.accountMerge? and Settings.overleaf? + when 'v2-banner' + return Settings.showV2Banner when 'custom-togglers' return Settings.overleaf? else diff --git a/services/web/app/views/project/list/notifications.pug b/services/web/app/views/project/list/notifications.pug index f173555e1c..ee004039fc 100644 --- a/services/web/app/views/project/list/notifications.pug +++ b/services/web/app/views/project/list/notifications.pug @@ -1,4 +1,4 @@ -if (user.awareOfV2 && !settings.overleaf) +if hasFeature('v2-banner') .userNotifications ul.list-unstyled.notifications-list(ng-controller="OverleafV2NotificationController", ng-show="visible") li.notification_entry From 43d00a2e5f50ff40f9560bfc265b6e72a9296469 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Mon, 14 May 2018 11:31:59 +0100 Subject: [PATCH 37/87] Account for the new `referencesSearch` flag when deciding to do fullIndex --- .../Features/References/ReferencesHandler.coffee | 3 ++- .../coffee/References/ReferencesHandlerTests.coffee | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/References/ReferencesHandler.coffee b/services/web/app/coffee/Features/References/ReferencesHandler.coffee index 3ceeab93f8..8728896631 100644 --- a/services/web/app/coffee/Features/References/ReferencesHandler.coffee +++ b/services/web/app/coffee/Features/References/ReferencesHandler.coffee @@ -46,7 +46,8 @@ module.exports = ReferencesHandler = _isFullIndex: (project, callback = (err, result) ->) -> UserGetter.getUser project.owner_ref, { features: true }, (err, owner) -> return callback(err) if err? - callback(null, owner?.features?.references == true) + features = owner?.features + callback(null, features?.references == true || features?.referencesSearch == true) indexAll: (projectId, callback=(err, data)->) -> ProjectGetter.getProject projectId, {rootFolder: true, owner_ref: 1}, (err, project) -> diff --git a/services/web/test/unit/coffee/References/ReferencesHandlerTests.coffee b/services/web/test/unit/coffee/References/ReferencesHandlerTests.coffee index c69cb3ee0a..9ca565b24d 100644 --- a/services/web/test/unit/coffee/References/ReferencesHandlerTests.coffee +++ b/services/web/test/unit/coffee/References/ReferencesHandlerTests.coffee @@ -385,3 +385,13 @@ describe 'ReferencesHandler', -> @call (err, isFullIndex) => expect(err).to.equal null expect(isFullIndex).to.equal false + + describe 'with referencesSearch', -> + + beforeEach -> + @owner.features = {referencesSearch: true, references: false} + + it 'should return true', -> + @call (err, isFullIndex) => + expect(err).to.equal null + expect(isFullIndex).to.equal true From 66846cc68c4847434157ea57e4acdcaca4b88bdc Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 15 May 2018 10:17:04 +0100 Subject: [PATCH 38/87] Put the compile timeout upgrade behind an enableSubscriptions flag --- services/web/app/views/project/editor/pdf.pug | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index a874a0b88b..26de2f35b1 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -371,40 +371,40 @@ div.full-size.pdf(ng-controller="PdfController") a.text-info(href="https://www.sharelatex.com/learn/Debugging_Compilation_timeout_errors", target="_blank") | #{translate("learn_how_to_make_documents_compile_quickly")} - .alert.alert-success(ng-show="pdf.timedout && !hasPremiumCompile") - p(ng-if="project.owner._id == user.id") - strong #{translate("upgrade_for_faster_compiles")} - p(ng-if="project.owner._id != user.id") - strong #{translate("ask_proj_owner_to_upgrade_for_faster_compiles")} - p #{translate("free_accounts_have_timeout_upgrade_to_increase")} - p Plus: - div - ul.list-unstyled - li - i.fa.fa-check   - | #{translate("unlimited_projects")} - li - i.fa.fa-check   - | #{translate("collabs_per_proj", {collabcount:'Multiple'})} - li - i.fa.fa-check   - | #{translate("full_doc_history")} - li - i.fa.fa-check   - | #{translate("sync_to_dropbox")} - li - i.fa.fa-check   - | #{translate("sync_to_github")} - li - i.fa.fa-check   - |#{translate("compile_larger_projects")} - p(ng-controller="FreeTrialModalController", ng-if="project.owner._id == user.id") - a.btn.btn-success.row-spaced-small( - href - ng-class="buttonClass" - ng-click="startFreeTrial('compile-timeout')" - ) #{translate("start_free_trial")} - + if settings.enableSubscriptions + .alert.alert-success(ng-show="pdf.timedout && !hasPremiumCompile") + p(ng-if="project.owner._id == user.id") + strong #{translate("upgrade_for_faster_compiles")} + p(ng-if="project.owner._id != user.id") + strong #{translate("ask_proj_owner_to_upgrade_for_faster_compiles")} + p #{translate("free_accounts_have_timeout_upgrade_to_increase")} + p Plus: + div + ul.list-unstyled + li + i.fa.fa-check   + | #{translate("unlimited_projects")} + li + i.fa.fa-check   + | #{translate("collabs_per_proj", {collabcount:'Multiple'})} + li + i.fa.fa-check   + | #{translate("full_doc_history")} + li + i.fa.fa-check   + | #{translate("sync_to_dropbox")} + li + i.fa.fa-check   + | #{translate("sync_to_github")} + li + i.fa.fa-check   + |#{translate("compile_larger_projects")} + p(ng-controller="FreeTrialModalController", ng-if="project.owner._id == user.id") + a.btn.btn-success.row-spaced-small( + href + ng-class="buttonClass" + ng-click="startFreeTrial('compile-timeout')" + ) #{translate("start_free_trial")} .alert.alert-danger(ng-show="pdf.autoCompileDisabled") p From b9c479c24553b95e6002774c5dbbecc2aa90c499 Mon Sep 17 00:00:00 2001 From: Michael Mazour Date: Tue, 20 Mar 2018 11:00:37 +0000 Subject: [PATCH 39/87] Update README description of acceptance tests. --- services/web/README.md | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/services/web/README.md b/services/web/README.md index 811e7fbd33..7c8cbf0155 100644 --- a/services/web/README.md +++ b/services/web/README.md @@ -3,11 +3,11 @@ web-sharelatex web-sharelatex is the front-end web service of the open-source web-based collaborative LaTeX editor, [ShareLaTeX](https://www.sharelatex.com). -It serves all the HTML pages, CSS and javascript to the client. web-sharelatex also contains +It serves all the HTML pages, CSS and javascript to the client. web-sharelatex also contains a lot of logic around creating and editing projects, and account management. -The rest of the ShareLaTeX stack, along with information about contributing can be found in the +The rest of the ShareLaTeX stack, along with information about contributing can be found in the [sharelatex/sharelatex](https://github.com/sharelatex/sharelatex) repository. Build process @@ -20,7 +20,7 @@ Image processing tasks are commented out in the gruntfile and the needed package New Docker-based build process ------------------------------ -Note that the Grunt workflow from above should still work, but we are transitioning to a +Note that the Grunt workflow from above should still work, but we are transitioning to a Docker based testing workflow, which is documented below: ### Running the app @@ -59,19 +59,18 @@ Acceptance tests are run against a live service, which runs in the `acceptance_t To run the tests out-of-the-box, the makefile defines: ``` -make install # Only needs running once, or when npm packages are updated -make acceptance_test +make test_acceptance ``` However, during development it is often useful to leave the service running for rapid iteration on the acceptance tests. This can be done with: ``` -make acceptance_test_start_service -make acceptance_test_run # Run as many times as needed during development -make acceptance_test_stop_service +make test_acceptance_app_start_service +make test_acceptance_app_run # Run as many times as needed during development +make test_acceptance_app_stop_service ``` -`make acceptance_test` just runs these three commands in sequence. +`make test_acceptance` just runs these three commands in sequence and then runs `make test_acceptance_modules` which performs the tests for each module in the `modules` directory. (Note that there is not currently an equivalent to the `-start` / `-run` x _n_ / `-stop` series for modules.) During development it is often useful to only run a subset of tests, which can be configured with arguments to the mocha CLI: @@ -111,12 +110,3 @@ We gratefully acknowledge [IconShock](http://www.iconshock.com) for use of the i in the `public/img/iconshock` directory found via [findicons.com](http://findicons.com/icon/498089/height?id=526085#) - -## Acceptance Tests - -To run the Acceptance tests: - -- set `allowPublicAccess` to true, either in the configuration file, - or by setting the environment variable `SHARELATEX_ALLOW_PUBLIC_ACCESS` to `true` -- start the server (`grunt`) -- in a separate terminal, run `grunt test:acceptance` From fe75936ff708da45014c31a34f82af9ade28d0a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Fri, 11 May 2018 09:56:54 +0100 Subject: [PATCH 40/87] Add dependencies needed for metrics app --- services/web/npm-shrinkwrap.json | 8514 +----------------------------- services/web/package.json | 10 +- 2 files changed, 99 insertions(+), 8425 deletions(-) diff --git a/services/web/npm-shrinkwrap.json b/services/web/npm-shrinkwrap.json index b753fb0ffb..1f808d6441 100644 --- a/services/web/npm-shrinkwrap.json +++ b/services/web/npm-shrinkwrap.json @@ -22,20 +22,6 @@ "from": "acorn@>=3.1.0 <4.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" }, - "acorn-dynamic-import": { - "version": "2.0.2", - "from": "acorn-dynamic-import@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "4.0.13", - "from": "acorn@>=4.0.3 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "dev": true - } - } - }, "acorn-globals": { "version": "3.1.0", "from": "acorn-globals@>=3.0.0 <4.0.0", @@ -48,62 +34,16 @@ } } }, - "acorn-jsx": { - "version": "3.0.1", - "from": "acorn-jsx@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "dev": true - }, - "acorn-node": { - "version": "1.3.0", - "from": "acorn-node@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "5.4.1", - "from": "acorn@>=5.4.1 <6.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "dev": true - } - } - }, "addressparser": { "version": "0.2.1", "from": "addressparser@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz" }, - "after": { - "version": "0.8.2", - "from": "after@0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "dev": true - }, - "agent-base": { - "version": "2.1.1", - "from": "agent-base@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "dev": true, - "dependencies": { - "semver": { - "version": "5.0.3", - "from": "semver@>=5.0.1 <5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "dev": true - } - } - }, "ajv": { "version": "5.5.2", "from": "ajv@>=5.1.0 <6.0.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz" }, - "ajv-keywords": { - "version": "2.1.1", - "from": "ajv-keywords@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "dev": true - }, "align-text": { "version": "0.1.4", "from": "align-text@>=0.1.3 <0.2.0", @@ -114,90 +54,11 @@ "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" }, - "amqplib": { - "version": "0.5.2", - "from": "amqplib@>=0.5.2 <0.6.0", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", - "dev": true, - "optional": true, - "dependencies": { - "bluebird": { - "version": "3.5.1", - "from": "bluebird@^3.4.6", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.1.14", - "from": "readable-stream@>=1.0.0 <2.0.0 >=1.1.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "dev": true, - "optional": true - } - } - }, - "ansi-align": { - "version": "2.0.0", - "from": "ansi-align@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "from": "string-width@^2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - } - } - }, - "ansi-escapes": { - "version": "3.0.0", - "from": "ansi-escapes@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "from": "ansi-html@0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "dev": true - }, "ansi-regex": { "version": "2.1.1", "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" }, - "ansi-styles": { - "version": "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", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "from": "anymatch@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "dev": true - }, "aproba": { "version": "1.2.0", "from": "aproba@>=1.0.3 <2.0.0", @@ -254,95 +115,11 @@ } } }, - "arr-diff": { - "version": "4.0.0", - "from": "arr-diff@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "from": "arr-flatten@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "from": "arr-union@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "dev": true - }, - "array-filter": { - "version": "0.0.1", - "from": "array-filter@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "from": "array-find-index@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "dev": true - }, "array-flatten": { "version": "1.1.0", "from": "array-flatten@1.1.0", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.0.tgz" }, - "array-includes": { - "version": "3.0.3", - "from": "array-includes@>=3.0.3 <4.0.0", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "dev": true - }, - "array-map": { - "version": "0.0.0", - "from": "array-map@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "from": "array-reduce@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "from": "array-slice@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "from": "array-union@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "from": "array-uniq@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "from": "array-unique@>=0.3.2 <0.4.0", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "from": "arraybuffer.slice@>=0.0.7 <0.1.0", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "from": "arrify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "dev": true - }, "asap": { "version": "2.0.6", "from": "asap@>=2.0.3 <2.1.0", @@ -353,18 +130,6 @@ "from": "asn1@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, - "asn1.js": { - "version": "4.9.2", - "from": "asn1.js@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "dev": true - }, - "assert": { - "version": "1.4.1", - "from": "assert@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "dev": true - }, "assert-plus": { "version": "1.0.0", "from": "assert-plus@>=1.0.0 <2.0.0", @@ -375,67 +140,16 @@ "from": "assertion-error@^1.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" }, - "assign-symbols": { - "version": "1.0.0", - "from": "assign-symbols@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "dev": true - }, - "ast-types": { - "version": "0.10.2", - "from": "ast-types@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.2.tgz", - "dev": true, - "optional": true - }, - "astw": { - "version": "2.2.0", - "from": "astw@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "4.0.13", - "from": "acorn@>=4.0.3 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "dev": true - } - } - }, "async": { "version": "0.6.2", "from": "async@0.6.2", "resolved": "https://registry.npmjs.org/async/-/async-0.6.2.tgz" }, - "async-each": { - "version": "1.0.1", - "from": "async-each@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "from": "async-limiter@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "dev": true - }, "asynckit": { "version": "0.4.0", "from": "asynckit@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" }, - "atob": { - "version": "2.0.3", - "from": "atob@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "dev": true - }, - "autoprefixer": { - "version": "6.7.7", - "from": "autoprefixer@>=6.6.1 <7.0.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "dev": true - }, "aws-sdk": { "version": "2.188.0", "from": "aws-sdk@>=2.2.36 <3.0.0", @@ -463,458 +177,23 @@ "from": "aws4@>=1.6.0 <2.0.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz" }, - "axios": { - "version": "0.15.3", - "from": "axios@>=0.15.3 <0.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", - "dev": true, - "optional": true - }, "axo": { "version": "0.0.2", "from": "axo@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/axo/-/axo-0.0.2.tgz" }, - "babel-code-frame": { - "version": "6.26.0", - "from": "babel-code-frame@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "dev": true - }, - "babel-core": { - "version": "6.26.0", - "from": "babel-core@latest", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "dev": true, + "backbone": { + "version": "1.3.3", + "from": "backbone@latest", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.6.8 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "json5": { - "version": "0.5.1", - "from": "json5@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@>=3.0.4 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.6 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true + "underscore": { + "version": "1.9.0", + "from": "underscore@>=1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz" } } }, - "babel-generator": { - "version": "6.26.0", - "from": "babel-generator@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.5.7", - "from": "source-map@^0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "dev": true - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "from": "babel-helper-builder-react-jsx@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "dev": true - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "from": "babel-helper-call-delegate@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "dev": true - }, - "babel-helper-define-map": { - "version": "6.26.0", - "from": "babel-helper-define-map@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "dev": true - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "from": "babel-helper-explode-assignable-expression@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "dev": true - }, - "babel-helper-function-name": { - "version": "6.24.1", - "from": "babel-helper-function-name@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "from": "babel-helper-get-function-arity@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "dev": true - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "from": "babel-helper-hoist-variables@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "dev": true - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "from": "babel-helper-optimise-call-expression@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "dev": true - }, - "babel-helper-regex": { - "version": "6.26.0", - "from": "babel-helper-regex@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "dev": true - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "from": "babel-helper-remap-async-to-generator@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "dev": true - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "from": "babel-helper-replace-supers@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "dev": true - }, - "babel-helpers": { - "version": "6.24.1", - "from": "babel-helpers@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "dev": true - }, - "babel-loader": { - "version": "7.1.2", - "from": "babel-loader@latest", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "dev": true - }, - "babel-messages": { - "version": "6.23.0", - "from": "babel-messages@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "dev": true - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "from": "babel-plugin-syntax-async-functions@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "from": "babel-plugin-syntax-exponentiation-operator@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "from": "babel-plugin-syntax-flow@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "from": "babel-plugin-syntax-jsx@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "from": "babel-plugin-syntax-trailing-function-commas@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "from": "babel-plugin-transform-async-to-generator@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "from": "babel-plugin-transform-es2015-block-scoping@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-classes@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "from": "babel-plugin-transform-es2015-destructuring@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "from": "babel-plugin-transform-es2015-for-of@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-amd@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-umd@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-parameters@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "from": "babel-plugin-transform-exponentiation-operator@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "from": "babel-plugin-transform-flow-strip-types@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "from": "babel-plugin-transform-react-display-name@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "dev": true - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "from": "babel-plugin-transform-react-jsx@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "from": "babel-plugin-transform-react-jsx-self@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "from": "babel-plugin-transform-react-jsx-source@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "dev": true - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "from": "babel-plugin-transform-strict-mode@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "dev": true - }, - "babel-preset-env": { - "version": "1.6.1", - "from": "babel-preset-env@latest", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "dev": true, - "dependencies": { - "browserslist": { - "version": "2.11.3", - "from": "browserslist@>=2.1.2 <3.0.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "dev": true - } - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "from": "babel-preset-flow@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "dev": true - }, - "babel-preset-react": { - "version": "6.24.1", - "from": "babel-preset-react@>=6.16.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "dev": true - }, - "babel-register": { - "version": "6.26.0", - "from": "babel-register@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "dev": true - }, - "babel-runtime": { - "version": "6.26.0", - "from": "babel-runtime@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "dev": true - }, - "babel-template": { - "version": "6.26.0", - "from": "babel-template@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "dev": true - }, - "babel-traverse": { - "version": "6.26.0", - "from": "babel-traverse@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@^2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "from": "babel-types@>=6.26.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "dev": true - }, - "babylon": { - "version": "6.18.0", - "from": "babylon@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "from": "backo2@1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "dev": true - }, "backoff": { "version": "2.5.0", "from": "backoff@>=2.5.0 <3.0.0", @@ -925,18 +204,6 @@ "from": "balanced-match@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, - "base": { - "version": "0.11.2", - "from": "base@>=0.11.1 <0.12.0", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.5", - "from": "base64-arraybuffer@0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "dev": true - }, "base64-js": { "version": "1.2.1", "from": "base64-js@>=1.0.2 <2.0.0", @@ -964,12 +231,6 @@ } } }, - "base64id": { - "version": "1.0.0", - "from": "base64id@1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "dev": true - }, "base64url": { "version": "2.0.0", "from": "base64url@>=2.0.0 <3.0.0", @@ -980,12 +241,6 @@ "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" }, - "batch": { - "version": "0.6.1", - "from": "batch@0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "dev": true - }, "bcrypt": { "version": "1.0.1", "from": "bcrypt@1.0.1", @@ -1002,47 +257,21 @@ "from": "bcryptjs@2.3.0", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.3.0.tgz" }, - "better-assert": { - "version": "1.0.2", - "from": "better-assert@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "dev": true - }, "big.js": { "version": "3.2.0", "from": "big.js@>=3.1.3 <4.0.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "from": "binary-extensions@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz" }, "bindings": { "version": "1.2.1", "from": "bindings@1.2.1", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, - "bitsyntax": { - "version": "0.0.4", - "from": "bitsyntax@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", - "dev": true, - "optional": true - }, "bl": { "version": "0.6.0", "from": "bl@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/bl/-/bl-0.6.0.tgz" }, - "blob": { - "version": "0.0.4", - "from": "blob@0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "dev": true - }, "block-stream": { "version": "0.0.9", "from": "block-stream@*", @@ -1053,12 +282,6 @@ "from": "bluebird@2.10.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, - "bn.js": { - "version": "4.11.8", - "from": "bn.js@>=4.1.1 <5.0.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "dev": true - }, "body-parser": { "version": "1.18.2", "from": "body-parser@>=1.13.1 <2.0.0", @@ -1076,273 +299,21 @@ } } }, - "bonjour": { - "version": "3.5.0", - "from": "bonjour@>=3.5.0 <4.0.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "dev": true, - "dependencies": { - "array-flatten": { - "version": "2.1.1", - "from": "array-flatten@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "dev": true - } - } - }, "boom": { "version": "4.3.1", "from": "boom@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz" }, - "boxen": { - "version": "1.3.0", - "from": "boxen@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@^3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "from": "camelcase@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.0", - "from": "chalk@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "from": "has-flag@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@^2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "from": "string-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "from": "supports-color@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.8", "from": "brace-expansion@>=1.1.7 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" }, - "braces": { - "version": "2.3.0", - "from": "braces@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", - "dev": true - }, - "broadway": { - "version": "0.3.6", - "from": "broadway@>=0.3.2 <0.4.0", - "resolved": "https://registry.npmjs.org/broadway/-/broadway-0.3.6.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.2.10", - "from": "async@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "dev": true - }, - "cliff": { - "version": "0.1.9", - "from": "cliff@0.1.9", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.9.tgz", - "dev": true - }, - "winston": { - "version": "0.8.0", - "from": "winston@0.8.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.0.tgz", - "dev": true - } - } - }, - "brorand": { - "version": "1.1.0", - "from": "brorand@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "dev": true - }, - "browser-pack": { - "version": "6.0.4", - "from": "browser-pack@>=6.0.1 <7.0.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.4.tgz", - "dev": true - }, - "browser-resolve": { - "version": "1.11.2", - "from": "browser-resolve@>=1.11.0 <2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "dev": true, - "dependencies": { - "resolve": { - "version": "1.1.7", - "from": "resolve@1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "dev": true - } - } - }, "browser-stdout": { "version": "1.3.0", "from": "browser-stdout@1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz" }, - "browserify": { - "version": "14.5.0", - "from": "browserify@>=14.5.0 <15.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", - "dev": true, - "dependencies": { - "buffer": { - "version": "5.0.8", - "from": "buffer@>=5.0.2 <6.0.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", - "dev": true - }, - "domain-browser": { - "version": "1.1.7", - "from": "domain-browser@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "dev": true - }, - "glob": { - "version": "7.1.2", - "from": "glob@^7.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "from": "timers-browserify@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "dev": true - }, - "url": { - "version": "0.11.0", - "from": "url@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "dev": true, - "dependencies": { - "punycode": { - "version": "1.3.2", - "from": "punycode@1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "dev": true - } - } - } - } - }, - "browserify-aes": { - "version": "1.1.1", - "from": "browserify-aes@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "dev": true - }, - "browserify-cipher": { - "version": "1.0.0", - "from": "browserify-cipher@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "dev": true - }, - "browserify-des": { - "version": "1.0.0", - "from": "browserify-des@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "dev": true - }, - "browserify-rsa": { - "version": "4.0.1", - "from": "browserify-rsa@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "dev": true - }, - "browserify-sign": { - "version": "4.0.4", - "from": "browserify-sign@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "dev": true - }, - "browserify-zlib": { - "version": "0.2.0", - "from": "browserify-zlib@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "from": "browserslist@>=1.7.6 <2.0.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "dev": true - }, "bson": { "version": "1.0.4", "from": "bson@>=1.0.4 <1.1.0", @@ -1370,29 +341,11 @@ "from": "buffer-equal-constant-time@1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" }, - "buffer-indexof": { - "version": "1.1.1", - "from": "buffer-indexof@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "dev": true - }, - "buffer-more-ints": { - "version": "0.0.2", - "from": "buffer-more-ints@0.0.2", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", - "dev": true - }, "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" }, - "buffer-xor": { - "version": "1.0.3", - "from": "buffer-xor@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "dev": true - }, "bufferedstream": { "version": "1.6.0", "from": "bufferedstream@1.6.0", @@ -1410,18 +363,6 @@ } } }, - "builtin-modules": { - "version": "1.1.1", - "from": "builtin-modules@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "from": "builtin-status-codes@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "dev": true - }, "bunyan": { "version": "0.22.1", "from": "bunyan@0.22.1", @@ -1444,78 +385,16 @@ "from": "bytes@3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" }, - "cache-base": { - "version": "1.0.1", - "from": "cache-base@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "dev": true - }, - "cached-path-relative": { - "version": "1.0.1", - "from": "cached-path-relative@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "from": "caller-path@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "dev": true - }, - "callsite": { - "version": "1.0.0", - "from": "callsite@1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "from": "callsites@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "dev": true - }, "camelcase": { "version": "1.2.1", "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, - "camelcase-keys": { - "version": "2.1.0", - "from": "camelcase-keys@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "dev": true, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "from": "camelcase@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "dev": true - } - } - }, "camelize": { "version": "1.0.0", "from": "camelize@1.0.0", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" }, - "caniuse-db": { - "version": "1.0.30000800", - "from": "caniuse-db@>=1.0.30000634 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000800.tgz", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000792", - "from": "caniuse-lite@>=1.0.30000792 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "from": "capture-stack-trace@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "dev": true - }, "caseless": { "version": "0.12.0", "from": "caseless@>=0.12.0 <0.13.0", @@ -1526,151 +405,21 @@ "from": "center-align@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" }, - "chai": { - "version": "3.5.0", - "from": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "dev": true - }, "chai-spies": { "version": "1.0.0", "from": "chai-spies@", "resolved": "https://registry.npmjs.org/chai-spies/-/chai-spies-1.0.0.tgz" }, - "chalk": { - "version": "1.1.3", - "from": "chalk@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "dev": true, - "dependencies": { - "supports-color": { - "version": "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", - "dev": true - } - } - }, "character-parser": { "version": "1.2.0", "from": "character-parser@1.2.0", "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.0.tgz" }, - "chardet": { - "version": "0.4.2", - "from": "chardet@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "dev": true - }, "check-error": { "version": "1.0.2", "from": "check-error@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" }, - "chokidar": { - "version": "2.0.0", - "from": "chokidar@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.0.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "readdirp": { - "version": "2.1.0", - "from": "readdirp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "from": "cipher-base@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "dev": true - }, - "circular-json": { - "version": "0.5.1", - "from": "circular-json@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.1.tgz", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "from": "class-utils@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "dev": true, - "dependencies": { - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - } - } - }, "clean-css": { "version": "3.4.28", "from": "clean-css@>=3.3.0 <4.0.0", @@ -1688,38 +437,6 @@ } } }, - "cli-boxes": { - "version": "1.0.0", - "from": "cli-boxes@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "from": "cli-cursor@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "dev": true - }, - "cli-width": { - "version": "2.2.0", - "from": "cli-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "dev": true - }, - "cliff": { - "version": "0.1.10", - "from": "cliff@>=0.1.9 <0.2.0", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz", - "dev": true, - "dependencies": { - "colors": { - "version": "1.0.3", - "from": "colors@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "dev": true - } - } - }, "cliui": { "version": "2.1.0", "from": "cliui@>=2.1.0 <3.0.0", @@ -1755,55 +472,11 @@ "from": "coffee-script@1.12.4", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" }, - "collection-visit": { - "version": "1.0.0", - "from": "collection-visit@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "dev": true - }, - "color-convert": { - "version": "1.9.1", - "from": "color-convert@>=1.9.0 <2.0.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "dev": true - }, - "color-name": { - "version": "1.1.3", - "from": "color-name@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "dev": true - }, "colors": { "version": "0.6.2", "from": "colors@>=0.6.2 <0.7.0", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" }, - "combine-lists": { - "version": "1.0.1", - "from": "combine-lists@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "dev": true - }, - "combine-source-map": { - "version": "0.8.0", - "from": "combine-source-map@>=0.8.0 <0.9.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "dev": true, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "from": "convert-source-map@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.3 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, "combined-stream": { "version": "1.0.5", "from": "combined-stream@>=1.0.5 <1.1.0", @@ -1814,143 +487,11 @@ "from": "commander@2.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz" }, - "commondir": { - "version": "1.0.1", - "from": "commondir@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "from": "component-bind@1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "from": "component-emitter@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "from": "component-inherit@0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "dev": true - }, - "compressible": { - "version": "2.0.12", - "from": "compressible@>=2.0.11 <2.1.0", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "dev": true - }, - "compression": { - "version": "1.7.1", - "from": "compression@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "dev": true, - "dependencies": { - "accepts": { - "version": "1.3.4", - "from": "accepts@>=1.3.4 <1.4.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "dev": true - }, - "debug": { - "version": "2.6.9", - "from": "debug@2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "from": "negotiator@0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "dev": true - }, - "vary": { - "version": "1.1.2", - "from": "vary@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "dev": true - } - } - }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" }, - "concat-stream": { - "version": "1.5.2", - "from": "concat-stream@>=1.5.1 <1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "dev": true - } - } - }, - "configstore": { - "version": "3.1.1", - "from": "configstore@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "dev": true - }, - "connect": { - "version": "3.6.5", - "from": "connect@>=3.6.0 <4.0.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "dev": true - }, - "finalhandler": { - "version": "1.0.6", - "from": "finalhandler@1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "from": "statuses@>=1.3.1 <1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "from": "utils-merge@1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "from": "connect-history-api-fallback@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "dev": true - }, "connect-redis": { "version": "3.3.3", "from": "connect-redis@>=3.1.0 <4.0.0", @@ -1963,12 +504,6 @@ } } }, - "console-browserify": { - "version": "1.1.0", - "from": "console-browserify@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "dev": true - }, "console-control-strings": { "version": "1.1.0", "from": "console-control-strings@>=1.1.0 <1.2.0", @@ -1979,18 +514,6 @@ "from": "constantinople@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-2.0.1.tgz" }, - "constants-browserify": { - "version": "1.0.0", - "from": "constants-browserify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "from": "contains-path@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "dev": true - }, "content-disposition": { "version": "0.5.0", "from": "content-disposition@0.5.0", @@ -2006,12 +529,6 @@ "from": "content-type@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" }, - "convert-source-map": { - "version": "1.5.1", - "from": "convert-source-map@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "dev": true - }, "cookie": { "version": "0.2.4", "from": "cookie@>=0.2.3 <0.3.0", @@ -2034,24 +551,6 @@ "from": "cookie-signature@1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, - "cookies": { - "version": "0.7.1", - "from": "cookies@>=0.2.2", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "from": "copy-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "from": "core-js@>=2.4.0 <3.0.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "dev": true - }, "core-util-is": { "version": "1.0.2", "from": "core-util-is@>=1.0.0 <1.1.0", @@ -2067,55 +566,11 @@ "from": "crc32-stream@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.2.0.tgz" }, - "create-ecdh": { - "version": "4.0.0", - "from": "create-ecdh@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "from": "create-error-class@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "dev": true - }, - "create-hash": { - "version": "1.1.3", - "from": "create-hash@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "dev": true - }, - "create-hmac": { - "version": "1.1.6", - "from": "create-hmac@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "dev": true - }, "create-react-class": { "version": "15.6.3", "from": "create-react-class@>=15.6.0 <16.0.0", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz" }, - "cross-spawn": { - "version": "5.1.0", - "from": "cross-spawn@>=5.0.1 <6.0.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "dev": true, - "dependencies": { - "lru-cache": { - "version": "4.1.1", - "from": "lru-cache@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "dev": true - }, - "which": { - "version": "1.3.0", - "from": "which@>=1.2.9 <2.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "dev": true - } - } - }, "cryptiles": { "version": "3.1.2", "from": "cryptiles@>=3.0.0 <4.0.0", @@ -2128,18 +583,6 @@ } } }, - "crypto-browserify": { - "version": "3.12.0", - "from": "crypto-browserify@>=3.11.0 <4.0.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "dev": true - }, - "crypto-random-string": { - "version": "1.0.0", - "from": "crypto-random-string@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "dev": true - }, "csrf": { "version": "3.0.6", "from": "csrf@>=3.0.3 <3.1.0", @@ -2182,36 +625,10 @@ } } }, - "ctype": { - "version": "0.5.3", - "from": "ctype@0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "dev": true, - "optional": true - }, - "currently-unhandled": { - "version": "0.4.1", - "from": "currently-unhandled@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "dev": true - }, - "custom-event": { - "version": "1.0.1", - "from": "custom-event@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "dev": true - }, - "cycle": { - "version": "1.0.3", - "from": "cycle@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "dev": true - }, - "d": { - "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "d3": { + "version": "3.5.16", + "from": "d3@3.5.16", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.16.tgz" }, "dashdash": { "version": "1.14.1", @@ -2223,30 +640,16 @@ "from": "dasherize@2.0.0", "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz" }, - "data-uri-to-buffer": { - "version": "1.2.0", - "from": "data-uri-to-buffer@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "dev": true, - "optional": true - }, - "date-format": { - "version": "1.2.0", - "from": "date-format@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "from": "date-now@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "dev": true - }, "dateformat": { "version": "1.0.4-1.2.3", "from": "dateformat@1.0.4-1.2.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.4-1.2.3.tgz" }, + "daterangepicker": { + "version": "2.1.27", + "from": "daterangepicker@2.1.27", + "resolved": "https://registry.npmjs.org/daterangepicker/-/daterangepicker-2.1.27.tgz" + }, "debug": { "version": "1.0.5", "from": "debug@>=1.0.2 <1.1.0", @@ -2257,108 +660,16 @@ "from": "decamelize@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, - "decode-uri-component": { - "version": "0.2.0", - "from": "decode-uri-component@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "dev": true - }, - "deep-eql": { - "version": "0.1.3", - "from": "deep-eql@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "dev": true, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "from": "type-detect@0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "dev": true - } - } - }, - "deep-equal": { - "version": "1.0.1", - "from": "deep-equal@*", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "dev": true - }, "deep-extend": { "version": "0.4.2", "from": "deep-extend@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz" }, - "deep-is": { - "version": "0.1.3", - "from": "deep-is@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "from": "define-properties@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "dev": true - }, - "define-property": { - "version": "1.0.0", - "from": "define-property@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "dev": true - }, - "defined": { - "version": "1.0.0", - "from": "defined@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "dev": true - }, "deflate-crc32-stream": { "version": "0.1.2", "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" }, - "degenerator": { - "version": "1.0.4", - "from": "degenerator@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "dev": true, - "optional": true, - "dependencies": { - "esprima": { - "version": "3.1.3", - "from": "esprima@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "dev": true, - "optional": true - } - } - }, - "del": { - "version": "3.0.0", - "from": "del@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "dev": true, - "dependencies": { - "glob": { - "version": "7.1.2", - "from": "glob@^7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "from": "rimraf@>=2.2.8 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "dev": true - } - } - }, "delayed-stream": { "version": "1.0.0", "from": "delayed-stream@>=1.0.0 <1.1.0", @@ -2379,60 +690,16 @@ "from": "depd@>=1.1.1 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" }, - "deps-sort": { - "version": "2.0.0", - "from": "deps-sort@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "from": "des.js@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "dev": true - }, "destroy": { "version": "1.0.3", "from": "destroy@1.0.3", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" }, - "detect-indent": { - "version": "4.0.0", - "from": "detect-indent@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "dev": true - }, "detect-libc": { "version": "1.0.3", "from": "detect-libc@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" }, - "detect-node": { - "version": "2.0.3", - "from": "detect-node@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "dev": true - }, - "detective": { - "version": "4.7.1", - "from": "detective@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "5.4.1", - "from": "acorn@>=5.2.1 <6.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "dev": true - } - } - }, - "di": { - "version": "0.0.1", - "from": "di@>=0.0.1 <0.0.2", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "dev": true - }, "dicer": { "version": "0.2.5", "from": "dicer@0.2.5", @@ -2450,107 +717,21 @@ "from": "diff@1.0.7", "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" }, - "diffie-hellman": { - "version": "5.0.2", - "from": "diffie-hellman@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "dev": true - }, - "director": { - "version": "1.2.7", - "from": "director@1.2.7", - "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz", - "dev": true - }, - "dns-equal": { - "version": "1.0.0", - "from": "dns-equal@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "from": "dns-packet@>=1.3.1 <2.0.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "dev": true - }, "dns-prefetch-control": { "version": "0.1.0", "from": "dns-prefetch-control@0.1.0", "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz" }, - "dns-txt": { - "version": "2.0.2", - "from": "dns-txt@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "from": "doctrine@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "dev": true - }, "doctypes": { "version": "1.1.0", "from": "doctypes@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" }, - "dom-serialize": { - "version": "2.2.1", - "from": "dom-serialize@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "from": "dom-serializer@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "dev": true, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "from": "domelementtype@>=1.1.1 <1.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "from": "domain-browser@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "from": "domelementtype@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "dev": true - }, - "domhandler": { - "version": "2.4.1", - "from": "domhandler@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "dev": true - }, - "domutils": { - "version": "1.6.2", - "from": "domutils@>=1.5.1 <2.0.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "dev": true - }, "dont-sniff-mimetype": { "version": "1.0.0", "from": "dont-sniff-mimetype@1.0.0", "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz" }, - "dot-prop": { - "version": "4.2.0", - "from": "dot-prop@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "dev": true - }, "dottie": { "version": "1.1.1", "from": "dottie@>=1.0.0 <2.0.0", @@ -2567,50 +748,6 @@ "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.2.8.tgz", "optional": true }, - "duplexer": { - "version": "0.1.1", - "from": "duplexer@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "from": "duplexer2@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "duplexer3": { - "version": "0.1.4", - "from": "duplexer3@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "dev": true - }, "each-series": { "version": "1.0.0", "from": "each-series@>=1.0.0 <2.0.0", @@ -2637,29 +774,10 @@ "from": "ejs@>=0.8.3 <0.9.0", "resolved": "https://registry.npmjs.org/ejs/-/ejs-0.8.8.tgz" }, - "electron-to-chromium": { - "version": "1.3.31", - "from": "electron-to-chromium@>=1.2.7 <2.0.0", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "from": "elliptic@>=6.0.0 <7.0.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "dev": true - }, "emojis-list": { "version": "2.1.0", "from": "emojis-list@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "from": "encodeurl@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" }, "encoding": { "version": "0.1.12", @@ -2678,141 +796,11 @@ "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" }, - "engine.io": { - "version": "3.1.4", - "from": "engine.io@>=3.1.0 <3.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz", - "dev": true, - "dependencies": { - "accepts": { - "version": "1.3.3", - "from": "accepts@1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "from": "cookie@0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "dev": true - }, - "debug": { - "version": "2.6.9", - "from": "debug@~2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "from": "negotiator@0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.1.4", - "from": "engine.io-client@>=3.1.0 <3.2.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@~2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "2.1.2", - "from": "engine.io-parser@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "dev": true - }, - "enhanced-resolve": { - "version": "3.4.1", - "from": "enhanced-resolve@>=3.4.0 <4.0.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "dev": true - }, - "ent": { - "version": "2.2.0", - "from": "ent@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "dev": true - }, - "entities": { - "version": "1.1.1", - "from": "entities@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "dev": true - }, - "errno": { - "version": "0.1.6", - "from": "errno@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "from": "error-ex@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "dev": true - }, - "es-abstract": { - "version": "1.10.0", - "from": "es-abstract@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "dev": true - }, - "es-to-primitive": { - "version": "1.1.1", - "from": "es-to-primitive@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "dev": true - }, - "es5-ext": { - "version": "0.10.38", - "from": "es5-ext@>=0.10.14 <0.11.0", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "from": "es6-iterator@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "dev": true - }, - "es6-map": { - "version": "0.1.5", - "from": "es6-map@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "dev": true - }, "es6-promise": { "version": "4.2.4", "from": "es6-promise@>=4.1.1 <5.0.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz" }, - "es6-set": { - "version": "0.1.5", - "from": "es6-set@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "dev": true - }, - "es6-symbol": { - "version": "3.1.1", - "from": "es6-symbol@>=3.1.1 <3.2.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "dev": true - }, - "es6-weak-map": { - "version": "2.0.2", - "from": "es6-weak-map@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "dev": true - }, "escape-html": { "version": "1.0.2", "from": "escape-html@1.0.2", @@ -2823,359 +811,16 @@ "from": "escape-string-regexp@^1.0.2", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, - "escodegen": { - "version": "1.9.0", - "from": "escodegen@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "dev": true, - "optional": true, - "dependencies": { - "esprima": { - "version": "3.1.3", - "from": "esprima@^3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.6 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true, - "optional": true - } - } - }, - "escope": { - "version": "3.6.0", - "from": "escope@>=3.6.0 <4.0.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "dev": true - }, - "eslint": { - "version": "4.18.1", - "from": "eslint@>=4.18.1 <5.0.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.1.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@^3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "from": "argparse@>=1.0.7 <2.0.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.1", - "from": "chalk@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "from": "concat-stream@>=1.6.0 <2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "dev": true - }, - "debug": { - "version": "3.1.0", - "from": "debug@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "from": "esprima@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "dev": true - }, - "glob": { - "version": "7.1.2", - "from": "glob@>=7.1.2 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "globals": { - "version": "11.3.0", - "from": "globals@>=11.0.1 <12.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "from": "has-flag@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "js-yaml": { - "version": "3.10.0", - "from": "js-yaml@>=3.9.1 <4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@>=2.2.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "5.2.0", - "from": "supports-color@>=5.2.0 <6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "dev": true - } - } - }, - "eslint-config-standard": { - "version": "11.0.0", - "from": "eslint-config-standard@>=11.0.0 <12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "from": "eslint-import-resolver-node@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.6.9 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.1.1", - "from": "eslint-module-utils@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.6.8 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "from": "find-up@^1.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "from": "path-exists@^2.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "dev": true - }, - "pkg-dir": { - "version": "1.0.0", - "from": "pkg-dir@^1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "dev": true - } - } - }, - "eslint-plugin-chai-expect": { - "version": "1.1.1", - "from": "eslint-plugin-chai-expect@latest", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-1.1.1.tgz", - "dev": true - }, - "eslint-plugin-chai-friendly": { - "version": "0.4.1", - "from": "eslint-plugin-chai-friendly@latest", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.4.1.tgz", - "dev": true - }, - "eslint-plugin-import": { - "version": "2.9.0", - "from": "eslint-plugin-import@>=2.9.0 <3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.6.8 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "doctrine": { - "version": "1.5.0", - "from": "doctrine@1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@^1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "6.0.1", - "from": "eslint-plugin-node@>=6.0.0 <7.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", - "dev": true, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "semver": { - "version": "5.5.0", - "from": "semver@>=5.4.1 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "3.6.0", - "from": "eslint-plugin-promise@>=3.6.0 <4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.0.1", - "from": "eslint-plugin-standard@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", - "dev": true - }, - "eslint-scope": { - "version": "3.7.1", - "from": "eslint-scope@>=3.7.1 <4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "from": "eslint-visitor-keys@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "dev": true - }, - "espree": { - "version": "3.5.3", - "from": "espree@>=3.5.2 <4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "5.4.1", - "from": "acorn@>=5.4.0 <6.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "dev": true - } - } - }, "esprima": { "version": "1.0.4", "from": "esprima@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" }, - "esquery": { - "version": "1.0.0", - "from": "esquery@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "from": "esrecurse@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "from": "estraverse@>=4.1.1 <5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "from": "esutils@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "dev": true - }, "etag": { "version": "1.7.0", "from": "etag@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, - "event-emitter": { - "version": "0.3.5", - "from": "event-emitter@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "dev": true - }, - "event-stream": { - "version": "0.5.3", - "from": "event-stream@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.5.3.tgz", - "dev": true, - "dependencies": { - "optimist": { - "version": "0.2.8", - "from": "optimist@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", - "dev": true - } - } - }, "eventemitter2": { "version": "0.4.14", "from": "eventemitter2@>=0.4.13 <0.5.0", @@ -3191,159 +836,11 @@ "from": "events@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" }, - "eventsource": { - "version": "0.1.6", - "from": "eventsource@0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "dev": true - }, - "execa": { - "version": "0.7.0", - "from": "execa@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "dev": true - }, "exit": { "version": "0.1.2", "from": "exit@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, - "expand-braces": { - "version": "0.1.2", - "from": "expand-braces@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "dev": true, - "dependencies": { - "array-unique": { - "version": "0.2.1", - "from": "array-unique@^0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "dev": true - }, - "braces": { - "version": "0.1.5", - "from": "braces@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "dev": true - }, - "expand-range": { - "version": "0.1.1", - "from": "expand-range@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "dev": true - }, - "is-number": { - "version": "0.1.1", - "from": "is-number@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "from": "repeat-string@>=0.2.2 <0.3.0", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "dev": true - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "from": "expand-brackets@>=2.1.4 <3.0.0", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.3.3 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - } - } - }, - "expand-range": { - "version": "1.8.2", - "from": "expand-range@>=1.8.1 <2.0.0", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "dev": true, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "from": "fill-range@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "from": "is-number@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "from": "isobject@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "dev": true - } - } - }, "expect-ct": { "version": "0.1.0", "from": "expect-ct@0.1.0", @@ -3425,48 +922,16 @@ "from": "extend@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" }, - "extend-shallow": { - "version": "2.0.1", - "from": "extend-shallow@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "dev": true - }, "extendible": { "version": "0.1.1", "from": "extendible@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/extendible/-/extendible-0.1.1.tgz" }, - "external-editor": { - "version": "2.1.0", - "from": "external-editor@>=2.0.4 <3.0.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "dev": true, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "from": "iconv-lite@>=0.4.17 <0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "from": "extglob@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "dev": true - }, "extsprintf": { "version": "1.3.0", "from": "extsprintf@1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" }, - "eyes": { - "version": "0.1.8", - "from": "eyes@>=0.1.8 <0.2.0", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "dev": true - }, "failure": { "version": "1.1.1", "from": "failure@>=1.1.0 <1.2.0", @@ -3482,17 +947,10 @@ "from": "fast-json-stable-stringify@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz" }, - "fast-levenshtein": { - "version": "2.0.6", - "from": "fast-levenshtein@>=2.0.4 <2.1.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "from": "faye-websocket@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "dev": true + "fastparse": { + "version": "1.1.1", + "from": "fastparse@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz" }, "fbjs": { "version": "0.8.16", @@ -3516,25 +974,6 @@ "from": "fd-slicer@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz" }, - "figures": { - "version": "2.0.0", - "from": "figures@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "dev": true - }, - "file-entry-cache": { - "version": "2.0.0", - "from": "file-entry-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "dev": true - }, - "file-uri-to-path": { - "version": "1.0.0", - "from": "file-uri-to-path@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "dev": true, - "optional": true - }, "file-utils": { "version": "0.1.5", "from": "file-utils@>=0.1.5 <0.2.0", @@ -3547,18 +986,6 @@ } } }, - "filename-regex": { - "version": "2.0.1", - "from": "filename-regex@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "from": "fill-range@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "dev": true - }, "finalhandler": { "version": "0.4.0", "from": "finalhandler@0.4.0", @@ -3576,18 +1003,6 @@ } } }, - "find-cache-dir": { - "version": "1.0.0", - "from": "find-cache-dir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "from": "find-up@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "dev": true - }, "findup-sync": { "version": "0.1.3", "from": "findup-sync@>=0.1.2 <0.2.0", @@ -3600,156 +1015,26 @@ } } }, - "flat-cache": { - "version": "1.3.0", - "from": "flat-cache@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "dev": true, - "dependencies": { - "circular-json": { - "version": "0.3.3", - "from": "circular-json@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "dev": true - }, - "del": { - "version": "2.2.2", - "from": "del@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "dev": true - }, - "glob": { - "version": "7.1.2", - "from": "glob@^7.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "globby": { - "version": "5.0.0", - "from": "globby@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "pify": { - "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "from": "rimraf@>=2.2.8 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "dev": true - } - } - }, - "flatiron": { - "version": "0.4.3", - "from": "flatiron@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/flatiron/-/flatiron-0.4.3.tgz", - "dev": true, - "dependencies": { - "optimist": { - "version": "0.6.0", - "from": "optimist@0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", - "dev": true - } - } - }, "flexbuffer": { "version": "0.0.6", "from": "flexbuffer@0.0.6", "resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz" }, - "follow-redirects": { - "version": "1.0.0", - "from": "follow-redirects@1.0.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", - "dev": true, - "optional": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@^2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true, - "optional": true - } - } - }, - "for-in": { - "version": "1.0.2", - "from": "for-in@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "from": "for-own@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "from": "foreach@>=2.0.5 <3.0.0", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "dev": true - }, - "forever": { - "version": "0.14.2", - "from": "forever@>=0.14.1 <0.15.0", - "resolved": "https://registry.npmjs.org/forever/-/forever-0.14.2.tgz", - "dev": true - }, "forever-agent": { "version": "0.6.1", "from": "forever-agent@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "forever-monitor": { - "version": "1.5.2", - "from": "forever-monitor@>=1.5.1 <1.6.0", - "resolved": "https://registry.npmjs.org/forever-monitor/-/forever-monitor-1.5.2.tgz", - "dev": true, - "dependencies": { - "minimatch": { - "version": "1.0.0", - "from": "minimatch@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "dev": true - } - } - }, "form-data": { "version": "2.3.1", "from": "form-data@>=2.3.1 <2.4.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz" }, - "formatio": { - "version": "1.1.1", - "from": "formatio@1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "dev": true - }, "forwarded": { "version": "0.1.2", "from": "forwarded@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz" }, - "fragment-cache": { - "version": "0.2.1", - "from": "fragment-cache@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "dev": true - }, "frameguard": { "version": "3.0.0", "from": "frameguard@3.0.0", @@ -3760,18 +1045,6 @@ "from": "fresh@0.3.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, - "from": { - "version": "0.1.7", - "from": "from@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "dev": true - }, - "fs-access": { - "version": "1.0.1", - "from": "fs-access@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "dev": true - }, "fs-extra": { "version": "4.0.3", "from": "fs-extra@>=4.0.2 <5.0.0", @@ -3799,33 +1072,11 @@ } } }, - "ftp": { - "version": "0.3.10", - "from": "ftp@>=0.3.10 <0.4.0", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "dev": true, - "optional": true, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "from": "readable-stream@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "dev": true, - "optional": true - } - } - }, "function-bind": { "version": "1.1.1", "from": "function-bind@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" }, - "functional-red-black-tree": { - "version": "1.0.1", - "from": "functional-red-black-tree@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "dev": true - }, "fuse.js": { "version": "3.2.0", "from": "fuse.js@>=3.0.0 <4.0.0", @@ -3836,104 +1087,16 @@ "from": "gauge@>=2.7.3 <2.8.0", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" }, - "gaze": { - "version": "1.1.2", - "from": "gaze@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "dev": true - }, - "generate-function": { - "version": "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", - "dev": true, - "optional": true - }, - "generate-object-property": { - "version": "1.2.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", - "dev": true, - "optional": true - }, "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" }, - "get-caller-file": { - "version": "1.0.2", - "from": "get-caller-file@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "dev": true - }, "get-func-name": { "version": "2.0.0", "from": "get-func-name@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" }, - "get-stdin": { - "version": "4.0.1", - "from": "get-stdin@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "from": "get-stream@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "dev": true - }, - "get-uri": { - "version": "2.0.1", - "from": "get-uri@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", - "dev": true, - "optional": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true, - "optional": true - } - } - }, - "get-value": { - "version": "2.0.6", - "from": "get-value@>=2.0.6 <3.0.0", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "dev": true - }, "getobject": { "version": "0.1.0", "from": "getobject@>=0.1.0 <0.2.0", @@ -3956,110 +1119,6 @@ } } }, - "glob-base": { - "version": "0.3.0", - "from": "glob-base@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "dev": true, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "from": "glob-parent@^2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@^1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "from": "is-glob@^2.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true - } - } - }, - "glob-parent": { - "version": "3.1.0", - "from": "glob-parent@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "dev": true, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "from": "is-glob@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "dev": true - } - } - }, - "global-dirs": { - "version": "0.1.1", - "from": "global-dirs@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "dev": true - }, - "globals": { - "version": "9.18.0", - "from": "globals@>=9.18.0 <10.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "dev": true - }, - "globby": { - "version": "6.1.0", - "from": "globby@>=6.1.0 <7.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "dev": true, - "dependencies": { - "glob": { - "version": "7.1.2", - "from": "glob@>=7.0.3 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "pify": { - "version": "2.3.0", - "from": "pify@^2.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - } - } - }, - "globule": { - "version": "1.2.0", - "from": "globule@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "dev": true, - "dependencies": { - "glob": { - "version": "7.1.2", - "from": "glob@>=7.1.1 <7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@~3.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - } - } - }, - "got": { - "version": "6.7.1", - "from": "got@>=6.7.1 <7.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "dev": true - }, "graceful-fs": { "version": "4.1.11", "from": "graceful-fs@>=4.1.2 <5.0.0", @@ -4127,26 +1186,6 @@ } } }, - "grunt-available-tasks": { - "version": "0.4.1", - "from": "grunt-available-tasks@0.4.1", - "resolved": "https://registry.npmjs.org/grunt-available-tasks/-/grunt-available-tasks-0.4.1.tgz", - "dev": true, - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.0 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "from": "underscore.string@>=2.3.3 <2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "dev": true - } - } - }, "grunt-bunyan": { "version": "0.5.0", "from": "grunt-bunyan@>=0.5.0 <0.6.0", @@ -4159,177 +1198,11 @@ } } }, - "grunt-cli": { - "version": "1.2.0", - "from": "grunt-cli@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "dev": true, - "dependencies": { - "findup-sync": { - "version": "0.3.0", - "from": "findup-sync@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "dev": true - }, - "glob": { - "version": "5.0.15", - "from": "glob@>=5.0.0 <5.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "from": "resolve@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "dev": true - } - } - }, - "grunt-contrib-clean": { - "version": "0.5.0", - "from": "grunt-contrib-clean@0.5.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", - "dev": true - }, - "grunt-contrib-coffee": { - "version": "0.10.0", - "from": "grunt-contrib-coffee@0.10.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.10.0.tgz", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "from": "ansi-styles@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "from": "chalk@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "dev": true - }, - "coffee-script": { - "version": "1.7.1", - "from": "coffee-script@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", - "dev": true - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@~2.4.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "dev": true - }, - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "dev": true - }, - "strip-ansi": { - "version": "0.1.1", - "from": "strip-ansi@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "dev": true - } - } - }, - "grunt-contrib-less": { - "version": "1.4.1", - "from": "grunt-contrib-less@1.4.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "2.6.0", - "from": "async@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "dev": true - } - } - }, - "grunt-contrib-requirejs": { - "version": "0.4.1", - "from": "grunt-contrib-requirejs@0.4.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.1.tgz", - "dev": true - }, - "grunt-contrib-watch": { - "version": "1.0.0", - "from": "grunt-contrib-watch@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "1.5.2", - "from": "async@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "from": "lodash@>=3.10.1 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "dev": true - } - } - }, - "grunt-env": { - "version": "0.4.4", - "from": "grunt-env@0.4.4", - "resolved": "https://registry.npmjs.org/grunt-env/-/grunt-env-0.4.4.tgz", - "dev": true, - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@~2.4.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "dev": true - } - } - }, - "grunt-exec": { - "version": "0.4.7", - "from": "grunt-exec@>=0.4.7 <0.5.0", - "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.7.tgz", - "dev": true - }, "grunt-execute": { "version": "0.2.2", "from": "grunt-execute@>=0.2.2 <0.3.0", "resolved": "https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz" }, - "grunt-file-append": { - "version": "0.0.6", - "from": "grunt-file-append@0.0.6", - "resolved": "https://registry.npmjs.org/grunt-file-append/-/grunt-file-append-0.0.6.tgz", - "dev": true - }, - "grunt-forever": { - "version": "0.4.7", - "from": "grunt-forever@>=0.4.7 <0.5.0", - "resolved": "https://registry.npmjs.org/grunt-forever/-/grunt-forever-0.4.7.tgz", - "dev": true - }, - "grunt-git-rev-parse": { - "version": "0.1.5", - "from": "grunt-git-rev-parse@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/grunt-git-rev-parse/-/grunt-git-rev-parse-0.1.5.tgz", - "dev": true - }, - "grunt-known-options": { - "version": "1.1.0", - "from": "grunt-known-options@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "dev": true - }, "grunt-legacy-log": { "version": "0.1.3", "from": "grunt-legacy-log@>=0.1.0 <0.2.0", @@ -4381,142 +1254,65 @@ } } }, - "grunt-mocha-test": { - "version": "0.9.0", - "from": "grunt-mocha-test@0.9.0", - "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.9.0.tgz", - "dev": true, - "dependencies": { - "commander": { - "version": "2.0.0", - "from": "commander@2.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", - "dev": true - }, - "glob": { - "version": "3.2.3", - "from": "glob@3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "dev": true - }, - "graceful-fs": { - "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "dev": true - }, - "jade": { - "version": "0.26.3", - "from": "jade@0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "dev": true, - "dependencies": { - "commander": { - "version": "0.6.1", - "from": "commander@0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "dev": true - }, - "mocha": { - "version": "1.17.1", - "from": "mocha@>=1.17.1 <1.18.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.17.1.tgz", - "dev": true - } - } - }, - "grunt-newer": { - "version": "1.3.0", - "from": "grunt-newer@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/grunt-newer/-/grunt-newer-1.3.0.tgz", - "dev": true, + "handlebars": { + "version": "4.0.11", + "from": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "dependencies": { "async": { "version": "1.5.2", - "from": "async@^1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "dev": true + "from": "async@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" }, - "glob": { - "version": "7.1.2", - "from": "glob@>=7.0.5 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true + "source-map": { + "version": "0.4.4", + "from": "source-map@>=0.4.4 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true + "uglify-js": { + "version": "2.8.29", + "from": "uglify-js@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "optional": true, + "dependencies": { + "source-map": { + "version": "0.5.7", + "from": "source-map@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "optional": true + } + } }, - "rimraf": { - "version": "2.6.2", - "from": "rimraf@>=2.5.2 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "dev": true + "yargs": { + "version": "3.10.0", + "from": "yargs@>=3.10.0 <3.11.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "optional": true } } }, - "grunt-parallel": { - "version": "0.5.1", - "from": "grunt-parallel@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/grunt-parallel/-/grunt-parallel-0.5.1.tgz", - "dev": true, + "handlebars-loader": { + "version": "1.7.0", + "from": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.0.tgz", "dependencies": { - "q": { - "version": "0.8.12", - "from": "q@>=0.8.12 <0.9.0", - "resolved": "https://registry.npmjs.org/q/-/q-0.8.12.tgz", - "dev": true + "async": { + "version": "0.2.10", + "from": "async@>=0.2.10 <0.3.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "json5": { + "version": "0.5.1", + "from": "json5@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + }, + "loader-utils": { + "version": "1.0.4", + "from": "loader-utils@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.0.4.tgz" } } }, - "grunt-postcss": { - "version": "0.8.0", - "from": "grunt-postcss@>=0.8.0 <0.9.0", - "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.8.0.tgz", - "dev": true, - "dependencies": { - "diff": { - "version": "2.2.3", - "from": "diff@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", - "dev": true - } - } - }, - "grunt-sed": { - "version": "0.1.1", - "from": "grunt-sed@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/grunt-sed/-/grunt-sed-0.1.1.tgz", - "dev": true - }, - "grunt-shell": { - "version": "2.1.0", - "from": "grunt-shell@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz", - "dev": true - }, - "handle-thing": { - "version": "1.2.5", - "from": "handle-thing@>=1.2.5 <2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "dev": true - }, "hang": { "version": "1.0.0", "from": "hang@>=1.0.0 <1.1.0", @@ -4537,81 +1333,11 @@ "from": "has@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" }, - "has-ansi": { - "version": "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", - "dev": true - }, - "has-binary2": { - "version": "1.0.2", - "from": "has-binary2@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "2.0.1", - "from": "isarray@2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "dev": true - } - } - }, - "has-color": { - "version": "0.1.7", - "from": "has-color@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "dev": true - }, - "has-cors": { - "version": "1.1.0", - "from": "has-cors@1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "from": "has-flag@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "dev": true - }, "has-unicode": { "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" }, - "has-value": { - "version": "1.0.0", - "from": "has-value@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "dev": true - }, - "has-values": { - "version": "1.0.0", - "from": "has-values@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "from": "kind-of@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "dev": true - } - } - }, - "hash-base": { - "version": "2.0.2", - "from": "hash-base@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "dev": true - }, - "hash.js": { - "version": "1.1.3", - "from": "hash.js@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "dev": true - }, "hawk": { "version": "6.0.2", "from": "hawk@>=6.0.2 <6.1.0", @@ -4642,30 +1368,11 @@ "from": "hide-powered-by@1.0.0", "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz" }, - "hipchat-notifier": { - "version": "1.1.0", - "from": "hipchat-notifier@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", - "dev": true, - "optional": true - }, - "hmac-drbg": { - "version": "1.0.1", - "from": "hmac-drbg@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "dev": true - }, "hoek": { "version": "4.2.0", "from": "hoek@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz" }, - "home-or-tmp": { - "version": "2.0.0", - "from": "home-or-tmp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "dev": true - }, "hooker": { "version": "0.2.3", "from": "hooker@>=0.2.3 <0.3.0", @@ -4676,38 +1383,6 @@ "from": "hooks-fixed@2.0.0", "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.0.tgz" }, - "hosted-git-info": { - "version": "2.5.0", - "from": "hosted-git-info@>=2.1.4 <3.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "from": "hpack.js@>=2.1.6 <3.0.0", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.0.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, "hpkp": { "version": "2.0.0", "from": "hpkp@2.0.0", @@ -4718,50 +1393,6 @@ "from": "hsts@2.1.0", "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz" }, - "html-entities": { - "version": "1.2.1", - "from": "html-entities@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "from": "htmlescape@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "from": "htmlparser2@>=3.9.0 <4.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "from": "http-deceiver@>=1.2.7 <2.0.0", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "dev": true - }, "http-errors": { "version": "1.6.2", "from": "http-errors@>=1.6.2 <1.7.0", @@ -4774,160 +1405,16 @@ } } }, - "http-parser-js": { - "version": "0.4.9", - "from": "http-parser-js@>=0.4.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "dev": true - }, "http-proxy": { "version": "1.16.2", "from": "http-proxy@>=1.8.1 <2.0.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz" }, - "http-proxy-agent": { - "version": "1.0.0", - "from": "http-proxy-agent@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "from": "http-proxy-middleware@>=0.17.4 <0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "dev": true, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "from": "arr-diff@^2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "from": "array-unique@^0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "dev": true - }, - "braces": { - "version": "1.8.5", - "from": "braces@^1.8.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "from": "expand-brackets@^0.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "from": "extglob@^0.3.1", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@^1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - } - } - }, - "is-glob": { - "version": "3.1.0", - "from": "is-glob@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "from": "micromatch@^2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@^1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "from": "is-glob@^2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true - } - } - } - } - }, "http-signature": { "version": "1.2.0", "from": "http-signature@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" }, - "httpntlm": { - "version": "1.6.1", - "from": "httpntlm@1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "dev": true, - "dependencies": { - "underscore": { - "version": "1.7.0", - "from": "underscore@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "dev": true - } - } - }, - "httpreq": { - "version": "0.4.24", - "from": "httpreq@>=0.4.22", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "from": "https-browserify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "dev": true - }, - "https-proxy-agent": { - "version": "1.0.0", - "from": "https-proxy-agent@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "i": { - "version": "0.3.6", - "from": "i@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", - "dev": true - }, - "i18next": { - "version": "1.7.10", - "from": "i18next@>=1.7.1 <1.8.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-1.7.10.tgz", - "dev": true - }, "iconv-lite": { "version": "0.2.11", "from": "iconv-lite@>=0.2.11 <0.3.0", @@ -4943,54 +1430,17 @@ "from": "ienoopen@1.0.0", "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz" }, - "ignore": { - "version": "3.3.7", - "from": "ignore@>=3.3.3 <4.0.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "from": "ignore-by-default@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "from": "image-size@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "dev": true, - "optional": true - }, - "import-lazy": { - "version": "2.1.0", - "from": "import-lazy@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "from": "import-local@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "from": "imurmurhash@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "from": "indent-string@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "from": "indexof@0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "dev": true + "imports-loader": { + "version": "0.8.0", + "from": "imports-loader@latest", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", + "dependencies": { + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + } + } }, "inflection": { "version": "1.12.0", @@ -5012,126 +1462,6 @@ "from": "ini@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz" }, - "inline-source-map": { - "version": "0.6.2", - "from": "inline-source-map@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.3 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "inquirer": { - "version": "3.3.0", - "from": "inquirer@>=3.0.6 <4.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@^3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.1", - "from": "chalk@^2.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "from": "has-flag@^3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "from": "string-width@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@^4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "5.2.0", - "from": "supports-color@^5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "dev": true - } - } - }, - "insert-module-globals": { - "version": "7.0.1", - "from": "insert-module-globals@>=7.0.0 <8.0.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", - "dev": true, - "dependencies": { - "combine-source-map": { - "version": "0.7.2", - "from": "combine-source-map@>=0.7.1 <0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", - "dev": true - }, - "convert-source-map": { - "version": "1.1.3", - "from": "convert-source-map@~1.1.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.3 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "internal-ip": { - "version": "1.2.0", - "from": "internal-ip@1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "from": "interpret@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "from": "invariant@>=2.2.2 <3.0.0", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "from": "invert-kv@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "dev": true - }, "ioredis": { "version": "3.2.2", "from": "ioredis@>=3.2.1 <4.0.0", @@ -5149,276 +1479,46 @@ } } }, - "ip": { - "version": "1.1.5", - "from": "ip@>=1.1.5 <2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "dev": true - }, "ipaddr.js": { "version": "1.0.5", "from": "ipaddr.js@1.0.5", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" }, - "is-accessor-descriptor": { - "version": "1.0.0", - "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "from": "kind-of@^6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "dev": true - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "from": "is-arrayish@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "from": "is-binary-path@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "dev": true - }, "is-buffer": { "version": "1.1.6", "from": "is-buffer@>=1.1.5 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" }, - "is-builtin-module": { - "version": "1.0.0", - "from": "is-builtin-module@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "dev": true - }, - "is-callable": { - "version": "1.1.3", - "from": "is-callable@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "dev": true - }, - "is-data-descriptor": { - "version": "1.0.0", - "from": "is-data-descriptor@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "from": "kind-of@^6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "dev": true - } - } - }, - "is-date-object": { - "version": "1.0.1", - "from": "is-date-object@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "from": "is-descriptor@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "from": "kind-of@^6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "from": "is-dotfile@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "from": "is-equal-shallow@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "dev": true - }, "is-expression": { "version": "2.1.0", "from": "is-expression@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz" }, - "is-extendable": { - "version": "0.1.1", - "from": "is-extendable@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "from": "is-extglob@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "from": "is-finite@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "dev": true - }, "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" }, - "is-glob": { - "version": "4.0.0", - "from": "is-glob@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "dev": true - }, - "is-installed-globally": { - "version": "0.1.0", - "from": "is-installed-globally@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "dev": true - }, - "is-my-json-valid": { - "version": "2.17.1", - "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.17.1.tgz", - "dev": true, - "optional": true - }, - "is-npm": { - "version": "1.0.0", - "from": "is-npm@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "from": "is-number@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "from": "is-obj@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "dev": true - }, - "is-odd": { - "version": "1.0.0", - "from": "is-odd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "from": "is-path-cwd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "from": "is-path-in-cwd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "from": "is-path-inside@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "from": "is-plain-object@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "dev": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "from": "is-posix-bracket@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "from": "is-primitive@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "dev": true - }, "is-promise": { "version": "1.0.1", "from": "is-promise@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz" }, - "is-property": { - "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "dev": true, - "optional": true - }, - "is-redirect": { - "version": "1.0.0", - "from": "is-redirect@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "dev": true - }, "is-regex": { "version": "1.0.4", "from": "is-regex@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" }, - "is-resolvable": { - "version": "1.1.0", - "from": "is-resolvable@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "from": "is-retry-allowed@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "dev": true - }, "is-stream": { "version": "1.1.0", "from": "is-stream@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" }, - "is-symbol": { - "version": "1.0.1", - "from": "is-symbol@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "dev": true - }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, - "is-utf8": { - "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "from": "is-wsl@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "dev": true - }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -5429,18 +1529,6 @@ "from": "isbinaryfile@>=0.1.9 <0.2.0", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz" }, - "isexe": { - "version": "2.0.0", - "from": "isexe@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "from": "isobject@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "dev": true - }, "isomorphic-fetch": { "version": "2.2.1", "from": "isomorphic-fetch@>=2.1.1 <3.0.0", @@ -5468,11 +1556,10 @@ "from": "jmespath@0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz" }, - "js-base64": { - "version": "2.4.3", - "from": "js-base64@>=2.1.9 <3.0.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "dev": true + "jquery": { + "version": "3.3.1", + "from": "jquery@latest", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz" }, "js-stringify": { "version": "1.0.2", @@ -5495,18 +1582,6 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "optional": true }, - "jsesc": { - "version": "1.3.0", - "from": "jsesc@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "from": "json-loader@>=0.5.4 <0.6.0", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "dev": true - }, "json-schema": { "version": "0.2.3", "from": "json-schema@0.2.3", @@ -5522,29 +1597,11 @@ "from": "json-stable-stringify@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "from": "json-stable-stringify-without-jsonify@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, - "json3": { - "version": "3.3.2", - "from": "json3@>=3.3.2 <4.0.0", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "dev": true - }, - "json5": { - "version": "0.2.0", - "from": "json5@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.2.0.tgz", - "dev": true - }, "jsonfile": { "version": "4.0.0", "from": "jsonfile@>=4.0.0 <5.0.0", @@ -5555,25 +1612,6 @@ "from": "jsonify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" }, - "jsonparse": { - "version": "1.3.1", - "from": "jsonparse@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "from": "jsonpointer@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "dev": true, - "optional": true - }, - "JSONStream": { - "version": "1.3.2", - "from": "JSONStream@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "dev": true - }, "jsonwebtoken": { "version": "8.1.1", "from": "jsonwebtoken@>=8.0.1 <9.0.0", @@ -5628,315 +1666,11 @@ "from": "kareem@1.5.0", "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz" }, - "karma": { - "version": "2.0.0", - "from": "karma@latest", - "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.0.tgz", - "dev": true, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "from": "anymatch@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "from": "arr-diff@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "from": "array-unique@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "from": "bluebird@>=3.3.0 <4.0.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "dev": true - }, - "braces": { - "version": "1.8.5", - "from": "braces@>=1.8.2 <2.0.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "from": "chokidar@>=1.4.1 <2.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "dev": true - }, - "colors": { - "version": "1.1.2", - "from": "colors@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "from": "expand-brackets@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "from": "extglob@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "dev": true - }, - "glob": { - "version": "7.1.2", - "from": "glob@>=7.1.1 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "dev": true - }, - "glob-parent": { - "version": "2.0.0", - "from": "glob-parent@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "from": "is-glob@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.2", - "from": "isbinaryfile@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "from": "micromatch@>=2.1.5 <3.0.0", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "range-parser": { - "version": "1.2.0", - "from": "range-parser@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "readdirp": { - "version": "2.1.0", - "from": "readdirp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "from": "rimraf@>=2.6.0 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "from": "source-map@>=0.6.1 <0.7.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "karma-chai-sinon": { - "version": "0.1.5", - "from": "karma-chai-sinon@latest", - "resolved": "https://registry.npmjs.org/karma-chai-sinon/-/karma-chai-sinon-0.1.5.tgz", - "dev": true - }, - "karma-chrome-launcher": { - "version": "2.2.0", - "from": "karma-chrome-launcher@latest", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "dev": true, - "dependencies": { - "which": { - "version": "1.3.0", - "from": "which@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "dev": true - } - } - }, - "karma-mocha": { - "version": "1.3.0", - "from": "karma-mocha@latest", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - } - } - }, - "karma-mocha-reporter": { - "version": "2.2.5", - "from": "karma-mocha-reporter@latest", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.1", - "from": "chalk@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "from": "has-flag@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "5.2.0", - "from": "supports-color@>=5.2.0 <6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "dev": true - } - } - }, - "karma-requirejs": { - "version": "1.1.0", - "from": "karma-requirejs@latest", - "resolved": "https://registry.npmjs.org/karma-requirejs/-/karma-requirejs-1.1.0.tgz", - "dev": true - }, - "karma-webpack": { - "version": "2.0.9", - "from": "karma-webpack@>=2.0.9 <3.0.0", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.9.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "dev": true - }, - "json5": { - "version": "0.5.1", - "from": "json5@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "from": "loader-utils@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "from": "lodash@>=3.8.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.6 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "keygrip": { - "version": "1.0.2", - "from": "keygrip@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.2.tgz", - "dev": true - }, - "killable": { - "version": "1.0.0", - "from": "killable@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "dev": true - }, "kind-of": { "version": "3.2.2", "from": "kind-of@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" }, - "labeled-stream-splicer": { - "version": "2.0.0", - "from": "labeled-stream-splicer@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "from": "latest-version@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "dev": true - }, - "lazy": { - "version": "1.0.11", - "from": "lazy@>=1.0.11 <1.1.0", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "dev": true - }, "lazy-cache": { "version": "1.0.4", "from": "lazy-cache@>=1.0.3 <2.0.0", @@ -5947,12 +1681,6 @@ "from": "lazystream@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" }, - "lcid": { - "version": "1.0.0", - "from": "lcid@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "dev": true - }, "ldap-filter": { "version": "0.2.2", "from": "ldap-filter@0.2.2", @@ -6061,143 +1789,6 @@ } } }, - "less": { - "version": "2.7.3", - "from": "less@>=2.7.1 <2.8.0", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "dev": true, - "dependencies": { - "ajv": { - "version": "4.11.8", - "from": "ajv@>=4.9.1 <5.0.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "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", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "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", - "dev": true, - "optional": true - }, - "boom": { - "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "from": "form-data@>=2.1.1 <2.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "1.0.5", - "from": "har-schema@>=1.0.5 <2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "from": "har-validator@>=4.2.1 <4.3.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "from": "hawk@>=3.1.3 <3.2.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "dev": true, - "optional": true - }, - "hoek": { - "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "from": "http-signature@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "0.2.0", - "from": "performance-now@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "dev": true, - "optional": true - }, - "promise": { - "version": "7.3.1", - "from": "promise@>=7.1.1 <8.0.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "from": "qs@>=6.4.0 <6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "from": "request@2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.3 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true, - "optional": true - } - } - }, - "levn": { - "version": "0.3.0", - "from": "levn@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "dev": true - }, - "lexical-scope": { - "version": "1.2.0", - "from": "lexical-scope@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "dev": true - }, "libbase64": { "version": "0.1.0", "from": "libbase64@0.1.0", @@ -6220,43 +1811,15 @@ "from": "libqp@1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz" }, - "livereload-js": { - "version": "2.3.0", - "from": "livereload-js@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "from": "load-json-file@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "dev": true, - "dependencies": { - "pify": { - "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.3.0", - "from": "loader-runner@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "dev": true - }, "loader-utils": { "version": "1.1.0", "from": "loader-utils@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "dev": true, "dependencies": { "json5": { "version": "0.5.1", "from": "json5@^0.5.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" } } }, @@ -6265,12 +1828,6 @@ "from": "loads@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/loads/-/loads-0.0.4.tgz" }, - "locate-path": { - "version": "2.0.0", - "from": "locate-path@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "dev": true - }, "lodash": { "version": "4.17.4", "from": "lodash@>=4.13.1 <5.0.0", @@ -6306,12 +1863,6 @@ "from": "lodash.difference@>=4.5.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" }, - "lodash.escaperegexp": { - "version": "4.1.2", - "from": "lodash.escaperegexp@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "dev": true - }, "lodash.flatten": { "version": "4.4.0", "from": "lodash.flatten@>=4.4.0 <5.0.0", @@ -6367,18 +1918,6 @@ "from": "lodash.keys@>=4.2.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz" }, - "lodash.memoize": { - "version": "3.0.4", - "from": "lodash.memoize@>=3.0.3 <3.1.0", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.0", - "from": "lodash.mergewith@>=4.6.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "dev": true - }, "lodash.noop": { "version": "3.0.1", "from": "lodash.noop@>=3.0.1 <4.0.0", @@ -6419,144 +1958,6 @@ "from": "lodash.values@>=4.3.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" }, - "log-symbols": { - "version": "2.2.0", - "from": "log-symbols@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@^3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.1", - "from": "chalk@^2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "from": "has-flag@^3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "5.2.0", - "from": "supports-color@^5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "dev": true - } - } - }, - "log4js": { - "version": "2.5.3", - "from": "log4js@>=2.3.9 <3.0.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.5.3.tgz", - "dev": true, - "dependencies": { - "addressparser": { - "version": "1.0.1", - "from": "addressparser@1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "dev": true, - "optional": true - }, - "buildmail": { - "version": "4.0.1", - "from": "buildmail@4.0.1", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", - "dev": true, - "optional": true - }, - "debug": { - "version": "3.1.0", - "from": "debug@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "dev": true - }, - "iconv-lite": { - "version": "0.4.15", - "from": "iconv-lite@0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "dev": true - }, - "libmime": { - "version": "3.0.0", - "from": "libmime@3.0.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", - "dev": true - }, - "mailcomposer": { - "version": "4.0.1", - "from": "mailcomposer@4.0.1", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", - "dev": true, - "optional": true - }, - "nodemailer": { - "version": "2.7.2", - "from": "nodemailer@>=2.5.0 <3.0.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", - "dev": true, - "optional": true - }, - "nodemailer-direct-transport": { - "version": "3.3.2", - "from": "nodemailer-direct-transport@3.3.2", - "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", - "dev": true, - "optional": true - }, - "nodemailer-fetch": { - "version": "1.6.0", - "from": "nodemailer-fetch@1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "dev": true - }, - "nodemailer-shared": { - "version": "1.1.0", - "from": "nodemailer-shared@1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", - "dev": true - }, - "nodemailer-smtp-pool": { - "version": "2.8.2", - "from": "nodemailer-smtp-pool@2.8.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", - "dev": true, - "optional": true - }, - "nodemailer-smtp-transport": { - "version": "2.7.2", - "from": "nodemailer-smtp-transport@2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", - "dev": true, - "optional": true - }, - "nodemailer-wellknown": { - "version": "0.1.10", - "from": "nodemailer-wellknown@0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "dev": true - }, - "smtp-connection": { - "version": "2.12.0", - "from": "smtp-connection@2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "dev": true - }, - "socks": { - "version": "1.1.9", - "from": "socks@1.1.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", - "dev": true, - "optional": true - } - } - }, "logger-sharelatex": { "version": "1.5.7", "from": "git+https://github.com/sharelatex/logger-sharelatex.git#master", @@ -6788,158 +2189,6 @@ } } }, - "loggly": { - "version": "1.1.1", - "from": "loggly@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "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", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "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", - "dev": true, - "optional": true - }, - "bl": { - "version": "1.1.2", - "from": "bl@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "dev": true, - "optional": true - }, - "boom": { - "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "from": "caseless@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "dev": true, - "optional": true - }, - "commander": { - "version": "2.14.1", - "from": "commander@>=2.9.0 <3.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.0.0", - "from": "form-data@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "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", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "from": "hawk@>=3.1.3 <3.2.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "dev": true, - "optional": true - }, - "hoek": { - "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "from": "http-signature@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true, - "optional": true - }, - "node-uuid": { - "version": "1.4.8", - "from": "node-uuid@>=1.4.7 <1.5.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.2.3", - "from": "qs@>=6.2.0 <6.3.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@>=2.0.5 <2.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "dev": true, - "optional": true - }, - "request": { - "version": "2.75.0", - "from": "request@>=2.75.0 <2.76.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.4.3", - "from": "tunnel-agent@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "dev": true, - "optional": true - } - } - }, - "loglevel": { - "version": "1.6.1", - "from": "loglevel@>=1.4.1 <2.0.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "dev": true - }, - "lolex": { - "version": "1.3.2", - "from": "lolex@1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "dev": true - }, "longest": { "version": "1.0.1", "from": "longest@>=1.0.1 <2.0.0", @@ -6950,24 +2199,6 @@ "from": "loose-envify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" }, - "loud-rejection": { - "version": "1.6.0", - "from": "loud-rejection@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.0", - "from": "lowercase-keys@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "dev": true - }, - "lpad": { - "version": "0.1.0", - "from": "lpad@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz", - "dev": true - }, "lru-cache": { "version": "2.7.3", "from": "lru-cache@>=2.0.0 <3.0.0", @@ -6988,210 +2219,21 @@ "from": "mailcomposer@3.3.2", "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.3.2.tgz" }, - "mailgun-js": { - "version": "0.7.15", - "from": "mailgun-js@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.7.15.tgz", - "dev": true, - "optional": true, - "dependencies": { - "async": { - "version": "2.1.5", - "from": "async@>=2.1.2 <2.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.5.tgz", - "dev": true, - "optional": true - }, - "debug": { - "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "from": "form-data@>=2.1.1 <2.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "dev": true, - "optional": true - }, - "inflection": { - "version": "1.10.0", - "from": "inflection@>=1.10.0 <1.11.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.10.0.tgz", - "dev": true, - "optional": true - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "dev": true, - "optional": true - }, - "q": { - "version": "1.4.1", - "from": "q@>=1.4.0 <1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "dev": true, - "optional": true - } - } - }, - "make-dir": { - "version": "1.1.0", - "from": "make-dir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "dev": true - }, "mandrill-api": { "version": "1.0.45", "from": "mandrill-api@>=1.0.45 <2.0.0", "resolved": "https://registry.npmjs.org/mandrill-api/-/mandrill-api-1.0.45.tgz" }, - "map-cache": { - "version": "0.2.2", - "from": "map-cache@>=0.2.2 <0.3.0", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "from": "map-obj@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "from": "map-stream@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "from": "map-visit@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "dev": true - }, "marked": { "version": "0.3.12", "from": "marked@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz" }, - "md5.js": { - "version": "1.3.4", - "from": "md5.js@>=1.3.4 <2.0.0", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "dev": true, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "from": "hash-base@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "dev": true - } - } - }, "media-typer": { "version": "0.3.0", "from": "media-typer@0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, - "mem": { - "version": "1.1.0", - "from": "mem@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "from": "memory-fs@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "meow": { - "version": "3.7.0", - "from": "meow@>=3.3.0 <4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "dev": true, - "dependencies": { - "find-up": { - "version": "1.1.2", - "from": "find-up@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "from": "load-json-file@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "from": "minimist@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "from": "path-exists@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "from": "path-type@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "dev": true - }, - "pify": { - "version": "2.3.0", - "from": "pify@^2.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "from": "read-pkg@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "from": "read-pkg-up@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "dev": true - } - } - }, "merge-descriptors": { "version": "1.0.0", "from": "merge-descriptors@1.0.0", @@ -7236,31 +2278,11 @@ } } }, - "micromatch": { - "version": "3.1.5", - "from": "micromatch@>=3.1.4 <4.0.0", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "from": "kind-of@>=6.0.0 <7.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "dev": true - } - } - }, "microtime-nodejs": { "version": "1.0.0", "from": "microtime-nodejs@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/microtime-nodejs/-/microtime-nodejs-1.0.0.tgz" }, - "miller-rabin": { - "version": "4.0.1", - "from": "miller-rabin@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "dev": true - }, "mime": { "version": "1.3.4", "from": "mime@1.3.4", @@ -7281,24 +2303,6 @@ "from": "mimelib@0.2.14", "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.2.14.tgz" }, - "mimic-fn": { - "version": "1.1.0", - "from": "mimic-fn@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "from": "minimalistic-crypto-utils@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "dev": true - }, "minimatch": { "version": "0.2.14", "from": "minimatch@>=0.2.12 <0.3.0", @@ -7309,20 +2313,6 @@ "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, - "mixin-deep": { - "version": "1.3.0", - "from": "mixin-deep@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", - "dev": true, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "from": "is-extendable@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "dev": true - } - } - }, "mkdirp": { "version": "0.5.1", "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -7375,38 +2365,6 @@ } } }, - "module-deps": { - "version": "4.1.1", - "from": "module-deps@>=4.0.8 <5.0.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, "moment": { "version": "2.20.1", "from": "moment@>=2.10.6 <3.0.0", @@ -7582,37 +2540,11 @@ } } }, - "multicast-dns": { - "version": "6.2.3", - "from": "multicast-dns@>=6.0.1 <7.0.0", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "dev": true, - "dependencies": { - "thunky": { - "version": "1.0.2", - "from": "thunky@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "dev": true - } - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "from": "multicast-dns-service-types@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "dev": true - }, "muri": { "version": "1.2.2", "from": "muri@1.2.2", "resolved": "https://registry.npmjs.org/muri/-/muri-1.2.2.tgz" }, - "mute-stream": { - "version": "0.0.7", - "from": "mute-stream@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "dev": true - }, "mv": { "version": "0.0.5", "from": "mv@0.0.5", @@ -7624,46 +2556,6 @@ "from": "nan@2.3.5", "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" }, - "nanomatch": { - "version": "1.2.7", - "from": "nanomatch@>=1.2.5 <2.0.0", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.2 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "from": "natural-compare@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "dev": true - }, - "nconf": { - "version": "0.6.9", - "from": "nconf@>=0.6.9 <0.7.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.6.9.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.2.9", - "from": "async@0.2.9", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz", - "dev": true - }, - "optimist": { - "version": "0.6.0", - "from": "optimist@0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", - "dev": true - } - } - }, "ncp": { "version": "2.0.0", "from": "ncp@>=2.0.0 <2.1.0", @@ -7675,13 +2567,6 @@ "from": "negotiator@0.5.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" }, - "netmask": { - "version": "1.0.6", - "from": "netmask@>=1.0.4 <1.1.0", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "dev": true, - "optional": true - }, "nise": { "version": "1.2.2", "from": "nise@>=1.2.0 <2.0.0", @@ -7724,46 +2609,6 @@ "from": "node-html-encoder@0.0.2", "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz" }, - "node-libs-browser": { - "version": "2.1.0", - "from": "node-libs-browser@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@^1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - }, - "url": { - "version": "0.11.0", - "from": "url@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "dev": true, - "dependencies": { - "punycode": { - "version": "1.3.2", - "from": "punycode@1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "dev": true - } - } - } - } - }, "node-pre-gyp": { "version": "0.6.30", "from": "node-pre-gyp@0.6.30", @@ -7843,109 +2688,26 @@ "from": "nodemailer-wellknown@0.1.7", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.7.tgz" }, - "nodemon": { - "version": "1.14.11", - "from": "nodemon@>=1.14.3 <2.0.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.14.11.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "3.1.0", - "from": "debug@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "semver": { - "version": "5.5.0", - "from": "semver@>=5.4.1 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "dev": true - } - } - }, - "nomnom": { - "version": "1.6.2", - "from": "nomnom@>=1.6.0 <1.7.0", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "dev": true, - "dependencies": { - "colors": { - "version": "0.5.1", - "from": "colors@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "dev": true - }, - "underscore": { - "version": "1.4.4", - "from": "underscore@>=1.4.4 <1.5.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "dev": true - } - } - }, "nopt": { "version": "3.0.6", "from": "nopt@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" }, - "normalize-package-data": { - "version": "2.4.0", - "from": "normalize-package-data@>=2.3.2 <3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "dev": true - }, - "normalize-path": { - "version": "2.1.1", - "from": "normalize-path@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "from": "normalize-range@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "from": "npm-run-path@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "dev": true - }, "npmlog": { "version": "4.1.2", "from": "npmlog@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" }, - "nssocket": { - "version": "0.5.3", - "from": "nssocket@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.5.3.tgz", - "dev": true - }, - "null-check": { - "version": "1.0.0", - "from": "null-check@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "from": "num2fraction@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "dev": true - }, "number-is-nan": { "version": "1.0.1", "from": "number-is-nan@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" }, + "nvd3": { + "version": "1.8.6", + "from": "nvd3@latest", + "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz" + }, "oauth": { "version": "0.9.15", "from": "oauth@>=0.9.0 <0.10.0", @@ -7961,82 +2723,6 @@ "from": "object-assign@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" }, - "object-component": { - "version": "0.0.3", - "from": "object-component@0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "from": "object-copy@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "dev": true, - "dependencies": { - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - } - } - } - } - }, - "object-keys": { - "version": "1.0.11", - "from": "object-keys@>=1.0.8 <2.0.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "from": "object-visit@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "from": "object.omit@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "dev": true - }, - "object.pick": { - "version": "1.3.0", - "from": "object.pick@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "dev": true - }, - "obuf": { - "version": "1.1.1", - "from": "obuf@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "dev": true - }, "on-finished": { "version": "2.3.0", "from": "on-finished@>=2.3.0 <2.4.0", @@ -8057,216 +2743,16 @@ "from": "one-time@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz" }, - "onesky": { - "version": "0.1.6", - "from": "onesky@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/onesky/-/onesky-0.1.6.tgz", - "dev": true, - "dependencies": { - "asn1": { - "version": "0.1.11", - "from": "asn1@0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "dev": true, - "optional": true - }, - "async": { - "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "dev": true, - "optional": true - }, - "boom": { - "version": "0.4.2", - "from": "boom@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "dev": true - }, - "combined-stream": { - "version": "0.0.7", - "from": "combined-stream@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "0.2.2", - "from": "cryptiles@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "0.0.5", - "from": "delayed-stream@0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.5.2", - "from": "forever-agent@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "dev": true - }, - "form-data": { - "version": "0.1.4", - "from": "form-data@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "dev": true, - "optional": true - }, - "hawk": { - "version": "1.1.1", - "from": "hawk@1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", - "dev": true, - "optional": true - }, - "hoek": { - "version": "0.9.1", - "from": "hoek@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "dev": true - }, - "http-signature": { - "version": "0.10.1", - "from": "http-signature@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "dev": true, - "optional": true - }, - "mime": { - "version": "1.2.11", - "from": "mime@~1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "1.0.2", - "from": "mime-types@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "dev": true - }, - "node-uuid": { - "version": "1.4.8", - "from": "node-uuid@>=1.4.0 <1.5.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "dev": true - }, - "oauth-sign": { - "version": "0.3.0", - "from": "oauth-sign@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "dev": true, - "optional": true - }, - "qs": { - "version": "1.0.2", - "from": "qs@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", - "dev": true - }, - "request": { - "version": "2.40.0", - "from": "request@>=2.40.0 <2.41.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", - "dev": true - }, - "sntp": { - "version": "0.2.4", - "from": "sntp@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.4.3", - "from": "tunnel-agent@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "dev": true, - "optional": true - } - } - }, - "onetime": { - "version": "2.0.1", - "from": "onetime@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "dev": true - }, - "opn": { - "version": "5.2.0", - "from": "opn@>=5.1.0 <6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", - "dev": true - }, "optimist": { "version": "0.6.1", "from": "optimist@0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz" }, - "optionator": { - "version": "0.8.2", - "from": "optionator@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "dev": true, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "from": "wordwrap@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "dev": true - } - } - }, - "original": { - "version": "1.0.0", - "from": "original@>=0.0.5", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "dev": true, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "from": "url-parse@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "dev": true - } - } - }, - "os-browserify": { - "version": "0.3.0", - "from": "os-browserify@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "dev": true - }, "os-homedir": { "version": "1.0.2", "from": "os-homedir@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" }, - "os-locale": { - "version": "2.1.0", - "from": "os-locale@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "dev": true - }, "os-tmpdir": { "version": "1.0.2", "from": "os-tmpdir@>=1.0.0 <2.0.0", @@ -8277,153 +2763,16 @@ "from": "osenv@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz" }, - "p-finally": { - "version": "1.0.0", - "from": "p-finally@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "from": "p-limit@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "from": "p-locate@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "dev": true - }, - "p-map": { - "version": "1.2.0", - "from": "p-map@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "from": "p-try@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "dev": true - }, - "pac-proxy-agent": { - "version": "1.1.0", - "from": "pac-proxy-agent@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz", - "dev": true, - "optional": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true, - "optional": true - } - } - }, - "pac-resolver": { - "version": "2.0.0", - "from": "pac-resolver@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz", - "dev": true, - "optional": true, - "dependencies": { - "co": { - "version": "3.0.6", - "from": "co@>=3.0.6 <3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", - "dev": true, - "optional": true - }, - "ip": { - "version": "1.0.1", - "from": "ip@1.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz", - "dev": true, - "optional": true - } - } - }, - "package-json": { - "version": "4.0.1", - "from": "package-json@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "dev": true - }, - "pako": { - "version": "1.0.6", - "from": "pako@>=1.0.5 <1.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "dev": true - }, - "parents": { - "version": "1.0.1", - "from": "parents@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "dev": true - }, - "parse-asn1": { - "version": "5.1.0", - "from": "parse-asn1@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "from": "parse-glob@>=3.0.4 <4.0.0", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@^1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "from": "is-glob@^2.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true - } - } - }, - "parse-json": { - "version": "2.2.0", - "from": "parse-json@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "dev": true - }, "parse-mongo-url": { "version": "1.1.1", "from": "parse-mongo-url@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/parse-mongo-url/-/parse-mongo-url-1.1.1.tgz" }, - "parseqs": { - "version": "0.0.5", - "from": "parseqs@0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "dev": true - }, - "parseuri": { - "version": "0.0.5", - "from": "parseuri@0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "dev": true - }, "parseurl": { "version": "1.3.2", "from": "parseurl@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" }, - "pascalcase": { - "version": "0.1.1", - "from": "pascalcase@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "dev": true - }, "passport": { "version": "0.3.2", "from": "passport@>=0.3.2 <0.4.0", @@ -8483,87 +2832,21 @@ "from": "passport-strategy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" }, - "path-browserify": { - "version": "0.0.0", - "from": "path-browserify@0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "from": "path-dirname@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "from": "path-exists@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" }, - "path-is-inside": { - "version": "1.0.2", - "from": "path-is-inside@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "from": "path-key@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "dev": true - }, "path-parse": { "version": "1.0.5", "from": "path-parse@>=1.0.5 <2.0.0", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" }, - "path-platform": { - "version": "0.11.15", - "from": "path-platform@>=0.11.15 <0.12.0", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "dev": true - }, - "path-proxy": { - "version": "1.0.0", - "from": "path-proxy@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", - "dev": true, - "optional": true, - "dependencies": { - "inflection": { - "version": "1.3.8", - "from": "inflection@>=1.3.0 <1.4.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", - "dev": true, - "optional": true - } - } - }, "path-to-regexp": { "version": "0.1.6", "from": "path-to-regexp@0.1.6", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.6.tgz" }, - "path-type": { - "version": "2.0.0", - "from": "path-type@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "dev": true, - "dependencies": { - "pify": { - "version": "2.3.0", - "from": "pify@^2.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - } - } - }, "pathval": { "version": "1.1.0", "from": "pathval@>=1.0.0 <2.0.0", @@ -8574,18 +2857,6 @@ "from": "pause@0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" }, - "pause-stream": { - "version": "0.0.11", - "from": "pause-stream@0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "dev": true - }, - "pbkdf2": { - "version": "3.0.14", - "from": "pbkdf2@>=3.0.3 <4.0.0", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "dev": true - }, "pend": { "version": "1.2.0", "from": "pend@>=1.2.0 <1.3.0", @@ -8596,47 +2867,11 @@ "from": "performance-now@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" }, - "pify": { - "version": "3.0.0", - "from": "pify@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "from": "pkg-dir@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "from": "pkginfo@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "dev": true - }, "platform": { "version": "1.3.5", "from": "platform@1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz" }, - "pluralize": { - "version": "7.0.0", - "from": "pluralize@>=7.0.0 <8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "dev": true - }, "pooling": { "version": "0.4.6", "from": "pooling@0.4.6", @@ -8654,109 +2889,21 @@ } } }, - "portfinder": { - "version": "1.0.13", - "from": "portfinder@>=1.0.9 <2.0.0", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "1.5.2", - "from": "async@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "dev": true - }, - "debug": { - "version": "2.6.9", - "from": "debug@^2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "from": "posix-character-classes@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "from": "postcss@>=5.2.16 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.5.7", - "from": "source-map@>=0.5.6 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "from": "postcss-value-parser@>=3.2.3 <4.0.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "dev": true - }, "precond": { "version": "0.2.3", "from": "precond@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" }, - "prelude-ls": { - "version": "1.1.2", - "from": "prelude-ls@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "from": "prepend-http@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "from": "preserve@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "dev": true - }, - "private": { - "version": "0.1.8", - "from": "private@>=0.1.7 <0.2.0", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "dev": true - }, - "process": { - "version": "0.11.10", - "from": "process@>=0.11.10 <0.12.0", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "dev": true - }, "process-nextick-args": { "version": "1.0.7", "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" }, - "progress": { - "version": "2.0.0", - "from": "progress@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "dev": true - }, "promise": { "version": "2.0.0", "from": "promise@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz" }, - "prompt": { - "version": "0.2.14", - "from": "prompt@0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "dev": true - }, "prop-types": { "version": "15.6.1", "from": "prop-types@>=15.5.10 <16.0.0", @@ -8767,72 +2914,11 @@ "from": "proxy-addr@>=1.0.8 <1.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz" }, - "proxy-agent": { - "version": "2.0.0", - "from": "proxy-agent@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz", - "dev": true, - "optional": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "2.6.5", - "from": "lru-cache@>=2.6.5 <2.7.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", - "dev": true, - "optional": true - } - } - }, - "prr": { - "version": "1.0.1", - "from": "prr@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "dev": true - }, - "ps-tree": { - "version": "0.0.3", - "from": "ps-tree@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-0.0.3.tgz", - "dev": true - }, "pseudomap": { "version": "1.0.2", "from": "pseudomap@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" }, - "pstree.remy": { - "version": "1.1.0", - "from": "pstree.remy@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", - "dev": true, - "dependencies": { - "event-stream": { - "version": "3.3.4", - "from": "event-stream@>=3.3.0 <3.4.0", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "dev": true - }, - "ps-tree": { - "version": "1.1.0", - "from": "ps-tree@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "dev": true - } - } - }, - "public-encrypt": { - "version": "4.0.0", - "from": "public-encrypt@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "dev": true - }, "pug": { "version": "2.0.0-rc.4", "from": "pug@>=2.0.0-beta6 <3.0.0", @@ -8961,12 +3047,6 @@ "from": "q@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz" }, - "qjobs": { - "version": "1.1.5", - "from": "qjobs@>=1.1.4 <2.0.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", - "dev": true - }, "qs": { "version": "6.5.1", "from": "qs@>=6.5.1 <6.6.0", @@ -8977,49 +3057,11 @@ "from": "querystring@0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" }, - "querystring-es3": { - "version": "0.2.1", - "from": "querystring-es3@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "dev": true - }, - "querystringify": { - "version": "0.0.4", - "from": "querystringify@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "dev": true - }, "random-bytes": { "version": "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" }, - "randomatic": { - "version": "1.1.7", - "from": "randomatic@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "from": "kind-of@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "dev": true - } - } - }, - "randombytes": { - "version": "2.0.6", - "from": "randombytes@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "dev": true - }, - "randomfill": { - "version": "1.0.3", - "from": "randomfill@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "dev": true - }, "range-parser": { "version": "1.0.3", "from": "range-parser@>=1.0.2 <1.1.0", @@ -9076,56 +3118,6 @@ "from": "react-dom@>=15.4.2 <16.0.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz" }, - "read": { - "version": "1.0.7", - "from": "read@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "dev": true - }, - "read-only-stream": { - "version": "2.0.0", - "from": "read-only-stream@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "read-pkg": { - "version": "2.0.0", - "from": "read-pkg@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "dev": true - }, - "read-pkg-up": { - "version": "2.0.0", - "from": "read-pkg-up@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "dev": true - }, "readable-stream": { "version": "1.0.34", "from": "readable-stream@>=1.0.24 <1.1.0", @@ -9136,12 +3128,6 @@ "from": "readdirp@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-0.2.5.tgz" }, - "redent": { - "version": "1.0.0", - "from": "redent@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "dev": true - }, "redis": { "version": "2.8.0", "from": "redis@>=2.1.0 <3.0.0", @@ -9211,116 +3197,16 @@ "from": "referrer-policy@1.1.0", "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz" }, - "regenerate": { - "version": "1.3.3", - "from": "regenerate@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "from": "regenerator-runtime@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "from": "regenerator-transform@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "from": "regex-cache@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "dev": true - }, - "regex-not": { - "version": "1.0.0", - "from": "regex-not@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", - "dev": true - }, "regexp-clone": { "version": "0.0.1", "from": "regexp-clone@0.0.1", "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz" }, - "regexpu-core": { - "version": "2.0.0", - "from": "regexpu-core@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "dev": true - }, - "registry-auth-token": { - "version": "3.3.2", - "from": "registry-auth-token@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "dev": true - }, - "registry-url": { - "version": "3.1.0", - "from": "registry-url@>=3.0.3 <4.0.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "dev": true - }, - "regjsgen": { - "version": "0.2.0", - "from": "regjsgen@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "from": "regjsparser@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "dev": true, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "from": "jsesc@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "from": "remove-trailing-separator@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "from": "repeat-element@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "dev": true - }, "repeat-string": { "version": "1.6.1", "from": "repeat-string@>=1.5.2 <2.0.0", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" }, - "repeating": { - "version": "2.0.1", - "from": "repeating@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "dev": true - }, - "replace": { - "version": "0.2.10", - "from": "replace@>=0.2.4 <0.3.0", - "resolved": "https://registry.npmjs.org/replace/-/replace-0.2.10.tgz", - "dev": true, - "dependencies": { - "colors": { - "version": "0.5.1", - "from": "colors@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "dev": true - } - } - }, "request": { "version": "2.83.0", "from": "request@>=2.69.0 <3.0.0", @@ -9348,43 +3234,11 @@ "from": "require_optional@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz" }, - "require-directory": { - "version": "2.1.1", - "from": "require-directory@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "dev": true - }, "require-like": { "version": "0.1.2", "from": "require-like@0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" }, - "require-main-filename": { - "version": "1.0.1", - "from": "require-main-filename@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "from": "require-uncached@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "dev": true, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "from": "resolve-from@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "dev": true - } - } - }, - "requirejs": { - "version": "2.1.22", - "from": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz", - "dev": true - }, "requires-port": { "version": "1.0.0", "from": "requires-port@>=1.0.0 <2.0.0", @@ -9395,37 +3249,11 @@ "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz" }, - "resolve-cwd": { - "version": "2.0.0", - "from": "resolve-cwd@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "dev": true, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "from": "resolve-from@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "dev": true - } - } - }, "resolve-from": { "version": "2.0.0", "from": "resolve-from@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz" }, - "resolve-url": { - "version": "0.2.1", - "from": "resolve-url@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "from": "restore-cursor@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "dev": true - }, "retry-as-promised": { "version": "2.3.2", "from": "retry-as-promised@>=2.0.0 <3.0.0", @@ -9443,12 +3271,6 @@ } } }, - "revalidator": { - "version": "0.1.8", - "from": "revalidator@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "dev": true - }, "right-align": { "version": "0.1.3", "from": "right-align@>=0.1.1 <0.2.0", @@ -9459,12 +3281,6 @@ "from": "rimraf@2.2.6", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" }, - "ripemd160": { - "version": "2.0.1", - "from": "ripemd160@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "dev": true - }, "rndm": { "version": "1.2.0", "from": "rndm@1.2.0", @@ -9475,32 +3291,6 @@ "from": "git+https://github.com/ShaneKilkelly/rolling-rate-limiter.git#master", "resolved": "git+https://github.com/ShaneKilkelly/rolling-rate-limiter.git#8a1a2cd8aaf9cd1a75cc81317b7f261157be2149" }, - "run-async": { - "version": "2.3.0", - "from": "run-async@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "dev": true, - "dependencies": { - "is-promise": { - "version": "2.1.0", - "from": "is-promise@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "dev": true - } - } - }, - "rx-lite": { - "version": "4.0.8", - "from": "rx-lite@>=4.0.8 <5.0.0", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "from": "rx-lite-aggregates@>=4.0.8 <5.0.0", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "dev": true - }, "safe-buffer": { "version": "5.1.1", "from": "safe-buffer@>=5.1.1 <5.2.0", @@ -9517,72 +3307,6 @@ "from": "samsam@1.1.2", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz" }, - "sandboxed-module": { - "version": "0.2.0", - "from": "sandboxed-module@0.2.0", - "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-0.2.0.tgz", - "dev": true, - "dependencies": { - "stack-trace": { - "version": "0.0.6", - "from": "stack-trace@0.0.6", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.6.tgz", - "dev": true - } - } - }, - "sanitize-html": { - "version": "1.17.0", - "from": "sanitize-html@>=1.14.1 <2.0.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.17.0.tgz", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.0", - "from": "chalk@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "from": "has-flag@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "dev": true - }, - "postcss": { - "version": "6.0.16", - "from": "postcss@>=6.0.14 <7.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "dev": true, - "dependencies": { - "supports-color": { - "version": "5.1.0", - "from": "supports-color@>=5.1.0 <6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "from": "source-map@>=0.6.1 <0.7.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "from": "supports-color@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "dev": true - } - } - }, "sanitizer": { "version": "0.1.1", "from": "sanitizer@0.1.1", @@ -9593,37 +3317,11 @@ "from": "sax@1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" }, - "select-hose": { - "version": "2.0.0", - "from": "select-hose@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "dev": true - }, - "selfsigned": { - "version": "1.10.2", - "from": "selfsigned@>=1.9.1 <2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", - "dev": true, - "dependencies": { - "node-forge": { - "version": "0.7.1", - "from": "node-forge@0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "dev": true - } - } - }, "semver": { "version": "5.3.0", "from": "semver@>=5.3.0 <5.4.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" }, - "semver-diff": { - "version": "2.1.0", - "from": "semver-diff@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "dev": true - }, "send": { "version": "0.13.0", "from": "send@0.13.0", @@ -9685,38 +3383,6 @@ } } }, - "serve-index": { - "version": "1.9.1", - "from": "serve-index@>=1.7.2 <2.0.0", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "dev": true, - "dependencies": { - "accepts": { - "version": "1.3.4", - "from": "accepts@~1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "dev": true - }, - "debug": { - "version": "2.6.9", - "from": "debug@2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "from": "escape-html@~1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "from": "negotiator@0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "dev": true - } - } - }, "serve-static": { "version": "1.10.3", "from": "serve-static@>=1.10.0 <1.11.0", @@ -9764,24 +3430,6 @@ "from": "set-blocking@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" }, - "set-getter": { - "version": "0.1.0", - "from": "set-getter@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "from": "set-immediate-shim@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "from": "set-value@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "dev": true - }, "setimmediate": { "version": "1.0.5", "from": "setimmediate@>=1.0.4 <2.0.0", @@ -9804,44 +3452,6 @@ } } }, - "sha.js": { - "version": "2.4.10", - "from": "sha.js@>=2.4.0 <3.0.0", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "dev": true - }, - "shasum": { - "version": "1.0.2", - "from": "shasum@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "dev": true, - "dependencies": { - "json-stable-stringify": { - "version": "0.0.1", - "from": "json-stable-stringify@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "dev": true - } - } - }, - "shebang-command": { - "version": "1.2.0", - "from": "shebang-command@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "dev": true - }, - "shebang-regex": { - "version": "1.0.0", - "from": "shebang-regex@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "dev": true - }, - "shell-quote": { - "version": "1.6.1", - "from": "shell-quote@>=1.6.1 <2.0.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "dev": true - }, "shimmer": { "version": "1.1.0", "from": "shimmer@1.1.0", @@ -9857,61 +3467,16 @@ "from": "signal-exit@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" }, - "sinon": { - "version": "1.17.7", - "from": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "dev": true - }, - "sinon-chai": { - "version": "2.14.0", - "from": "sinon-chai@latest", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "dev": true - }, "sixpack-client": { "version": "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" }, - "slack-node": { - "version": "0.2.0", - "from": "slack-node@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", - "dev": true, - "optional": true - }, - "slash": { - "version": "1.0.0", - "from": "slash@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "from": "slice-ansi@1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@^2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - } - } - }, "sliced": { "version": "1.0.1", "from": "sliced@1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz" }, - "smart-buffer": { - "version": "1.1.15", - "from": "smart-buffer@>=1.0.13 <2.0.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "dev": true - }, "smtp-connection": { "version": "2.0.1", "from": "smtp-connection@2.0.1", @@ -9922,320 +3487,16 @@ "from": "smtpapi@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/smtpapi/-/smtpapi-1.3.1.tgz" }, - "snapdragon": { - "version": "0.8.1", - "from": "snapdragon@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@^0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "from": "snapdragon-node@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "dev": true - }, - "snapdragon-util": { - "version": "3.0.1", - "from": "snapdragon-util@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "dev": true - }, "sntp": { "version": "2.1.0", "from": "sntp@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz" }, - "socket.io": { - "version": "2.0.4", - "from": "socket.io@2.0.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@~2.6.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "from": "socket.io-adapter@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "dev": true - }, - "socket.io-client": { - "version": "2.0.4", - "from": "socket.io-client@2.0.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@~2.6.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "3.1.2", - "from": "socket.io-parser@>=3.1.1 <3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@~2.6.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "isarray": { - "version": "2.0.1", - "from": "isarray@2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "dev": true - } - } - }, - "sockjs": { - "version": "0.3.19", - "from": "sockjs@0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "dev": true - }, - "sockjs-client": { - "version": "1.1.4", - "from": "sockjs-client@1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@^2.6.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "faye-websocket": { - "version": "0.11.1", - "from": "faye-websocket@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "dev": true - } - } - }, - "socks": { - "version": "1.1.10", - "from": "socks@>=1.1.5 <1.2.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "dev": true - }, - "socks-proxy-agent": { - "version": "2.1.1", - "from": "socks-proxy-agent@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz", - "dev": true - }, - "source-list-map": { - "version": "2.0.0", - "from": "source-list-map@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "dev": true - }, "source-map": { "version": "0.1.34", "from": "source-map@0.1.34", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz" }, - "source-map-resolve": { - "version": "0.5.1", - "from": "source-map-resolve@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "from": "source-map-support@>=0.4.15 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.5.7", - "from": "source-map@^0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "from": "source-map-url@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "from": "spdx-correct@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "dev": true - }, - "spdx-expression-parse": { - "version": "1.0.4", - "from": "spdx-expression-parse@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "from": "spdx-license-ids@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "dev": true - }, - "spdy": { - "version": "3.4.7", - "from": "spdy@>=3.4.1 <4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@^2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "spdy-transport": { - "version": "2.0.20", - "from": "spdy-transport@>=2.0.18 <3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@^2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "split": { - "version": "0.3.3", - "from": "split@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "from": "split-string@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "dev": true, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "from": "extend-shallow@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "from": "is-extendable@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "from": "sprintf-js@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "dev": true - }, - "srcset": { - "version": "1.0.0", - "from": "srcset@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", - "dev": true - }, "sshpk": { "version": "1.13.1", "from": "sshpk@>=1.7.0 <2.0.0", @@ -10246,60 +3507,6 @@ "from": "stack-trace@0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" }, - "static-extend": { - "version": "0.1.2", - "from": "static-extend@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "dev": true, - "dependencies": { - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - } - } - }, "statsd-parser": { "version": "0.0.4", "from": "statsd-parser@>=0.0.4 <0.1.0", @@ -10310,166 +3517,6 @@ "from": "statuses@>=1.3.1 <2.0.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" }, - "stream-browserify": { - "version": "2.0.1", - "from": "stream-browserify@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "stream-combiner": { - "version": "0.0.4", - "from": "stream-combiner@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "dev": true - }, - "stream-combiner2": { - "version": "1.1.1", - "from": "stream-combiner2@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "stream-http": { - "version": "2.8.0", - "from": "stream-http@>=2.7.2 <3.0.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "stream-splicer": { - "version": "2.0.0", - "from": "stream-splicer@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "streamroller": { - "version": "0.7.0", - "from": "streamroller@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "3.1.0", - "from": "debug@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@~2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, "streamsearch": { "version": "0.1.2", "from": "streamsearch@0.1.2", @@ -10495,117 +3542,11 @@ "from": "strip-ansi@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" }, - "strip-bom": { - "version": "3.0.0", - "from": "strip-bom@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "from": "strip-eof@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "from": "strip-indent@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "from": "strip-json-comments@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" }, - "subarg": { - "version": "1.0.0", - "from": "subarg@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - } - } - }, - "supports-color": { - "version": "3.2.3", - "from": "supports-color@>=3.2.3 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "dev": true - }, - "syntax-error": { - "version": "1.4.0", - "from": "syntax-error@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "dev": true - }, - "table": { - "version": "4.0.2", - "from": "table@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@^3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@^3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.1", - "from": "chalk@^2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "from": "has-flag@^3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@^2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "from": "string-width@^2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@^4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "5.2.0", - "from": "supports-color@^5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "dev": true - } - } - }, - "tapable": { - "version": "0.2.8", - "from": "tapable@>=0.2.7 <0.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "dev": true - }, "tar": { "version": "2.2.1", "from": "tar@>=2.2.0 <2.3.0", @@ -10663,12 +3604,6 @@ "from": "temp@>=0.8.3 <0.9.0", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" }, - "term-size": { - "version": "1.2.0", - "from": "term-size@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "dev": true - }, "terraformer": { "version": "1.0.8", "from": "terraformer@>=1.0.5 <1.1.0", @@ -10684,258 +3619,21 @@ "from": "text-encoding@>=0.6.4 <0.7.0", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz" }, - "text-table": { - "version": "0.2.0", - "from": "text-table@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "dev": true - }, - "through": { - "version": "2.3.8", - "from": "through@>=2.3.1 <2.4.0", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "dev": true - }, - "through2": { - "version": "2.0.3", - "from": "through2@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "dev": true, - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "from": "process-nextick-args@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "from": "readable-stream@^2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "thunkify": { - "version": "2.1.2", - "from": "thunkify@>=2.1.1 <2.2.0", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "dev": true, - "optional": true - }, "thunky": { "version": "0.1.0", "from": "thunky@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz" }, - "time-stamp": { - "version": "2.0.0", - "from": "time-stamp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "from": "timed-out@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "dev": true - }, "timekeeper": { "version": "2.0.0", "from": "timekeeper@", "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-2.0.0.tgz" }, - "timers-browserify": { - "version": "2.0.6", - "from": "timers-browserify@>=2.0.4 <3.0.0", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "dev": true - }, - "timespan": { - "version": "2.3.0", - "from": "timespan@>=2.3.0 <2.4.0", - "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", - "dev": true - }, - "tiny-lr": { - "version": "0.2.1", - "from": "tiny-lr@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", - "dev": true, - "dependencies": { - "body-parser": { - "version": "1.14.2", - "from": "body-parser@>=1.14.0 <1.15.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "dev": true, - "dependencies": { - "qs": { - "version": "5.2.0", - "from": "qs@5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "dev": true - } - } - }, - "bytes": { - "version": "2.2.0", - "from": "bytes@2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "dev": true - }, - "debug": { - "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "dev": true - }, - "http-errors": { - "version": "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", - "dev": true - }, - "iconv-lite": { - "version": "0.4.13", - "from": "iconv-lite@0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "dev": true - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "dev": true - }, - "qs": { - "version": "5.1.0", - "from": "qs@>=5.1.0 <5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "from": "raw-body@>=2.1.5 <2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "dev": true, - "dependencies": { - "bytes": { - "version": "2.4.0", - "from": "bytes@2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "dev": true - } - } - } - } - }, - "tmp": { - "version": "0.0.33", - "from": "tmp@0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "dev": true - }, - "to-array": { - "version": "0.1.4", - "from": "to-array@0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "from": "to-arraybuffer@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "from": "to-fast-properties@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "dev": true - }, "to-mongodb-core": { "version": "2.0.0", "from": "to-mongodb-core@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/to-mongodb-core/-/to-mongodb-core-2.0.0.tgz" }, - "to-object-path": { - "version": "0.3.0", - "from": "to-object-path@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "dev": true - }, - "to-regex": { - "version": "3.0.1", - "from": "to-regex@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", - "dev": true, - "dependencies": { - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "from": "to-regex-range@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "dev": true - }, "token-stream": { "version": "0.0.1", "from": "token-stream@0.0.1", @@ -10946,20 +3644,6 @@ "from": "toposort-class@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz" }, - "touch": { - "version": "3.1.0", - "from": "touch@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "dev": true, - "dependencies": { - "nopt": { - "version": "1.0.10", - "from": "nopt@>=1.0.10 <1.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "dev": true - } - } - }, "tough-cookie": { "version": "2.3.3", "from": "tough-cookie@>=2.3.3 <2.4.0", @@ -10982,43 +3666,11 @@ } } }, - "translations-sharelatex": { - "version": "0.1.4", - "from": "git+https://github.com/sharelatex/translations-sharelatex.git#master", - "resolved": "git+https://github.com/sharelatex/translations-sharelatex.git#6c9d95a6072b4d40621dacbf0f35fefc3469b4b1", - "dev": true, - "dependencies": { - "async": { - "version": "2.6.0", - "from": "async@>=2.1.4 <3.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "dev": true - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "from": "trim-newlines@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "from": "trim-right@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "dev": true - }, "tsscmp": { "version": "1.0.5", "from": "tsscmp@1.0.5", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz" }, - "tty-browserify": { - "version": "0.0.0", - "from": "tty-browserify@0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "from": "tunnel-agent@>=0.6.0 <0.7.0", @@ -11030,29 +3682,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "optional": true }, - "type-check": { - "version": "0.3.2", - "from": "type-check@>=0.3.2 <0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "dev": true - }, - "type-detect": { - "version": "1.0.0", - "from": "type-detect@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "dev": true - }, "type-is": { "version": "1.6.15", "from": "type-is@>=1.6.15 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz" }, - "typedarray": { - "version": "0.0.6", - "from": "typedarray@>=0.0.6 <0.0.7", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "dev": true - }, "ua-parser-js": { "version": "0.7.17", "from": "ua-parser-js@>=0.7.9 <0.8.0", @@ -11075,32 +3709,6 @@ "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" }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "from": "uglifyjs-webpack-plugin@>=0.4.6 <0.5.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.5.7", - "from": "source-map@^0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "from": "uglify-js@>=2.8.29 <3.0.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "from": "yargs@>=3.10.0 <3.11.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "dev": true - } - } - }, "uid-number": { "version": "0.0.6", "from": "uid-number@>=0.0.6 <0.1.0", @@ -11116,32 +3724,6 @@ "from": "uid2@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" }, - "ultron": { - "version": "1.1.1", - "from": "ultron@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "dev": true - }, - "umd": { - "version": "3.0.1", - "from": "umd@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", - "dev": true - }, - "undefsafe": { - "version": "2.0.1", - "from": "undefsafe@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.1.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, "underscore": { "version": "1.6.0", "from": "underscore@1.6.0", @@ -11152,26 +3734,6 @@ "from": "underscore.string@>=2.2.1 <2.3.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" }, - "union-value": { - "version": "1.0.0", - "from": "union-value@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "dev": true, - "dependencies": { - "set-value": { - "version": "0.4.3", - "from": "set-value@>=0.4.3 <0.5.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "dev": true - } - } - }, - "unique-string": { - "version": "1.0.0", - "from": "unique-string@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "dev": true - }, "universalify": { "version": "0.1.1", "from": "universalify@>=0.1.0 <0.2.0", @@ -11182,84 +3744,6 @@ "from": "unpipe@1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" }, - "unset-value": { - "version": "1.0.0", - "from": "unset-value@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "dev": true, - "dependencies": { - "has-value": { - "version": "0.3.1", - "from": "has-value@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "dev": true, - "dependencies": { - "isobject": { - "version": "2.1.0", - "from": "isobject@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "dev": true - } - } - }, - "has-values": { - "version": "0.1.4", - "from": "has-values@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - } - } - }, - "unzip-response": { - "version": "2.0.1", - "from": "unzip-response@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "dev": true - }, - "update-notifier": { - "version": "2.3.0", - "from": "update-notifier@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "from": "ansi-styles@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "dev": true - }, - "chalk": { - "version": "2.3.0", - "from": "chalk@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "from": "has-flag@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "from": "supports-color@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "from": "urix@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "dev": true - }, "url": { "version": "0.10.3", "from": "url@0.10.3", @@ -11272,139 +3756,11 @@ } } }, - "url-parse": { - "version": "1.2.0", - "from": "url-parse@>=1.1.8 <2.0.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", - "dev": true, - "dependencies": { - "querystringify": { - "version": "1.0.0", - "from": "querystringify@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "from": "url-parse-lax@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "dev": true - }, - "use": { - "version": "2.0.2", - "from": "use@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", - "dev": true, - "dependencies": { - "define-property": { - "version": "0.2.5", - "from": "define-property@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "from": "is-data-descriptor@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "dev": true - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "from": "is-descriptor@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "from": "kind-of@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "dev": true - }, - "lazy-cache": { - "version": "2.0.2", - "from": "lazy-cache@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "dev": true - } - } - }, - "useragent": { - "version": "2.3.0", - "from": "useragent@>=2.1.12 <3.0.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "dev": true, - "dependencies": { - "lru-cache": { - "version": "4.1.1", - "from": "lru-cache@>=4.1.0 <4.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "dev": true - } - } - }, - "util": { - "version": "0.10.3", - "from": "util@>=0.10.3 <1.0.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "dev": true, - "dependencies": { - "inherits": { - "version": "2.0.1", - "from": "inherits@2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, - "utile": { - "version": "0.2.1", - "from": "utile@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.2.10", - "from": "async@>=0.2.9 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "from": "ncp@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "dev": true - } - } - }, "utils-merge": { "version": "1.0.0", "from": "utils-merge@1.0.0", @@ -11415,13 +3771,6 @@ "from": "uuid@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz" }, - "uws": { - "version": "0.14.5", - "from": "uws@>=0.14.4 <0.15.0", - "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", - "dev": true, - "optional": true - }, "v8-profiler": { "version": "5.7.0", "from": "v8-profiler@>=5.2.3 <6.0.0", @@ -11564,12 +3913,6 @@ "from": "valid-url@>=1.0.9 <2.0.0", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz" }, - "validate-npm-package-license": { - "version": "3.0.1", - "from": "validate-npm-package-license@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "dev": true - }, "validator": { "version": "5.7.0", "from": "validator@>=5.2.0 <6.0.0", @@ -11619,561 +3962,11 @@ "from": "verror@1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" }, - "vm-browserify": { - "version": "0.0.4", - "from": "vm-browserify@0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "dev": true - }, "void-elements": { "version": "2.0.1", "from": "void-elements@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" }, - "watch": { - "version": "0.13.0", - "from": "watch@>=0.13.0 <0.14.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.13.0.tgz", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - } - } - }, - "watchpack": { - "version": "1.4.0", - "from": "watchpack@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "dev": true, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "from": "anymatch@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "from": "arr-diff@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "from": "array-unique@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "dev": true - }, - "async": { - "version": "2.6.0", - "from": "async@^2.1.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "dev": true - }, - "braces": { - "version": "1.8.5", - "from": "braces@>=1.8.2 <2.0.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "from": "chokidar@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "from": "expand-brackets@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "from": "extglob@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "dev": true - }, - "glob-parent": { - "version": "2.0.0", - "from": "glob-parent@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "from": "is-glob@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "from": "micromatch@>=2.1.5 <3.0.0", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "from": "minimatch@^3.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "from": "readable-stream@^2.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "dev": true - }, - "readdirp": { - "version": "2.1.0", - "from": "readdirp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "from": "string_decoder@~1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "dev": true - } - } - }, - "wbuf": { - "version": "1.7.2", - "from": "wbuf@>=1.7.2 <2.0.0", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "dev": true - }, - "webpack": { - "version": "3.10.0", - "from": "webpack@latest", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "5.3.0", - "from": "acorn@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "async": { - "version": "2.6.0", - "from": "async@>=2.1.2 <3.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "from": "camelcase@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "from": "cliui@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "dev": true, - "dependencies": { - "string-width": { - "version": "1.0.2", - "from": "string-width@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "dev": true - } - } - }, - "has-flag": { - "version": "2.0.0", - "from": "has-flag@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "dev": true - }, - "json5": { - "version": "0.5.1", - "from": "json5@^0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "from": "source-map@^0.5.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "from": "string-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - } - } - }, - "supports-color": { - "version": "4.5.0", - "from": "supports-color@>=4.2.1 <5.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "from": "yargs@>=8.0.2 <9.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "from": "webpack-dev-middleware@1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "dev": true, - "dependencies": { - "mime": { - "version": "1.6.0", - "from": "mime@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "2.11.1", - "from": "webpack-dev-server@latest", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.1.tgz", - "dev": true, - "dependencies": { - "accepts": { - "version": "1.3.4", - "from": "accepts@~1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "from": "array-flatten@1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "from": "camelcase@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "from": "cliui@^3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "from": "content-disposition@0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "from": "cookie@0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "dev": true - }, - "debug": { - "version": "3.1.0", - "from": "debug@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "from": "destroy@>=1.0.4 <1.1.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "dev": true - }, - "etag": { - "version": "1.8.1", - "from": "etag@>=1.8.1 <1.9.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "dev": true - }, - "express": { - "version": "4.16.2", - "from": "express@>=4.16.2 <5.0.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "finalhandler": { - "version": "1.1.0", - "from": "finalhandler@1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "find-up": { - "version": "1.1.2", - "from": "find-up@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "from": "fresh@0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "from": "has-flag@^2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "from": "ipaddr.js@1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "from": "load-json-file@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "from": "merge-descriptors@1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "dev": true - }, - "mime": { - "version": "1.4.1", - "from": "mime@1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "from": "negotiator@0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "from": "os-locale@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "from": "path-exists@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "from": "path-to-regexp@0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "from": "path-type@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "dev": true - }, - "pify": { - "version": "2.3.0", - "from": "pify@^2.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - }, - "proxy-addr": { - "version": "2.0.2", - "from": "proxy-addr@>=2.0.2 <2.1.0", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "dev": true - }, - "range-parser": { - "version": "1.2.0", - "from": "range-parser@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "from": "read-pkg@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "from": "read-pkg-up@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "dev": true - }, - "send": { - "version": "0.16.1", - "from": "send@0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.9", - "from": "debug@2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.1", - "from": "serve-static@1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "from": "setprototypeof@1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "from": "statuses@>=1.3.1 <1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "dev": true - }, - "supports-color": { - "version": "5.1.0", - "from": "supports-color@>=5.1.0 <6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "from": "utils-merge@1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "dev": true - }, - "vary": { - "version": "1.1.2", - "from": "vary@~1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "dev": true - }, - "which-module": { - "version": "1.0.0", - "from": "which-module@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "from": "yargs@6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "dev": true - }, - "yargs-parser": { - "version": "4.2.1", - "from": "yargs-parser@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "dev": true - } - } - }, - "webpack-merge": { - "version": "4.1.1", - "from": "webpack-merge@latest", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", - "dev": true - }, - "webpack-sources": { - "version": "1.1.0", - "from": "webpack-sources@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.6.1", - "from": "source-map@>=0.6.1 <0.7.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.0", - "from": "websocket-driver@>=0.5.1", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "dev": true - }, - "websocket-extensions": { - "version": "0.1.3", - "from": "websocket-extensions@>=0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "dev": true - }, "whatwg-fetch": { "version": "2.0.4", "from": "whatwg-fetch@>=0.10.0", @@ -12189,68 +3982,16 @@ "from": "which@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" }, - "which-module": { - "version": "2.0.0", - "from": "which-module@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "dev": true - }, "wide-align": { "version": "1.1.2", "from": "wide-align@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz" }, - "widest-line": { - "version": "2.0.0", - "from": "widest-line@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "from": "ansi-regex@^3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@^2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "from": "string-width@^2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "from": "strip-ansi@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "dev": true - } - } - }, "window-size": { "version": "0.1.0", "from": "window-size@0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, - "winston": { - "version": "0.8.3", - "from": "winston@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.2.10", - "from": "async@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "dev": true - } - } - }, "with": { "version": "3.0.1", "from": "with@>=3.0.0 <3.1.0", @@ -12266,46 +4007,16 @@ "from": "wordwrap@0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" }, - "wrap-ansi": { - "version": "2.1.0", - "from": "wrap-ansi@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "dev": true - }, "wrappy": { "version": "1.0.2", "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" }, - "write": { - "version": "0.2.1", - "from": "write@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "from": "write-file-atomic@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "dev": true - }, - "ws": { - "version": "3.3.3", - "from": "ws@>=3.3.1 <3.4.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "dev": true - }, "x-xss-protection": { "version": "1.0.0", "from": "x-xss-protection@1.0.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz" }, - "xdg-basedir": { - "version": "3.0.0", - "from": "xdg-basedir@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "dev": true - }, "xhr-response": { "version": "1.0.1", "from": "xhr-response@>=1.0.0 <1.1.0", @@ -12360,12 +4071,6 @@ "from": "xmldom@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz" }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "from": "xmlhttprequest-ssl@>=1.5.4 <1.6.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "dev": true - }, "xpath": { "version": "0.0.5", "from": "xpath@0.0.5", @@ -12376,60 +4081,21 @@ "from": "xpath.js@>=0.0.3", "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz" }, - "xregexp": { - "version": "2.0.0", - "from": "xregexp@2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "dev": true, - "optional": true - }, "xtend": { "version": "4.0.1", "from": "xtend@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" }, - "y18n": { - "version": "3.2.1", - "from": "y18n@>=3.2.1 <4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "from": "yallist@>=2.1.2 <3.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "dev": true - }, "yargs": { "version": "3.5.4", "from": "yargs@>=3.5.4 <3.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz" }, - "yargs-parser": { - "version": "7.0.0", - "from": "yargs-parser@>=7.0.0 <8.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "dev": true, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "from": "camelcase@^4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "dev": true - } - } - }, "yauzl": { "version": "2.9.1", "from": "yauzl@>=2.8.0 <3.0.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz" }, - "yeast": { - "version": "0.1.2", - "from": "yeast@0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "dev": true - }, "zip-stream": { "version": "0.3.7", "from": "zip-stream@>=0.3.0 <0.4.0", diff --git a/services/web/package.json b/services/web/package.json index b6a4d80d35..e8ace02c20 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -27,6 +27,7 @@ "dependencies": { "archiver": "0.9.0", "async": "0.6.2", + "backbone": "^1.3.3", "base64-stream": "^0.1.2", "basic-auth-connect": "^1.0.0", "bcrypt": "1.0.1", @@ -37,16 +38,22 @@ "cookie": "^0.2.3", "cookie-parser": "1.3.5", "csurf": "^1.8.3", + "d3": "^3.5.16", "dateformat": "1.0.4-1.2.3", + "daterangepicker": "^2.1.27", "express": "4.13.0", "express-http-proxy": "^1.1.0", "express-session": "^1.14.2", "fs-extra": "^4.0.2", "fuse.js": "^3.0.0", + "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "handlebars-loader": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.0.tgz", "heapdump": "^0.3.7", "helmet": "^3.8.1", "http-proxy": "^1.8.1", + "imports-loader": "^0.8.0", "jade": "~1.3.1", + "jquery": "^3.3.1", "jsonwebtoken": "^8.0.1", "ldapjs": "^0.7.1", "lodash": "^4.13.1", @@ -65,6 +72,7 @@ "nodemailer-mandrill-transport": "^1.2.0", "nodemailer-sendgrid-transport": "^0.2.0", "nodemailer-ses-transport": "^1.3.0", + "nvd3": "^1.8.6", "optimist": "0.6.1", "passport": "^0.3.2", "passport-ldapauth": "^0.6.0", @@ -148,7 +156,7 @@ "sinon": "^1.17.0", "sinon-chai": "^2.14.0", "timekeeper": "", - "translations-sharelatex": "git+https://github.com/sharelatex/translations-sharelatex.git#master", + "translations-sharelatex": "git+https://github.com/sharelatex/translations-sharelatex.git#e219c18a5f305d7724946908b67fb32218fac577", "webpack": "^3.10.0", "webpack-dev-server": "^2.11.1", "webpack-merge": "^4.1.1" From cc530666abf43d190d65cc0aff0db0360cd008c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Fri, 11 May 2018 09:57:36 +0100 Subject: [PATCH 41/87] Configure handlerbars loader in webpack Needed for the metrics app. --- services/web/webpack.config.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/services/web/webpack.config.js b/services/web/webpack.config.js index da0dc8257e..7050a7eb0e 100644 --- a/services/web/webpack.config.js +++ b/services/web/webpack.config.js @@ -1,5 +1,6 @@ const fs = require('fs') const path = require('path') +const webpack = require('webpack') const MODULES_PATH = path.join(__dirname, '/modules') @@ -60,10 +61,23 @@ module.exports = { cacheDirectory: true } }] + }, + { + test: /\.handlebars$/, + loader: "handlebars-loader", + options: { + compat: true, + knownHelpersOnly: false, + runtimePath: 'handlebars/runtime', + } }] }, - + resolve: { + alias: { + handlebars: 'handlebars/dist/handlebars.min.js', + jquery: path.join(__dirname, 'node_modules/jquery/dist/jquery'), + } + }, // TODO // plugins: {} } - From 156263115b4528cd58f226f2989e013e245d45d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Fri, 11 May 2018 09:58:35 +0100 Subject: [PATCH 42/87] Styles for the metrics app Imported from v1 with minimal changes. --- .../public/stylesheets/_style_includes.less | 2 + .../web/public/stylesheets/app/metrics.less | 177 +++++ .../components/daterange-picker.less | 610 ++++++++++++++++++ 3 files changed, 789 insertions(+) create mode 100644 services/web/public/stylesheets/app/metrics.less create mode 100644 services/web/public/stylesheets/components/daterange-picker.less diff --git a/services/web/public/stylesheets/_style_includes.less b/services/web/public/stylesheets/_style_includes.less index 7f6070e69c..52790de9a8 100644 --- a/services/web/public/stylesheets/_style_includes.less +++ b/services/web/public/stylesheets/_style_includes.less @@ -47,6 +47,7 @@ @import "components/tooltip.less"; @import "components/popovers.less"; @import "components/carousel.less"; +@import "components/daterange-picker"; // ngTagsInput @import "components/tags-input.less"; @@ -79,6 +80,7 @@ @import "app/review-features-page.less"; @import "app/error-pages.less"; @import "app/v1-badge.less"; +@import "app/metrics.less"; // Vendor CSS @import "../js/libs/pdfListView/TextLayer.css"; diff --git a/services/web/public/stylesheets/app/metrics.less b/services/web/public/stylesheets/app/metrics.less new file mode 100644 index 0000000000..23d121088d --- /dev/null +++ b/services/web/public/stylesheets/app/metrics.less @@ -0,0 +1,177 @@ +#metrics { + max-width: none; + padding: 0 30px; + width: auto; + + svg.nvd3-svg { + width: 100%; + } + + .overbox { + margin: 0; + padding: 40px 20px; + background: #fff; + border: 1px solid #DFDFDF; + .box { + padding-bottom: 30px; + overflow: hidden; + margin-bottom: 40px; + border-bottom: 1px solid rgb(216, 216, 216); + + .header { + margin-bottom: 20px; + + h4 { + font-size: 19px; + margin: 0; + } + } + } + } + + .print-button { + margin-right: 10px; + font-size: 20px; + } + + .title-button { + margin-right: 5px; + font-size: 20px; + } + + .metric-col { + padding: 15px; + } + + .metric-header-container { + h4 { + margin-bottom: 0; + } + } + + svg { + display: block; + height: 250px; + text { + font-family: "Open Sans", sans-serif; + } + &:not(:root) { + overflow: visible + } + + &.hidden-legend-margin-fix { + margin-top: 15px; + height: 235px; + } + + &.no-fill-opacity { + .nvd3 { + .nv-area { + fill-opacity: 1; + } + } + } + } + + .nvtooltip { + z-index: 10; + } + + .tooltip { + width: 150px; + } + + // BEGIN: Metrics header + .metric-header-container { + > h4 { + margin-top: 0; + margin-bottom: 0; + } + } + // END: Metrics header + + // BEGIN: Metrics footer + .metric-footer-container { + text-align: center; + } + // END: Metrics footer + + // BEGIN: Metrics overlays + .metric-overlay-loading, + .metric-overlay-error, + .metric-overlay-backdrop { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + padding: 16px; /* 15px of .metric-col padding + 1px border */ + padding-top: 56px; /* Same as above + 30px for title + 10px overbox padding*/ + } + + .metric-overlay-loading { + padding: 175px 20%; + } + + .metric-overlay-error { + display: none; + text-align: center; + padding-top: 175px; + } + + .metric-overlay-backdrop { + opacity: 0.5; + } + + .metric-overlay-backdrop-inner { + background-color: #fff; + width: 100%; + height: 100%; + } + // END: Metrics overlays +} + +#metrics-header { + @media (min-width: 1200px) { + margin-bottom: 30px; + } + + .section_header { + margin-bottom: 0; + } + + #filters-container { + text-align: right; + + .by { + color: #989898; + font-style: italic; + } + } + + #lags-container { + .dropdown-menu { + min-width: 0; + } + } + + #dates-container { + display: inline-block; + .daterangepicker { + margin-right: 15px; + } + } +} + +#metrics-footer { + margin-top: 30px; + text-align: center; +} + +body.print-loading { + #metrics { + .metric-col { + opacity: 0.5; + } + } +} diff --git a/services/web/public/stylesheets/components/daterange-picker.less b/services/web/public/stylesheets/components/daterange-picker.less new file mode 100644 index 0000000000..2d15d2a36d --- /dev/null +++ b/services/web/public/stylesheets/components/daterange-picker.less @@ -0,0 +1,610 @@ +// +// A stylesheet for use with Bootstrap 3.x +// @author: Dan Grossman http://www.dangrossman.info/ +// @copyright: Copyright (c) 2012-2015 Dan Grossman. All rights reserved. +// @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php +// @website: https://www.improvely.com/ +// + +// +// VARIABLES +// + +// +// Settings + +// The class name to contain everything within. +@arrow-size: 7px; + +// +// Colors +@daterangepicker-color: @brand-primary; +@daterangepicker-bg-color: #fff; + +@daterangepicker-cell-color: @daterangepicker-color; +@daterangepicker-cell-border-color: transparent; +@daterangepicker-cell-bg-color: @daterangepicker-bg-color; + +@daterangepicker-cell-hover-color: @daterangepicker-color; +@daterangepicker-cell-hover-border-color: @daterangepicker-cell-border-color; +@daterangepicker-cell-hover-bg-color: #eee; + +@daterangepicker-in-range-color: #000; +@daterangepicker-in-range-border-color: transparent; +@daterangepicker-in-range-bg-color: #ebf4f8; + +@daterangepicker-active-color: #fff; +@daterangepicker-active-bg-color: #a93529; +@daterangepicker-active-border-color: transparent; + +@daterangepicker-unselected-color: #999; +@daterangepicker-unselected-border-color: transparent; +@daterangepicker-unselected-bg-color: #fff; + +// +// daterangepicker +@daterangepicker-width: 278px; +@daterangepicker-padding: 4px; +@daterangepicker-z-index: 3000; + +@daterangepicker-border-size: 1px; +@daterangepicker-border-color: #ccc; +@daterangepicker-border-radius: 4px; + + +// +// Calendar +@daterangepicker-calendar-margin: @daterangepicker-padding; +@daterangepicker-calendar-bg-color: @daterangepicker-bg-color; + +@daterangepicker-calendar-border-size: 1px; +@daterangepicker-calendar-border-color: @daterangepicker-bg-color; +@daterangepicker-calendar-border-radius: @daterangepicker-border-radius; + +// +// Calendar Cells +@daterangepicker-cell-size: 20px; +@daterangepicker-cell-width: @daterangepicker-cell-size; +@daterangepicker-cell-height: @daterangepicker-cell-size; + +@daterangepicker-cell-border-radius: @daterangepicker-calendar-border-radius; +@daterangepicker-cell-border-size: 1px; + +// +// Dropdowns +@daterangepicker-dropdown-z-index: @daterangepicker-z-index + 1; + +// +// Controls +@daterangepicker-control-height: 30px; +@daterangepicker-control-line-height: @daterangepicker-control-height; +@daterangepicker-control-color: #555; + +@daterangepicker-control-border-size: 1px; +@daterangepicker-control-border-color: #ccc; +@daterangepicker-control-border-radius: 4px; + +@daterangepicker-control-active-border-size: 1px; +@daterangepicker-control-active-border-color: @brand-primary; +@daterangepicker-control-active-border-radius: @daterangepicker-control-border-radius; + +@daterangepicker-control-disabled-color: #ccc; + +// +// Ranges +@daterangepicker-ranges-color: @brand-primary; +@daterangepicker-ranges-bg-color: daterangepicker-ranges-color; + +@daterangepicker-ranges-border-size: 1px; +@daterangepicker-ranges-border-color: @daterangepicker-ranges-bg-color; +@daterangepicker-ranges-border-radius: @daterangepicker-border-radius; + +@daterangepicker-ranges-hover-color: #fff; +@daterangepicker-ranges-hover-bg-color: @daterangepicker-ranges-color; +@daterangepicker-ranges-hover-border-size: @daterangepicker-ranges-border-size; +@daterangepicker-ranges-hover-border-color: @daterangepicker-ranges-hover-bg-color; +@daterangepicker-ranges-hover-border-radius: @daterangepicker-border-radius; + +@daterangepicker-ranges-active-border-size: @daterangepicker-ranges-border-size; +@daterangepicker-ranges-active-border-color: @daterangepicker-ranges-bg-color; +@daterangepicker-ranges-active-border-radius: @daterangepicker-border-radius; + +// +// STYLESHEETS +// +.daterangepicker { + position: absolute; + color: @daterangepicker-color; + background-color: @daterangepicker-bg-color; + border-radius: @daterangepicker-border-radius; + width: @daterangepicker-width; + padding: @daterangepicker-padding; + margin-top: @daterangepicker-border-size; + + // TODO: Should these be parameterized?? + // top: 100px; + // left: 20px; + + @arrow-prefix-size: @arrow-size; + @arrow-suffix-size: (@arrow-size - @daterangepicker-border-size); + + &:before, &:after { + position: absolute; + display: inline-block; + + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; + } + + &:before { + top: -@arrow-prefix-size; + + border-right: @arrow-prefix-size solid transparent; + border-left: @arrow-prefix-size solid transparent; + border-bottom: @arrow-prefix-size solid @daterangepicker-border-color; + } + + &:after { + top: -@arrow-suffix-size; + + border-right: @arrow-suffix-size solid transparent; + border-bottom: @arrow-suffix-size solid @daterangepicker-bg-color; + border-left: @arrow-suffix-size solid transparent; + } + + &.opensleft { + &:before { + // TODO: Make this relative to prefix size. + right: @arrow-prefix-size + 2px; + } + + &:after { + // TODO: Make this relative to suffix size. + right: @arrow-suffix-size + 4px; + } + } + + &.openscenter { + &:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; + } + + &:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; + } + } + + &.opensright { + &:before { + // TODO: Make this relative to prefix size. + left: @arrow-prefix-size + 2px; + } + + &:after { + // TODO: Make this relative to suffix size. + left: @arrow-suffix-size + 4px; + } + } + + &.dropup { + margin-top: -5px; + + // NOTE: Note sure why these are special-cased. + &:before { + top: initial; + bottom: -@arrow-prefix-size; + border-bottom: initial; + border-top: @arrow-prefix-size solid @daterangepicker-border-color; + } + + &:after { + top: initial; + bottom:-@arrow-suffix-size; + border-bottom: initial; + border-top: @arrow-suffix-size solid @daterangepicker-bg-color; + } + } + + &.dropdown-menu { + max-width: none; + z-index: @daterangepicker-dropdown-z-index; + } + + &.single { + .ranges, .calendar { + float: none; + } + } + + /* Calendars */ + &.show-calendar { + .calendar { + display: block; + } + } + + .calendar { + display: none; + max-width: @daterangepicker-width - (@daterangepicker-calendar-margin * 2); + margin: @daterangepicker-calendar-margin; + + &.single { + .calendar-table { + border: none; + } + } + + th, td { + white-space: nowrap; + text-align: center; + + // TODO: Should this actually be hard-coded? + min-width: 32px; + } + } + + .calendar-table { + border: @daterangepicker-calendar-border-size solid @daterangepicker-calendar-border-color; + padding: @daterangepicker-calendar-margin; + border-radius: @daterangepicker-calendar-border-radius; + background-color: @daterangepicker-calendar-bg-color; + } + + table { + width: 100%; + margin: 0; + } + + td, th { + text-align: center; + width: @daterangepicker-cell-width; + height: @daterangepicker-cell-height; + border-radius: @daterangepicker-cell-border-radius; + border: @daterangepicker-cell-border-size solid @daterangepicker-cell-border-color; + white-space: nowrap; + cursor: pointer; + + &.available { + &:hover { + background-color: @daterangepicker-cell-hover-bg-color; + border-color: @daterangepicker-cell-hover-border-color; + color: @daterangepicker-cell-hover-color; + } + } + + &.week { + font-size: 80%; + color: #ccc; + } + } + + td { + &.off { + &, &.in-range, &.start-date, &.end-date { + background-color: @daterangepicker-unselected-bg-color; + border-color: @daterangepicker-unselected-border-color; + color: @daterangepicker-unselected-color; + } + } + + // + // Date Range + &.in-range { + background-color: @daterangepicker-in-range-bg-color; + border-color: @daterangepicker-in-range-border-color; + color: @daterangepicker-in-range-color; + + // TODO: Should this be static or should it be parameterized? + border-radius: 0; + } + + &.start-date { + border-radius: @daterangepicker-cell-border-radius 0 0 @daterangepicker-cell-border-radius; + } + + &.end-date { + border-radius: 0 @daterangepicker-cell-border-radius @daterangepicker-cell-border-radius 0; + } + + &.start-date.end-date { + border-radius: @daterangepicker-cell-border-radius; + } + + &.active { + &, &:hover { + background-color: @daterangepicker-active-bg-color; + border-color: @daterangepicker-active-border-color; + color: @daterangepicker-active-color; + } + } + } + + th { + &.month { + width: auto; + } + } + + // + // Disabled Controls + // + td, option { + &.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; + } + } + + select { + &.monthselect, &.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; + } + + &.monthselect { + margin-right: 2%; + width: 56%; + } + + &.yearselect { + width: 40%; + } + + &.hourselect, &.minuteselect, &.secondselect, &.ampmselect { + width: 50px; + margin-bottom: 0; + } + } + + // + // Text Input Controls (above calendar) + // + .input-mini { + border: @daterangepicker-control-border-size solid @daterangepicker-control-border-color; + border-radius: @daterangepicker-control-border-radius; + color: @daterangepicker-control-color; + height: @daterangepicker-control-line-height; + line-height: @daterangepicker-control-height; + display: block; + vertical-align: middle; + + // TODO: Should these all be static, too?? + margin: 0 0 5px 0; + padding: 0 6px 0 28px; + width: 100%; + + &.active { + border: @daterangepicker-control-active-border-size solid @daterangepicker-control-active-border-color; + border-radius: @daterangepicker-control-active-border-radius; + } + } + + .daterangepicker_input { + position: relative; + + i { + position: absolute; + + // NOTE: These appear to be eyeballed to me... + left: 8px; + top: 8px; + } + } + &.rtl { + .input-mini { + padding-right: 28px; + padding-left: 6px; + } + .daterangepicker_input i { + left: auto; + right: 8px; + } + } + + // + // Time Picker + // + .calendar-time { + text-align: center; + margin: 5px auto; + line-height: @daterangepicker-control-line-height; + position: relative; + padding-left: 28px; + + select { + &.disabled { + color: @daterangepicker-control-disabled-color; + cursor: not-allowed; + } + } + } +} + +// +// Predefined Ranges +// + +.ranges { + font-size: 11px; + float: none; + margin: 4px; + text-align: left; + + ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; + } + + li { + font-size: 13px; + background-color: @daterangepicker-ranges-bg-color; + border: @daterangepicker-ranges-border-size solid @daterangepicker-ranges-border-color; + border-radius: @daterangepicker-ranges-border-radius; + color: @daterangepicker-ranges-color; + padding: 3px 12px; + margin-bottom: 8px; + cursor: pointer; + + &:hover { + background-color: @daterangepicker-ranges-hover-bg-color; + border: @daterangepicker-ranges-hover-border-size solid @daterangepicker-ranges-hover-border-color; + color: @daterangepicker-ranges-hover-color; + } + + &.active { + background-color: @daterangepicker-ranges-hover-bg-color; + border: @daterangepicker-ranges-hover-border-size solid @daterangepicker-ranges-hover-border-color; + color: @daterangepicker-ranges-hover-color; + } + } +} + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; + + .ranges { + ul { + width: 160px; + } + } + + &.single { + .ranges { + ul { + width: 100%; + } + } + + .calendar.left { + clear: none; + } + + &.ltr { + .ranges, .calendar { + float:left; + } + } + &.rtl { + .ranges, .calendar { + float:right; + } + } + } + + &.ltr { + direction: ltr; + text-align: left; + .calendar{ + &.left { + clear: left; + margin-right: 0; + + .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + &.right { + margin-left: 0; + + .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + } + + .left .daterangepicker_input { + padding-right: 12px; + } + + .calendar.left .calendar-table { + padding-right: 12px; + } + + .ranges, .calendar { + float: left; + } + } + &.rtl { + direction: rtl; + text-align: right; + .calendar{ + &.left { + clear: right; + margin-left: 0; + + .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + + &.right { + margin-right: 0; + + .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + } + + .left .daterangepicker_input { + padding-left: 12px; + } + + .calendar.left .calendar-table { + padding-left: 12px; + } + + .ranges, .calendar { + text-align: right; + float: right; + } + } + } +} + +@media (min-width: 730px) { + .daterangepicker { + .ranges { + width: auto; + } + &.ltr { + .ranges { + float: left; + } + } + &.rtl { + .ranges { + float: right; + } + } + + .calendar.left { + clear: none !important; + } + } +} From 1087fa6797932e9d1e040ac01cd58a1f1eceb362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Mon, 14 May 2018 14:24:41 +0100 Subject: [PATCH 43/87] Make jQuery version match the one statically linked In https://github.com/sharelatex/web-sharelatex-internal/blob/14148648e6db6d33c203fcb828bb6d05095af83c/app/views/layout.pug#L60 --- services/web/npm-shrinkwrap.json | 6 +++--- services/web/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/web/npm-shrinkwrap.json b/services/web/npm-shrinkwrap.json index 1f808d6441..356f68fffd 100644 --- a/services/web/npm-shrinkwrap.json +++ b/services/web/npm-shrinkwrap.json @@ -1557,9 +1557,9 @@ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz" }, "jquery": { - "version": "3.3.1", - "from": "jquery@latest", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz" + "version": "1.11.1", + "from": "jquery@1.11.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.11.1.tgz" }, "js-stringify": { "version": "1.0.2", diff --git a/services/web/package.json b/services/web/package.json index e8ace02c20..2aa9ccc56f 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -53,7 +53,7 @@ "http-proxy": "^1.8.1", "imports-loader": "^0.8.0", "jade": "~1.3.1", - "jquery": "^3.3.1", + "jquery": "^1.11.1", "jsonwebtoken": "^8.0.1", "ldapjs": "^0.7.1", "lodash": "^4.13.1", From de645afff9d3e4dafbbf7eef5547a49effda8815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Mon, 14 May 2018 15:22:58 +0100 Subject: [PATCH 44/87] Move handlebars loader to dev dependencies --- services/web/npm-shrinkwrap.json | 8447 +++++++++++++++++++++++++++++- services/web/package.json | 4 +- 2 files changed, 8439 insertions(+), 12 deletions(-) diff --git a/services/web/npm-shrinkwrap.json b/services/web/npm-shrinkwrap.json index 356f68fffd..7d121f27f7 100644 --- a/services/web/npm-shrinkwrap.json +++ b/services/web/npm-shrinkwrap.json @@ -22,6 +22,20 @@ "from": "acorn@>=3.1.0 <4.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" }, + "acorn-dynamic-import": { + "version": "2.0.2", + "from": "acorn-dynamic-import@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "from": "acorn@>=4.0.3 <5.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "dev": true + } + } + }, "acorn-globals": { "version": "3.1.0", "from": "acorn-globals@>=3.0.0 <4.0.0", @@ -34,16 +48,40 @@ } } }, + "acorn-jsx": { + "version": "3.0.1", + "from": "acorn-jsx@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "dev": true + }, "addressparser": { "version": "0.2.1", "from": "addressparser@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz" }, + "after": { + "version": "0.8.2", + "from": "after@0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "dev": true + }, + "agent-base": { + "version": "4.2.0", + "from": "agent-base@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", + "dev": true + }, "ajv": { "version": "5.5.2", "from": "ajv@>=5.1.0 <6.0.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz" }, + "ajv-keywords": { + "version": "2.1.1", + "from": "ajv-keywords@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "dev": true + }, "align-text": { "version": "0.1.4", "from": "align-text@>=0.1.3 <0.2.0", @@ -54,11 +92,90 @@ "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" }, + "amqplib": { + "version": "0.5.2", + "from": "amqplib@>=0.5.2 <0.6.0", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "dev": true, + "optional": true, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "from": "bluebird@^3.4.6", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "from": "readable-stream@>=1.0.0 <2.0.0 >=1.1.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "dev": true, + "optional": true + } + } + }, + "ansi-align": { + "version": "2.0.0", + "from": "ansi-align@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@^2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + } + } + }, + "ansi-escapes": { + "version": "3.1.0", + "from": "ansi-escapes@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "from": "ansi-html@0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" }, + "ansi-styles": { + "version": "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", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "from": "anymatch@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "dev": true + }, "aproba": { "version": "1.2.0", "from": "aproba@>=1.0.3 <2.0.0", @@ -115,11 +232,77 @@ } } }, + "arr-diff": { + "version": "2.0.0", + "from": "arr-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "from": "arr-flatten@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "from": "arr-union@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "from": "array-find-index@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "dev": true + }, "array-flatten": { "version": "1.1.0", "from": "array-flatten@1.1.0", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.0.tgz" }, + "array-includes": { + "version": "3.0.3", + "from": "array-includes@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "from": "array-slice@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "from": "array-union@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "from": "array-uniq@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "from": "array-unique@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "from": "arraybuffer.slice@>=0.0.7 <0.1.0", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "dev": true + }, "asap": { "version": "2.0.6", "from": "asap@>=2.0.3 <2.1.0", @@ -130,6 +313,18 @@ "from": "asn1@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, + "asn1.js": { + "version": "4.10.1", + "from": "asn1.js@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "dev": true + }, + "assert": { + "version": "1.4.1", + "from": "assert@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "dev": true + }, "assert-plus": { "version": "1.0.0", "from": "assert-plus@>=1.0.0 <2.0.0", @@ -140,16 +335,53 @@ "from": "assertion-error@^1.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" }, + "assign-symbols": { + "version": "1.0.0", + "from": "assign-symbols@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "dev": true + }, + "ast-types": { + "version": "0.11.3", + "from": "ast-types@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "dev": true, + "optional": true + }, "async": { "version": "0.6.2", "from": "async@0.6.2", "resolved": "https://registry.npmjs.org/async/-/async-0.6.2.tgz" }, + "async-each": { + "version": "1.0.1", + "from": "async-each@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "from": "async-limiter@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "dev": true + }, "asynckit": { "version": "0.4.0", "from": "asynckit@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" }, + "atob": { + "version": "2.1.1", + "from": "atob@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "from": "autoprefixer@>=6.6.1 <7.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "dev": true + }, "aws-sdk": { "version": "2.188.0", "from": "aws-sdk@>=2.2.36 <3.0.0", @@ -177,11 +409,446 @@ "from": "aws4@>=1.6.0 <2.0.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz" }, + "axios": { + "version": "0.15.3", + "from": "axios@>=0.15.3 <0.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "dev": true, + "optional": true + }, "axo": { "version": "0.0.2", "from": "axo@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/axo/-/axo-0.0.2.tgz" }, + "babel-code-frame": { + "version": "6.26.0", + "from": "babel-code-frame@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "dev": true + }, + "babel-core": { + "version": "6.26.3", + "from": "babel-core@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@>=2.6.8 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "from": "source-map@>=0.5.6 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "from": "babel-generator@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.5.7", + "from": "source-map@^0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "dev": true + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "from": "babel-helper-builder-react-jsx@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "dev": true + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "from": "babel-helper-call-delegate@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "dev": true + }, + "babel-helper-define-map": { + "version": "6.26.0", + "from": "babel-helper-define-map@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "dev": true + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "from": "babel-helper-explode-assignable-expression@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "dev": true + }, + "babel-helper-function-name": { + "version": "6.24.1", + "from": "babel-helper-function-name@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "from": "babel-helper-get-function-arity@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "dev": true + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "from": "babel-helper-hoist-variables@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "dev": true + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "from": "babel-helper-optimise-call-expression@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "dev": true + }, + "babel-helper-regex": { + "version": "6.26.0", + "from": "babel-helper-regex@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "dev": true + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "from": "babel-helper-remap-async-to-generator@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "dev": true + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "from": "babel-helper-replace-supers@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "from": "babel-helpers@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "dev": true + }, + "babel-loader": { + "version": "7.1.4", + "from": "babel-loader@>=7.1.2 <8.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz", + "dev": true + }, + "babel-messages": { + "version": "6.23.0", + "from": "babel-messages@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "from": "babel-plugin-syntax-async-functions@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "from": "babel-plugin-syntax-exponentiation-operator@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "from": "babel-plugin-syntax-flow@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "from": "babel-plugin-syntax-jsx@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "from": "babel-plugin-syntax-trailing-function-commas@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "from": "babel-plugin-transform-async-to-generator@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-classes@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "from": "babel-plugin-transform-es2015-destructuring@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "from": "babel-plugin-transform-es2015-for-of@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-amd@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-umd@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-parameters@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "from": "babel-plugin-transform-exponentiation-operator@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "from": "babel-plugin-transform-flow-strip-types@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "from": "babel-plugin-transform-react-display-name@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "dev": true + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "from": "babel-plugin-transform-react-jsx@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "from": "babel-plugin-transform-react-jsx-self@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "from": "babel-plugin-transform-react-jsx-source@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "dev": true + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "from": "babel-plugin-transform-strict-mode@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "dev": true + }, + "babel-preset-env": { + "version": "1.7.0", + "from": "babel-preset-env@>=1.6.1 <2.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "dev": true, + "dependencies": { + "browserslist": { + "version": "3.2.7", + "from": "browserslist@>=3.2.6 <4.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.7.tgz", + "dev": true + } + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "from": "babel-preset-flow@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "dev": true + }, + "babel-preset-react": { + "version": "6.24.1", + "from": "babel-preset-react@>=6.16.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "dev": true + }, + "babel-register": { + "version": "6.26.0", + "from": "babel-register@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "dev": true + }, + "babel-runtime": { + "version": "6.26.0", + "from": "babel-runtime@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "dev": true + }, + "babel-template": { + "version": "6.26.0", + "from": "babel-template@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "dev": true + }, + "babel-traverse": { + "version": "6.26.0", + "from": "babel-traverse@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "from": "babel-types@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "dev": true + }, + "babylon": { + "version": "6.18.0", + "from": "babylon@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "dev": true + }, "backbone": { "version": "1.3.3", "from": "backbone@latest", @@ -194,6 +861,12 @@ } } }, + "backo2": { + "version": "1.0.2", + "from": "backo2@1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "dev": true + }, "backoff": { "version": "2.5.0", "from": "backoff@>=2.5.0 <3.0.0", @@ -204,6 +877,56 @@ "from": "balanced-match@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, + "base": { + "version": "0.11.2", + "from": "base@>=0.11.1 <0.12.0", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "1.0.0", + "from": "define-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "from": "is-data-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "from": "is-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "from": "base64-arraybuffer@0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "dev": true + }, "base64-js": { "version": "1.2.1", "from": "base64-js@>=1.0.2 <2.0.0", @@ -231,6 +954,12 @@ } } }, + "base64id": { + "version": "1.0.0", + "from": "base64id@1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "dev": true + }, "base64url": { "version": "2.0.0", "from": "base64url@>=2.0.0 <3.0.0", @@ -241,6 +970,12 @@ "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" }, + "batch": { + "version": "0.6.1", + "from": "batch@0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "dev": true + }, "bcrypt": { "version": "1.0.1", "from": "bcrypt@1.0.1", @@ -257,21 +992,46 @@ "from": "bcryptjs@2.3.0", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.3.0.tgz" }, + "better-assert": { + "version": "1.0.2", + "from": "better-assert@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "dev": true + }, "big.js": { "version": "3.2.0", "from": "big.js@>=3.1.3 <4.0.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz" }, + "binary-extensions": { + "version": "1.11.0", + "from": "binary-extensions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "dev": true + }, "bindings": { "version": "1.2.1", "from": "bindings@1.2.1", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, + "bitsyntax": { + "version": "0.0.4", + "from": "bitsyntax@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "dev": true, + "optional": true + }, "bl": { "version": "0.6.0", "from": "bl@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/bl/-/bl-0.6.0.tgz" }, + "blob": { + "version": "0.0.4", + "from": "blob@0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "dev": true + }, "block-stream": { "version": "0.0.9", "from": "block-stream@*", @@ -282,6 +1042,32 @@ "from": "bluebird@2.10.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, + "bn.js": { + "version": "4.11.8", + "from": "bn.js@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "dev": true + }, + "body": { + "version": "5.1.0", + "from": "body@>=5.1.0 <6.0.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "dev": true, + "dependencies": { + "bytes": { + "version": "1.0.0", + "from": "bytes@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "dev": true + }, + "raw-body": { + "version": "1.1.7", + "from": "raw-body@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "dev": true + } + } + }, "body-parser": { "version": "1.18.2", "from": "body-parser@>=1.13.1 <2.0.0", @@ -299,21 +1085,177 @@ } } }, + "bonjour": { + "version": "3.5.0", + "from": "bonjour@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "dev": true, + "dependencies": { + "array-flatten": { + "version": "2.1.1", + "from": "array-flatten@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "dev": true + } + } + }, "boom": { "version": "4.3.1", "from": "boom@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz" }, + "boxen": { + "version": "1.3.0", + "from": "boxen@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@^3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "from": "camelcase@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@^2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, "brace-expansion": { "version": "1.1.8", "from": "brace-expansion@>=1.1.7 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" }, + "braces": { + "version": "1.8.5", + "from": "braces@>=1.8.2 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "dev": true + }, + "broadway": { + "version": "0.3.6", + "from": "broadway@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/broadway/-/broadway-0.3.6.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.2.10", + "from": "async@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "dev": true + }, + "cliff": { + "version": "0.1.9", + "from": "cliff@0.1.9", + "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.9.tgz", + "dev": true + }, + "winston": { + "version": "0.8.0", + "from": "winston@0.8.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.0.tgz", + "dev": true + } + } + }, + "brorand": { + "version": "1.1.0", + "from": "brorand@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "dev": true + }, "browser-stdout": { "version": "1.3.0", "from": "browser-stdout@1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz" }, + "browserify-aes": { + "version": "1.2.0", + "from": "browserify-aes@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "dev": true + }, + "browserify-cipher": { + "version": "1.0.1", + "from": "browserify-cipher@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "dev": true + }, + "browserify-des": { + "version": "1.0.1", + "from": "browserify-des@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "dev": true + }, + "browserify-rsa": { + "version": "4.0.1", + "from": "browserify-rsa@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "dev": true + }, + "browserify-sign": { + "version": "4.0.4", + "from": "browserify-sign@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "dev": true + }, + "browserify-zlib": { + "version": "0.2.0", + "from": "browserify-zlib@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "dev": true + }, + "browserslist": { + "version": "1.7.7", + "from": "browserslist@>=1.7.6 <2.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "dev": true + }, "bson": { "version": "1.0.4", "from": "bson@>=1.0.4 <1.1.0", @@ -341,11 +1283,35 @@ "from": "buffer-equal-constant-time@1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" }, + "buffer-from": { + "version": "1.0.0", + "from": "buffer-from@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "from": "buffer-indexof@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "dev": true + }, + "buffer-more-ints": { + "version": "0.0.2", + "from": "buffer-more-ints@0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "dev": true + }, "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" }, + "buffer-xor": { + "version": "1.0.3", + "from": "buffer-xor@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "dev": true + }, "bufferedstream": { "version": "1.6.0", "from": "bufferedstream@1.6.0", @@ -363,6 +1329,18 @@ } } }, + "builtin-modules": { + "version": "1.1.1", + "from": "builtin-modules@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "from": "builtin-status-codes@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "dev": true + }, "bunyan": { "version": "0.22.1", "from": "bunyan@0.22.1", @@ -385,16 +1363,80 @@ "from": "bytes@3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" }, + "cache-base": { + "version": "1.0.1", + "from": "cache-base@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "from": "caller-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "dev": true + }, + "callsite": { + "version": "1.0.0", + "from": "callsite@1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "from": "callsites@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "dev": true + }, "camelcase": { "version": "1.2.1", "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, + "camelcase-keys": { + "version": "2.1.0", + "from": "camelcase-keys@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "dev": true, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "from": "camelcase@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "dev": true + } + } + }, "camelize": { "version": "1.0.0", "from": "camelize@1.0.0", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" }, + "caniuse-db": { + "version": "1.0.30000840", + "from": "caniuse-db@>=1.0.30000634 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000840.tgz", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000840", + "from": "caniuse-lite@>=1.0.30000835 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000840.tgz", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "from": "capture-stack-trace@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "dev": true + }, "caseless": { "version": "0.12.0", "from": "caseless@>=0.12.0 <0.13.0", @@ -405,21 +1447,129 @@ "from": "center-align@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" }, + "chai": { + "version": "3.5.0", + "from": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "dev": true + }, "chai-spies": { "version": "1.0.0", "from": "chai-spies@", "resolved": "https://registry.npmjs.org/chai-spies/-/chai-spies-1.0.0.tgz" }, + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "dev": true, + "dependencies": { + "supports-color": { + "version": "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", + "dev": true + } + } + }, "character-parser": { "version": "1.2.0", "from": "character-parser@1.2.0", "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.0.tgz" }, + "chardet": { + "version": "0.4.2", + "from": "chardet@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "dev": true + }, "check-error": { "version": "1.0.2", "from": "check-error@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" }, + "chokidar": { + "version": "1.7.0", + "from": "chokidar@>=1.4.1 <2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "ci-info": { + "version": "1.1.3", + "from": "ci-info@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "from": "cipher-base@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "from": "circular-json@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "from": "class-utils@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, "clean-css": { "version": "3.4.28", "from": "clean-css@>=3.3.0 <4.0.0", @@ -437,6 +1587,38 @@ } } }, + "cli-boxes": { + "version": "1.0.0", + "from": "cli-boxes@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "from": "cli-cursor@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "from": "cli-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "dev": true + }, + "cliff": { + "version": "0.1.10", + "from": "cliff@>=0.1.9 <0.2.0", + "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz", + "dev": true, + "dependencies": { + "colors": { + "version": "1.0.3", + "from": "colors@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "dev": true + } + } + }, "cliui": { "version": "2.1.0", "from": "cliui@>=2.1.0 <3.0.0", @@ -472,11 +1654,35 @@ "from": "coffee-script@1.12.4", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" }, + "collection-visit": { + "version": "1.0.0", + "from": "collection-visit@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "from": "color-convert@>=1.9.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "dev": true + }, + "color-name": { + "version": "1.1.3", + "from": "color-name@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "dev": true + }, "colors": { "version": "0.6.2", "from": "colors@>=0.6.2 <0.7.0", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" }, + "combine-lists": { + "version": "1.0.1", + "from": "combine-lists@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "dev": true + }, "combined-stream": { "version": "1.0.5", "from": "combined-stream@>=1.0.5 <1.1.0", @@ -487,11 +1693,175 @@ "from": "commander@2.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz" }, + "commondir": { + "version": "1.0.1", + "from": "commondir@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "from": "component-bind@1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "from": "component-emitter@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "from": "component-inherit@0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "from": "compressible@>=2.0.13 <2.1.0", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "dev": true, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "from": "mime-db@>= 1.33.0 < 2", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "dev": true + } + } + }, + "compression": { + "version": "1.7.2", + "from": "compression@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "dev": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "from": "accepts@~1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "dev": true + }, + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "from": "mime-db@~1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "from": "mime-types@~2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "dev": true + }, + "vary": { + "version": "1.1.2", + "from": "vary@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "dev": true + } + } + }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" }, + "concat-stream": { + "version": "1.6.2", + "from": "concat-stream@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "configstore": { + "version": "3.1.2", + "from": "configstore@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "dev": true + }, + "connect": { + "version": "3.6.6", + "from": "connect@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "dev": true + }, + "finalhandler": { + "version": "1.1.0", + "from": "finalhandler@1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "from": "statuses@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "from": "utils-merge@1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "from": "connect-history-api-fallback@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "dev": true + }, "connect-redis": { "version": "3.3.3", "from": "connect-redis@>=3.1.0 <4.0.0", @@ -504,6 +1874,12 @@ } } }, + "console-browserify": { + "version": "1.1.0", + "from": "console-browserify@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "dev": true + }, "console-control-strings": { "version": "1.1.0", "from": "console-control-strings@>=1.1.0 <1.2.0", @@ -514,6 +1890,18 @@ "from": "constantinople@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-2.0.1.tgz" }, + "constants-browserify": { + "version": "1.0.0", + "from": "constants-browserify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "from": "contains-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "dev": true + }, "content-disposition": { "version": "0.5.0", "from": "content-disposition@0.5.0", @@ -529,6 +1917,18 @@ "from": "content-type@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" }, + "continuable-cache": { + "version": "0.3.1", + "from": "continuable-cache@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "from": "convert-source-map@>=1.5.0 <2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "dev": true + }, "cookie": { "version": "0.2.4", "from": "cookie@>=0.2.3 <0.3.0", @@ -551,6 +1951,24 @@ "from": "cookie-signature@1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, + "cookies": { + "version": "0.7.1", + "from": "cookies@>=0.2.2", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "from": "copy-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "dev": true + }, + "core-js": { + "version": "2.5.6", + "from": "core-js@>=2.4.0 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "dev": true + }, "core-util-is": { "version": "1.0.2", "from": "core-util-is@>=1.0.0 <1.1.0", @@ -566,11 +1984,55 @@ "from": "crc32-stream@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.2.0.tgz" }, + "create-ecdh": { + "version": "4.0.3", + "from": "create-ecdh@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "from": "create-error-class@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "dev": true + }, + "create-hash": { + "version": "1.2.0", + "from": "create-hash@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "dev": true + }, + "create-hmac": { + "version": "1.1.7", + "from": "create-hmac@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "dev": true + }, "create-react-class": { "version": "15.6.3", "from": "create-react-class@>=15.6.0 <16.0.0", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz" }, + "cross-spawn": { + "version": "5.1.0", + "from": "cross-spawn@>=5.0.1 <6.0.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "dev": true, + "dependencies": { + "lru-cache": { + "version": "4.1.3", + "from": "lru-cache@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "dev": true + }, + "which": { + "version": "1.3.0", + "from": "which@>=1.2.9 <2.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "dev": true + } + } + }, "cryptiles": { "version": "3.1.2", "from": "cryptiles@>=3.0.0 <4.0.0", @@ -583,6 +2045,18 @@ } } }, + "crypto-browserify": { + "version": "3.12.0", + "from": "crypto-browserify@>=3.11.0 <4.0.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "dev": true + }, + "crypto-random-string": { + "version": "1.0.0", + "from": "crypto-random-string@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "dev": true + }, "csrf": { "version": "3.0.6", "from": "csrf@>=3.0.3 <3.1.0", @@ -625,6 +2099,37 @@ } } }, + "ctype": { + "version": "0.5.3", + "from": "ctype@0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "dev": true, + "optional": true + }, + "currently-unhandled": { + "version": "0.4.1", + "from": "currently-unhandled@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "from": "custom-event@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "dev": true + }, + "cycle": { + "version": "1.0.3", + "from": "cycle@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "dev": true + }, + "d": { + "version": "1.0.0", + "from": "d@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "dev": true + }, "d3": { "version": "3.5.16", "from": "d3@3.5.16", @@ -640,6 +2145,25 @@ "from": "dasherize@2.0.0", "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz" }, + "data-uri-to-buffer": { + "version": "1.2.0", + "from": "data-uri-to-buffer@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "dev": true, + "optional": true + }, + "date-format": { + "version": "1.2.0", + "from": "date-format@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "from": "date-now@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "dev": true + }, "dateformat": { "version": "1.0.4-1.2.3", "from": "dateformat@1.0.4-1.2.3", @@ -660,16 +2184,140 @@ "from": "decamelize@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, + "decode-uri-component": { + "version": "0.2.0", + "from": "decode-uri-component@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "from": "deep-eql@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "dev": true, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "from": "type-detect@0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "dev": true + } + } + }, + "deep-equal": { + "version": "1.0.1", + "from": "deep-equal@*", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "dev": true + }, "deep-extend": { "version": "0.4.2", "from": "deep-extend@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz" }, + "deep-is": { + "version": "0.1.3", + "from": "deep-is@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "from": "define-properties@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "from": "define-property@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "dev": true, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "from": "is-data-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "from": "is-descriptor@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + } + } + }, "deflate-crc32-stream": { "version": "0.1.2", "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" }, + "degenerator": { + "version": "1.0.4", + "from": "degenerator@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "dev": true, + "optional": true, + "dependencies": { + "esprima": { + "version": "3.1.3", + "from": "esprima@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "dev": true, + "optional": true + } + } + }, + "del": { + "version": "2.2.2", + "from": "del@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "from": "glob@^7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "from": "rimraf@>=2.2.8 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "dev": true + } + } + }, "delayed-stream": { "version": "1.0.0", "from": "delayed-stream@>=1.0.0 <1.1.0", @@ -690,16 +2338,40 @@ "from": "depd@>=1.1.1 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" }, + "des.js": { + "version": "1.0.0", + "from": "des.js@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "dev": true + }, "destroy": { "version": "1.0.3", "from": "destroy@1.0.3", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" }, + "detect-indent": { + "version": "4.0.0", + "from": "detect-indent@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "dev": true + }, "detect-libc": { "version": "1.0.3", "from": "detect-libc@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" }, + "detect-node": { + "version": "2.0.3", + "from": "detect-node@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "dev": true + }, + "di": { + "version": "0.0.1", + "from": "di@>=0.0.1 <0.0.2", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "dev": true + }, "dicer": { "version": "0.2.5", "from": "dicer@0.2.5", @@ -717,21 +2389,107 @@ "from": "diff@1.0.7", "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" }, + "diffie-hellman": { + "version": "5.0.3", + "from": "diffie-hellman@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "dev": true + }, + "director": { + "version": "1.2.7", + "from": "director@1.2.7", + "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "from": "dns-equal@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "from": "dns-packet@>=1.3.1 <2.0.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "dev": true + }, "dns-prefetch-control": { "version": "0.1.0", "from": "dns-prefetch-control@0.1.0", "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz" }, + "dns-txt": { + "version": "2.0.2", + "from": "dns-txt@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "from": "doctrine@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "dev": true + }, "doctypes": { "version": "1.1.0", "from": "doctypes@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" }, + "dom-serialize": { + "version": "2.2.1", + "from": "dom-serialize@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "from": "dom-serializer@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "dev": true, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "from": "domelementtype@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "from": "domain-browser@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "from": "domelementtype@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "from": "domhandler@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "from": "domutils@>=1.5.1 <2.0.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "dev": true + }, "dont-sniff-mimetype": { "version": "1.0.0", "from": "dont-sniff-mimetype@1.0.0", "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz" }, + "dot-prop": { + "version": "4.2.0", + "from": "dot-prop@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "dev": true + }, "dottie": { "version": "1.1.1", "from": "dottie@>=1.0.0 <2.0.0", @@ -748,6 +2506,18 @@ "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.2.8.tgz", "optional": true }, + "duplexer": { + "version": "0.1.1", + "from": "duplexer@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "from": "duplexer3@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "dev": true + }, "each-series": { "version": "1.0.0", "from": "each-series@>=1.0.0 <2.0.0", @@ -774,11 +2544,29 @@ "from": "ejs@>=0.8.3 <0.9.0", "resolved": "https://registry.npmjs.org/ejs/-/ejs-0.8.8.tgz" }, + "electron-to-chromium": { + "version": "1.3.45", + "from": "electron-to-chromium@>=1.2.7 <2.0.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "from": "elliptic@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "dev": true + }, "emojis-list": { "version": "2.1.0", "from": "emojis-list@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" }, + "encodeurl": { + "version": "1.0.2", + "from": "encodeurl@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "dev": true + }, "encoding": { "version": "0.1.12", "from": "encoding@>=0.1.0 <0.2.0", @@ -796,11 +2584,165 @@ "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" }, + "engine.io": { + "version": "3.1.5", + "from": "engine.io@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", + "dev": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "from": "accepts@>=1.3.4 <1.4.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "dev": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "from": "mime-db@>=1.33.0 <1.34.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "from": "mime-types@>=2.1.18 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.1.6", + "from": "engine.io-client@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "from": "engine.io-parser@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "dev": true + }, + "enhanced-resolve": { + "version": "3.4.1", + "from": "enhanced-resolve@>=3.4.0 <4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "dev": true + }, + "ent": { + "version": "2.2.0", + "from": "ent@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "dev": true + }, + "entities": { + "version": "1.1.1", + "from": "entities@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "dev": true + }, + "errno": { + "version": "0.1.7", + "from": "errno@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "dev": true + }, + "error": { + "version": "7.0.2", + "from": "error@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "from": "error-ex@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "dev": true + }, + "es-abstract": { + "version": "1.11.0", + "from": "es-abstract@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "dev": true + }, + "es-to-primitive": { + "version": "1.1.1", + "from": "es-to-primitive@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "dev": true + }, + "es5-ext": { + "version": "0.10.42", + "from": "es5-ext@>=0.10.14 <0.11.0", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "dev": true + }, + "es6-iterator": { + "version": "2.0.3", + "from": "es6-iterator@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "dev": true + }, + "es6-map": { + "version": "0.1.5", + "from": "es6-map@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "dev": true + }, "es6-promise": { "version": "4.2.4", "from": "es6-promise@>=4.1.1 <5.0.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz" }, + "es6-promisify": { + "version": "5.0.0", + "from": "es6-promisify@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "from": "es6-set@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "from": "es6-symbol@>=3.1.1 <3.2.0", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "dev": true + }, + "es6-weak-map": { + "version": "2.0.2", + "from": "es6-weak-map@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "dev": true + }, "escape-html": { "version": "1.0.2", "from": "escape-html@1.0.2", @@ -811,16 +2753,335 @@ "from": "escape-string-regexp@^1.0.2", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, + "escodegen": { + "version": "1.9.1", + "from": "escodegen@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "dev": true, + "optional": true, + "dependencies": { + "esprima": { + "version": "3.1.3", + "from": "esprima@^3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "dev": true, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "from": "escope@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "dev": true + }, + "eslint": { + "version": "4.19.1", + "from": "eslint@>=4.18.1 <5.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@^3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "from": "argparse@>=1.0.7 <2.0.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "esprima": { + "version": "4.0.0", + "from": "esprima@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "dev": true + }, + "glob": { + "version": "7.1.2", + "from": "glob@>=7.1.2 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "globals": { + "version": "11.5.0", + "from": "globals@>=11.0.1 <12.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "from": "js-yaml@>=3.9.1 <4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "11.0.0", + "from": "eslint-config-standard@>=11.0.0 <12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "from": "eslint-import-resolver-node@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@>=2.6.9 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "from": "eslint-module-utils@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@>=2.6.8 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "from": "find-up@^1.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "from": "path-exists@^2.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "dev": true + }, + "pkg-dir": { + "version": "1.0.0", + "from": "pkg-dir@^1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "dev": true + } + } + }, + "eslint-plugin-chai-expect": { + "version": "1.1.1", + "from": "eslint-plugin-chai-expect@latest", + "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-1.1.1.tgz", + "dev": true + }, + "eslint-plugin-chai-friendly": { + "version": "0.4.1", + "from": "eslint-plugin-chai-friendly@latest", + "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.4.1.tgz", + "dev": true + }, + "eslint-plugin-import": { + "version": "2.11.0", + "from": "eslint-plugin-import@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@>=2.6.8 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "doctrine": { + "version": "1.5.0", + "from": "doctrine@1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@^1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "resolve": { + "version": "1.7.1", + "from": "resolve@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "6.0.1", + "from": "eslint-plugin-node@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", + "dev": true, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "semver": { + "version": "5.5.0", + "from": "semver@>=5.4.1 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.7.0", + "from": "eslint-plugin-promise@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.1.0", + "from": "eslint-plugin-standard@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "from": "eslint-scope@>=3.7.1 <4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "from": "eslint-visitor-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "dev": true + }, + "espree": { + "version": "3.5.4", + "from": "espree@>=3.5.4 <4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "dev": true, + "dependencies": { + "acorn": { + "version": "5.5.3", + "from": "acorn@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "dev": true + } + } + }, "esprima": { "version": "1.0.4", "from": "esprima@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" }, + "esquery": { + "version": "1.0.1", + "from": "esquery@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "from": "esrecurse@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "from": "estraverse@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "from": "esutils@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "dev": true + }, "etag": { "version": "1.7.0", "from": "etag@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, + "event-emitter": { + "version": "0.3.5", + "from": "event-emitter@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "dev": true + }, + "event-stream": { + "version": "0.5.3", + "from": "event-stream@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.5.3.tgz", + "dev": true, + "dependencies": { + "optimist": { + "version": "0.2.8", + "from": "optimist@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", + "dev": true + } + } + }, "eventemitter2": { "version": "0.4.14", "from": "eventemitter2@>=0.4.13 <0.5.0", @@ -836,11 +3097,73 @@ "from": "events@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" }, + "eventsource": { + "version": "0.1.6", + "from": "eventsource@0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "dev": true + }, + "execa": { + "version": "0.7.0", + "from": "execa@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "dev": true + }, "exit": { "version": "0.1.2", "from": "exit@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, + "expand-braces": { + "version": "0.1.2", + "from": "expand-braces@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "dev": true, + "dependencies": { + "braces": { + "version": "0.1.5", + "from": "braces@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "dev": true + }, + "expand-range": { + "version": "0.1.1", + "from": "expand-range@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "dev": true + }, + "is-number": { + "version": "0.1.1", + "from": "is-number@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "from": "repeat-string@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "from": "expand-brackets@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "dev": true + }, "expect-ct": { "version": "0.1.0", "from": "expect-ct@0.1.0", @@ -922,16 +3245,56 @@ "from": "extend@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" }, + "extend-shallow": { + "version": "3.0.2", + "from": "extend-shallow@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "dev": true, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "from": "is-extendable@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "dev": true + } + } + }, "extendible": { "version": "0.1.1", "from": "extendible@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/extendible/-/extendible-0.1.1.tgz" }, + "external-editor": { + "version": "2.2.0", + "from": "external-editor@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "from": "iconv-lite@>=0.4.17 <0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "dev": true + } + } + }, + "extglob": { + "version": "0.3.2", + "from": "extglob@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "dev": true + }, "extsprintf": { "version": "1.3.0", "from": "extsprintf@1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" }, + "eyes": { + "version": "0.1.8", + "from": "eyes@>=0.1.8 <0.2.0", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "dev": true + }, "failure": { "version": "1.1.1", "from": "failure@>=1.1.0 <1.2.0", @@ -947,10 +3310,23 @@ "from": "fast-json-stable-stringify@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz" }, + "fast-levenshtein": { + "version": "2.0.6", + "from": "fast-levenshtein@>=2.0.4 <2.1.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "dev": true + }, "fastparse": { "version": "1.1.1", "from": "fastparse@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "from": "faye-websocket@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "dev": true }, "fbjs": { "version": "0.8.16", @@ -974,6 +3350,25 @@ "from": "fd-slicer@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz" }, + "figures": { + "version": "2.0.0", + "from": "figures@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "dev": true + }, + "file-entry-cache": { + "version": "2.0.0", + "from": "file-entry-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "from": "file-uri-to-path@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "dev": true, + "optional": true + }, "file-utils": { "version": "0.1.5", "from": "file-utils@>=0.1.5 <0.2.0", @@ -986,6 +3381,18 @@ } } }, + "filename-regex": { + "version": "2.0.1", + "from": "filename-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "dev": true + }, "finalhandler": { "version": "0.4.0", "from": "finalhandler@0.4.0", @@ -1003,6 +3410,18 @@ } } }, + "find-cache-dir": { + "version": "1.0.0", + "from": "find-cache-dir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "from": "find-up@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "dev": true + }, "findup-sync": { "version": "0.1.3", "from": "findup-sync@>=0.1.2 <0.2.0", @@ -1015,26 +3434,112 @@ } } }, + "flat-cache": { + "version": "1.3.0", + "from": "flat-cache@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "dev": true + }, + "flatiron": { + "version": "0.4.3", + "from": "flatiron@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/flatiron/-/flatiron-0.4.3.tgz", + "dev": true, + "dependencies": { + "optimist": { + "version": "0.6.0", + "from": "optimist@0.6.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", + "dev": true + } + } + }, "flexbuffer": { "version": "0.0.6", "from": "flexbuffer@0.0.6", "resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz" }, + "follow-redirects": { + "version": "1.0.0", + "from": "follow-redirects@1.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "dev": true, + "optional": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true, + "optional": true + } + } + }, + "for-in": { + "version": "1.0.2", + "from": "for-in@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "from": "for-own@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "from": "foreach@>=2.0.5 <3.0.0", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "dev": true + }, + "forever": { + "version": "0.14.2", + "from": "forever@>=0.14.1 <0.15.0", + "resolved": "https://registry.npmjs.org/forever/-/forever-0.14.2.tgz", + "dev": true + }, "forever-agent": { "version": "0.6.1", "from": "forever-agent@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, + "forever-monitor": { + "version": "1.5.2", + "from": "forever-monitor@>=1.5.1 <1.6.0", + "resolved": "https://registry.npmjs.org/forever-monitor/-/forever-monitor-1.5.2.tgz", + "dev": true, + "dependencies": { + "minimatch": { + "version": "1.0.0", + "from": "minimatch@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "dev": true + } + } + }, "form-data": { "version": "2.3.1", "from": "form-data@>=2.3.1 <2.4.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz" }, + "formatio": { + "version": "1.1.1", + "from": "formatio@1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "dev": true + }, "forwarded": { "version": "0.1.2", "from": "forwarded@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz" }, + "fragment-cache": { + "version": "0.2.1", + "from": "fragment-cache@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "dev": true + }, "frameguard": { "version": "3.0.0", "from": "frameguard@3.0.0", @@ -1045,6 +3550,18 @@ "from": "fresh@0.3.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, + "from": { + "version": "0.1.7", + "from": "from@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "dev": true + }, + "fs-access": { + "version": "1.0.1", + "from": "fs-access@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "dev": true + }, "fs-extra": { "version": "4.0.3", "from": "fs-extra@>=4.0.2 <5.0.0", @@ -1072,11 +3589,33 @@ } } }, + "ftp": { + "version": "0.3.10", + "from": "ftp@>=0.3.10 <0.4.0", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "dev": true, + "optional": true, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "from": "readable-stream@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "dev": true, + "optional": true + } + } + }, "function-bind": { "version": "1.1.1", "from": "function-bind@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" }, + "functional-red-black-tree": { + "version": "1.0.1", + "from": "functional-red-black-tree@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "dev": true + }, "fuse.js": { "version": "3.2.0", "from": "fuse.js@>=3.0.0 <4.0.0", @@ -1087,16 +3626,104 @@ "from": "gauge@>=2.7.3 <2.8.0", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" }, + "gaze": { + "version": "1.1.2", + "from": "gaze@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "dev": true + }, + "generate-function": { + "version": "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", + "dev": true, + "optional": true + }, + "generate-object-property": { + "version": "1.2.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", + "dev": true, + "optional": true + }, "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" }, + "get-caller-file": { + "version": "1.0.2", + "from": "get-caller-file@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "dev": true + }, "get-func-name": { "version": "2.0.0", "from": "get-func-name@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" }, + "get-stdin": { + "version": "4.0.1", + "from": "get-stdin@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "from": "get-stream@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "dev": true + }, + "get-uri": { + "version": "2.0.1", + "from": "get-uri@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", + "dev": true, + "optional": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@2", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true, + "optional": true + } + } + }, + "get-value": { + "version": "2.0.6", + "from": "get-value@>=2.0.6 <3.0.0", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "dev": true + }, "getobject": { "version": "0.1.0", "from": "getobject@>=0.1.0 <0.2.0", @@ -1119,6 +3746,82 @@ } } }, + "glob-base": { + "version": "0.3.0", + "from": "glob-base@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "from": "glob-parent@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "dev": true + }, + "global-dirs": { + "version": "0.1.1", + "from": "global-dirs@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "dev": true + }, + "globals": { + "version": "9.18.0", + "from": "globals@>=9.18.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "dev": true + }, + "globby": { + "version": "5.0.0", + "from": "globby@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "from": "glob@>=7.0.3 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "pify": { + "version": "2.3.0", + "from": "pify@^2.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + } + } + }, + "globule": { + "version": "1.2.0", + "from": "globule@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "from": "glob@>=7.1.1 <7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@~3.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + } + } + }, + "got": { + "version": "6.7.1", + "from": "got@>=6.7.1 <7.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "dev": true + }, "graceful-fs": { "version": "4.1.11", "from": "graceful-fs@>=4.1.2 <5.0.0", @@ -1186,6 +3889,26 @@ } } }, + "grunt-available-tasks": { + "version": "0.4.1", + "from": "grunt-available-tasks@0.4.1", + "resolved": "https://registry.npmjs.org/grunt-available-tasks/-/grunt-available-tasks-0.4.1.tgz", + "dev": true, + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@>=2.4.0 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "from": "underscore.string@>=2.3.3 <2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "dev": true + } + } + }, "grunt-bunyan": { "version": "0.5.0", "from": "grunt-bunyan@>=0.5.0 <0.6.0", @@ -1198,11 +3921,185 @@ } } }, + "grunt-cli": { + "version": "1.2.0", + "from": "grunt-cli@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "dev": true, + "dependencies": { + "findup-sync": { + "version": "0.3.0", + "from": "findup-sync@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "dev": true + }, + "glob": { + "version": "5.0.15", + "from": "glob@>=5.0.0 <5.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "dev": true + } + } + }, + "grunt-contrib-clean": { + "version": "0.5.0", + "from": "grunt-contrib-clean@0.5.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", + "dev": true + }, + "grunt-contrib-coffee": { + "version": "0.10.0", + "from": "grunt-contrib-coffee@0.10.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.10.0.tgz", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "from": "ansi-styles@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "from": "chalk@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "dev": true + }, + "coffee-script": { + "version": "1.7.1", + "from": "coffee-script@>=1.7.0 <1.8.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "from": "lodash@~2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "dev": true + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "dev": true + }, + "strip-ansi": { + "version": "0.1.1", + "from": "strip-ansi@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "dev": true + } + } + }, + "grunt-contrib-less": { + "version": "1.4.1", + "from": "grunt-contrib-less@1.4.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "2.6.0", + "from": "async@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "dev": true + } + } + }, + "grunt-contrib-requirejs": { + "version": "0.4.1", + "from": "grunt-contrib-requirejs@0.4.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.1.tgz", + "dev": true, + "dependencies": { + "requirejs": { + "version": "2.1.22", + "from": "requirejs@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz", + "dev": true + } + } + }, + "grunt-contrib-watch": { + "version": "1.1.0", + "from": "grunt-contrib-watch@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "2.6.0", + "from": "async@^2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "from": "lodash@>=4.17.10 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "dev": true + } + } + }, + "grunt-env": { + "version": "0.4.4", + "from": "grunt-env@0.4.4", + "resolved": "https://registry.npmjs.org/grunt-env/-/grunt-env-0.4.4.tgz", + "dev": true, + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@~2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "dev": true + } + } + }, + "grunt-exec": { + "version": "0.4.7", + "from": "grunt-exec@>=0.4.7 <0.5.0", + "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.7.tgz", + "dev": true + }, "grunt-execute": { "version": "0.2.2", "from": "grunt-execute@>=0.2.2 <0.3.0", "resolved": "https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz" }, + "grunt-file-append": { + "version": "0.0.6", + "from": "grunt-file-append@0.0.6", + "resolved": "https://registry.npmjs.org/grunt-file-append/-/grunt-file-append-0.0.6.tgz", + "dev": true + }, + "grunt-forever": { + "version": "0.4.7", + "from": "grunt-forever@>=0.4.7 <0.5.0", + "resolved": "https://registry.npmjs.org/grunt-forever/-/grunt-forever-0.4.7.tgz", + "dev": true + }, + "grunt-git-rev-parse": { + "version": "0.1.5", + "from": "grunt-git-rev-parse@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/grunt-git-rev-parse/-/grunt-git-rev-parse-0.1.5.tgz", + "dev": true + }, + "grunt-known-options": { + "version": "1.1.0", + "from": "grunt-known-options@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", + "dev": true + }, "grunt-legacy-log": { "version": "0.1.3", "from": "grunt-legacy-log@>=0.1.0 <0.2.0", @@ -1254,9 +4151,145 @@ } } }, + "grunt-mocha-test": { + "version": "0.9.0", + "from": "grunt-mocha-test@0.9.0", + "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.9.0.tgz", + "dev": true, + "dependencies": { + "commander": { + "version": "2.0.0", + "from": "commander@2.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "dev": true + }, + "glob": { + "version": "3.2.3", + "from": "glob@3.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", + "dev": true + }, + "graceful-fs": { + "version": "2.0.3", + "from": "graceful-fs@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "dev": true + }, + "jade": { + "version": "0.26.3", + "from": "jade@0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "dev": true, + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "commander@0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "from": "mkdirp@0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "dev": true + }, + "mocha": { + "version": "1.17.1", + "from": "mocha@>=1.17.1 <1.18.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.17.1.tgz", + "dev": true + } + } + }, + "grunt-newer": { + "version": "1.3.0", + "from": "grunt-newer@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/grunt-newer/-/grunt-newer-1.3.0.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@^1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "dev": true + }, + "glob": { + "version": "7.1.2", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "from": "rimraf@>=2.5.2 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "dev": true + } + } + }, + "grunt-parallel": { + "version": "0.5.1", + "from": "grunt-parallel@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/grunt-parallel/-/grunt-parallel-0.5.1.tgz", + "dev": true, + "dependencies": { + "q": { + "version": "0.8.12", + "from": "q@>=0.8.12 <0.9.0", + "resolved": "https://registry.npmjs.org/q/-/q-0.8.12.tgz", + "dev": true + } + } + }, + "grunt-postcss": { + "version": "0.8.0", + "from": "grunt-postcss@>=0.8.0 <0.9.0", + "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.8.0.tgz", + "dev": true, + "dependencies": { + "diff": { + "version": "2.2.3", + "from": "diff@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", + "dev": true + } + } + }, + "grunt-sed": { + "version": "0.1.1", + "from": "grunt-sed@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/grunt-sed/-/grunt-sed-0.1.1.tgz", + "dev": true + }, + "grunt-shell": { + "version": "2.1.0", + "from": "grunt-shell@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz", + "dev": true + }, + "handle-thing": { + "version": "1.2.5", + "from": "handle-thing@>=1.2.5 <2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "dev": true + }, "handlebars": { "version": "4.0.11", - "from": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "from": "handlebars@>=4.0.11 <5.0.0", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "dependencies": { "async": { @@ -1293,23 +4326,21 @@ }, "handlebars-loader": { "version": "1.7.0", - "from": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.0.tgz", + "from": "handlebars-loader@>=1.7.0 <2.0.0", "resolved": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.0.tgz", + "dev": true, "dependencies": { "async": { "version": "0.2.10", "from": "async@>=0.2.10 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" - }, - "json5": { - "version": "0.5.1", - "from": "json5@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "dev": true }, "loader-utils": { "version": "1.0.4", "from": "loader-utils@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.0.4.tgz" + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.0.4.tgz", + "dev": true } } }, @@ -1333,11 +4364,103 @@ "from": "has@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" }, + "has-ansi": { + "version": "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", + "dev": true + }, + "has-binary2": { + "version": "1.0.3", + "from": "has-binary2@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "2.0.1", + "from": "isarray@2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "dev": true + } + } + }, + "has-color": { + "version": "0.1.7", + "from": "has-color@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "dev": true + }, + "has-cors": { + "version": "1.1.0", + "from": "has-cors@1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "from": "has-flag@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "dev": true + }, "has-unicode": { "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" }, + "has-value": { + "version": "1.0.0", + "from": "has-value@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "from": "has-values@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "dev": true, + "dependencies": { + "is-number": { + "version": "3.0.0", + "from": "is-number@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "kind-of": { + "version": "4.0.0", + "from": "kind-of@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "dev": true + } + } + }, + "hash-base": { + "version": "3.0.4", + "from": "hash-base@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "dev": true + }, + "hash.js": { + "version": "1.1.3", + "from": "hash.js@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "dev": true + }, "hawk": { "version": "6.0.2", "from": "hawk@>=6.0.2 <6.1.0", @@ -1368,11 +4491,30 @@ "from": "hide-powered-by@1.0.0", "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz" }, + "hipchat-notifier": { + "version": "1.1.0", + "from": "hipchat-notifier@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", + "dev": true, + "optional": true + }, + "hmac-drbg": { + "version": "1.0.1", + "from": "hmac-drbg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "dev": true + }, "hoek": { "version": "4.2.0", "from": "hoek@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz" }, + "home-or-tmp": { + "version": "2.0.0", + "from": "home-or-tmp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "dev": true + }, "hooker": { "version": "0.2.3", "from": "hooker@>=0.2.3 <0.3.0", @@ -1383,6 +4525,44 @@ "from": "hooks-fixed@2.0.0", "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.0.tgz" }, + "hosted-git-info": { + "version": "2.6.0", + "from": "hosted-git-info@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "from": "hpack.js@>=2.1.6 <3.0.0", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, "hpkp": { "version": "2.0.0", "from": "hpkp@2.0.0", @@ -1393,6 +4573,50 @@ "from": "hsts@2.1.0", "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz" }, + "html-entities": { + "version": "1.2.1", + "from": "html-entities@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "dev": true + }, + "htmlparser2": { + "version": "3.9.2", + "from": "htmlparser2@>=3.9.0 <4.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "from": "http-deceiver@>=1.2.7 <2.0.0", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "dev": true + }, "http-errors": { "version": "1.6.2", "from": "http-errors@>=1.6.2 <1.7.0", @@ -1405,16 +4629,122 @@ } } }, + "http-parser-js": { + "version": "0.4.12", + "from": "http-parser-js@>=0.4.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", + "dev": true + }, "http-proxy": { "version": "1.16.2", "from": "http-proxy@>=1.8.1 <2.0.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz" }, + "http-proxy-agent": { + "version": "2.1.0", + "from": "http-proxy-agent@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "from": "http-proxy-middleware@>=0.17.4 <0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "from": "is-extglob@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "from": "is-glob@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "dev": true + } + } + }, "http-signature": { "version": "1.2.0", "from": "http-signature@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" }, + "httpntlm": { + "version": "1.6.1", + "from": "httpntlm@1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "dev": true, + "dependencies": { + "underscore": { + "version": "1.7.0", + "from": "underscore@>=1.7.0 <1.8.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "dev": true + } + } + }, + "httpreq": { + "version": "0.4.24", + "from": "httpreq@>=0.4.22", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "from": "https-browserify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "from": "https-proxy-agent@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + } + } + }, + "i": { + "version": "0.3.6", + "from": "i@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", + "dev": true + }, + "i18next": { + "version": "1.10.6", + "from": "i18next@>=1.10.6 <2.0.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-1.10.6.tgz", + "dev": true, + "dependencies": { + "json5": { + "version": "0.2.0", + "from": "json5@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.2.0.tgz", + "dev": true + } + } + }, + "i18next-client": { + "version": "1.10.3", + "from": "i18next-client@1.10.3", + "resolved": "https://registry.npmjs.org/i18next-client/-/i18next-client-1.10.3.tgz", + "dev": true + }, "iconv-lite": { "version": "0.2.11", "from": "iconv-lite@>=0.2.11 <0.3.0", @@ -1430,6 +4760,37 @@ "from": "ienoopen@1.0.0", "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz" }, + "ignore": { + "version": "3.3.8", + "from": "ignore@>=3.3.3 <4.0.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "from": "ignore-by-default@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "from": "image-size@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "dev": true, + "optional": true + }, + "import-lazy": { + "version": "2.1.0", + "from": "import-lazy@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "from": "import-local@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "dev": true + }, "imports-loader": { "version": "0.8.0", "from": "imports-loader@latest", @@ -1442,6 +4803,24 @@ } } }, + "imurmurhash": { + "version": "0.1.4", + "from": "imurmurhash@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "from": "indent-string@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "from": "indexof@0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "dev": true + }, "inflection": { "version": "1.12.0", "from": "inflection@>=1.6.0 <2.0.0", @@ -1462,6 +4841,86 @@ "from": "ini@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz" }, + "inquirer": { + "version": "3.3.0", + "from": "inquirer@>=3.0.6 <4.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@^3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@^4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "internal-ip": { + "version": "1.2.0", + "from": "internal-ip@1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "from": "interpret@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "from": "invariant@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "from": "invert-kv@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "dev": true + }, "ioredis": { "version": "3.2.2", "from": "ioredis@>=3.2.1 <4.0.0", @@ -1479,46 +4938,295 @@ } } }, + "ip": { + "version": "1.1.5", + "from": "ip@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "dev": true + }, "ipaddr.js": { "version": "1.0.5", "from": "ipaddr.js@1.0.5", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" }, + "is-accessor-descriptor": { + "version": "0.1.6", + "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "from": "is-arrayish@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "from": "is-binary-path@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "dev": true + }, "is-buffer": { "version": "1.1.6", "from": "is-buffer@>=1.1.5 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" }, + "is-builtin-module": { + "version": "1.0.0", + "from": "is-builtin-module@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "dev": true + }, + "is-callable": { + "version": "1.1.3", + "from": "is-callable@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "dev": true + }, + "is-ci": { + "version": "1.1.0", + "from": "is-ci@>=1.0.10 <2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "from": "is-data-descriptor@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "from": "is-date-object@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "from": "kind-of@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "from": "is-dotfile@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "dev": true + }, "is-expression": { "version": "2.1.0", "from": "is-expression@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz" }, + "is-extendable": { + "version": "0.1.1", + "from": "is-extendable@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "from": "is-finite@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "dev": true + }, "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" }, + "is-glob": { + "version": "2.0.1", + "from": "is-glob@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "dev": true + }, + "is-installed-globally": { + "version": "0.1.0", + "from": "is-installed-globally@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "from": "is-my-ip-valid@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "dev": true, + "optional": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "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.17.2.tgz", + "dev": true, + "optional": true + }, + "is-npm": { + "version": "1.0.0", + "from": "is-npm@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "from": "is-number@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "from": "is-obj@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "dev": true + }, + "is-odd": { + "version": "2.0.0", + "from": "is-odd@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "dev": true, + "dependencies": { + "is-number": { + "version": "4.0.0", + "from": "is-number@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "from": "is-path-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "from": "is-path-in-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "from": "is-path-inside@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "from": "is-plain-object@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "from": "is-posix-bracket@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "from": "is-primitive@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "dev": true + }, "is-promise": { "version": "1.0.1", "from": "is-promise@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz" }, + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "dev": true, + "optional": true + }, + "is-redirect": { + "version": "1.0.0", + "from": "is-redirect@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "dev": true + }, "is-regex": { "version": "1.0.4", "from": "is-regex@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" }, + "is-resolvable": { + "version": "1.1.0", + "from": "is-resolvable@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "from": "is-retry-allowed@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "dev": true + }, "is-stream": { "version": "1.1.0", "from": "is-stream@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" }, + "is-symbol": { + "version": "1.0.1", + "from": "is-symbol@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, + "is-utf8": { + "version": "0.2.1", + "from": "is-utf8@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "from": "is-windows@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "from": "is-wsl@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "dev": true + }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -1529,6 +5237,26 @@ "from": "isbinaryfile@>=0.1.9 <0.2.0", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz" }, + "isexe": { + "version": "2.0.0", + "from": "isexe@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + } + } + }, "isomorphic-fetch": { "version": "2.2.1", "from": "isomorphic-fetch@>=2.1.1 <3.0.0", @@ -1561,6 +5289,12 @@ "from": "jquery@1.11.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.11.1.tgz" }, + "js-base64": { + "version": "2.4.3", + "from": "js-base64@>=2.1.9 <3.0.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "dev": true + }, "js-stringify": { "version": "1.0.2", "from": "js-stringify@>=1.0.1 <2.0.0", @@ -1582,6 +5316,18 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "optional": true }, + "jsesc": { + "version": "1.3.0", + "from": "jsesc@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "from": "json-loader@>=0.5.4 <0.6.0", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "dev": true + }, "json-schema": { "version": "0.2.3", "from": "json-schema@0.2.3", @@ -1597,11 +5343,29 @@ "from": "json-stable-stringify@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "from": "json-stable-stringify-without-jsonify@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, + "json3": { + "version": "3.3.2", + "from": "json3@>=3.3.2 <4.0.0", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "dev": true + }, + "json5": { + "version": "0.5.1", + "from": "json5@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "dev": true + }, "jsonfile": { "version": "4.0.0", "from": "jsonfile@>=4.0.0 <5.0.0", @@ -1612,6 +5376,13 @@ "from": "jsonify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" }, + "jsonpointer": { + "version": "4.0.1", + "from": "jsonpointer@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "dev": true, + "optional": true + }, "jsonwebtoken": { "version": "8.1.1", "from": "jsonwebtoken@>=8.0.1 <9.0.0", @@ -1666,11 +5437,195 @@ "from": "kareem@1.5.0", "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz" }, + "karma": { + "version": "2.0.2", + "from": "karma@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.2.tgz", + "dev": true, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "from": "bluebird@>=3.3.0 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "dev": true + }, + "colors": { + "version": "1.2.5", + "from": "colors@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "dev": true + }, + "glob": { + "version": "7.1.2", + "from": "glob@>=7.1.1 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "from": "isbinaryfile@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "from": "range-parser@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "from": "rimraf@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "dev": true + } + } + }, + "karma-chai-sinon": { + "version": "0.1.5", + "from": "karma-chai-sinon@latest", + "resolved": "https://registry.npmjs.org/karma-chai-sinon/-/karma-chai-sinon-0.1.5.tgz", + "dev": true + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "from": "karma-chrome-launcher@latest", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "dev": true, + "dependencies": { + "which": { + "version": "1.3.0", + "from": "which@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "dev": true + } + } + }, + "karma-mocha": { + "version": "1.3.0", + "from": "karma-mocha@latest", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + } + } + }, + "karma-mocha-reporter": { + "version": "2.2.5", + "from": "karma-mocha-reporter@latest", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "karma-requirejs": { + "version": "1.1.0", + "from": "karma-requirejs@latest", + "resolved": "https://registry.npmjs.org/karma-requirejs/-/karma-requirejs-1.1.0.tgz", + "dev": true + }, + "karma-webpack": { + "version": "2.0.13", + "from": "karma-webpack@>=2.0.9 <3.0.0", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.13.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "2.6.0", + "from": "async@^2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "from": "source-map@>=0.5.6 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + } + } + }, + "keygrip": { + "version": "1.0.2", + "from": "keygrip@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.2.tgz", + "dev": true + }, + "killable": { + "version": "1.0.0", + "from": "killable@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "dev": true + }, "kind-of": { "version": "3.2.2", "from": "kind-of@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" }, + "latest-version": { + "version": "3.1.0", + "from": "latest-version@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "dev": true + }, + "lazy": { + "version": "1.0.11", + "from": "lazy@>=1.0.11 <1.1.0", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "dev": true + }, "lazy-cache": { "version": "1.0.4", "from": "lazy-cache@>=1.0.3 <2.0.0", @@ -1681,6 +5636,12 @@ "from": "lazystream@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" }, + "lcid": { + "version": "1.0.0", + "from": "lcid@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "dev": true + }, "ldap-filter": { "version": "0.2.2", "from": "ldap-filter@0.2.2", @@ -1789,6 +5750,137 @@ } } }, + "less": { + "version": "2.7.3", + "from": "less@>=2.7.1 <2.8.0", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "dev": true, + "dependencies": { + "ajv": { + "version": "4.11.8", + "from": "ajv@>=4.9.1 <5.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "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", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "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", + "dev": true, + "optional": true + }, + "boom": { + "version": "2.10.1", + "from": "boom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "from": "form-data@>=2.1.1 <2.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "1.0.5", + "from": "har-schema@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "from": "har-validator@>=4.2.1 <4.3.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "from": "hawk@>=3.1.3 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "dev": true, + "optional": true + }, + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "from": "http-signature@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "from": "performance-now@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "dev": true, + "optional": true + }, + "promise": { + "version": "7.3.1", + "from": "promise@>=7.1.1 <8.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "from": "qs@>=6.4.0 <6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "dev": true, + "optional": true + }, + "request": { + "version": "2.81.0", + "from": "request@2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.5.7", + "from": "source-map@>=0.5.3 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true, + "optional": true + } + } + }, + "levn": { + "version": "0.3.0", + "from": "levn@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "dev": true + }, "libbase64": { "version": "0.1.0", "from": "libbase64@0.1.0", @@ -1811,6 +5903,32 @@ "from": "libqp@1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz" }, + "livereload-js": { + "version": "2.3.0", + "from": "livereload-js@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "from": "load-json-file@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "dev": true, + "dependencies": { + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.3.0", + "from": "loader-runner@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "dev": true + }, "loader-utils": { "version": "1.1.0", "from": "loader-utils@>=1.0.2 <2.0.0", @@ -1828,6 +5946,12 @@ "from": "loads@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/loads/-/loads-0.0.4.tgz" }, + "locate-path": { + "version": "2.0.0", + "from": "locate-path@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "dev": true + }, "lodash": { "version": "4.17.4", "from": "lodash@>=4.13.1 <5.0.0", @@ -1863,6 +5987,12 @@ "from": "lodash.difference@>=4.5.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" }, + "lodash.escaperegexp": { + "version": "4.1.2", + "from": "lodash.escaperegexp@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "dev": true + }, "lodash.flatten": { "version": "4.4.0", "from": "lodash.flatten@>=4.4.0 <5.0.0", @@ -1918,6 +6048,12 @@ "from": "lodash.keys@>=4.2.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz" }, + "lodash.mergewith": { + "version": "4.6.1", + "from": "lodash.mergewith@>=4.6.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "dev": true + }, "lodash.noop": { "version": "3.0.1", "from": "lodash.noop@>=3.0.1 <4.0.0", @@ -1958,6 +6094,156 @@ "from": "lodash.values@>=4.3.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" }, + "log-symbols": { + "version": "2.2.0", + "from": "log-symbols@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@^3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "log4js": { + "version": "2.6.0", + "from": "log4js@>=2.3.9 <3.0.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.6.0.tgz", + "dev": true, + "dependencies": { + "addressparser": { + "version": "1.0.1", + "from": "addressparser@1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "dev": true, + "optional": true + }, + "buildmail": { + "version": "4.0.1", + "from": "buildmail@4.0.1", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", + "dev": true, + "optional": true + }, + "circular-json": { + "version": "0.5.4", + "from": "circular-json@>=0.5.4 <0.6.0", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.4.tgz", + "dev": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "iconv-lite": { + "version": "0.4.15", + "from": "iconv-lite@0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "dev": true + }, + "libmime": { + "version": "3.0.0", + "from": "libmime@3.0.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", + "dev": true + }, + "mailcomposer": { + "version": "4.0.1", + "from": "mailcomposer@4.0.1", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", + "dev": true, + "optional": true + }, + "nodemailer": { + "version": "2.7.2", + "from": "nodemailer@>=2.5.0 <3.0.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", + "dev": true, + "optional": true + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "from": "nodemailer-direct-transport@3.3.2", + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "dev": true, + "optional": true + }, + "nodemailer-fetch": { + "version": "1.6.0", + "from": "nodemailer-fetch@1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "dev": true + }, + "nodemailer-shared": { + "version": "1.1.0", + "from": "nodemailer-shared@1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "dev": true + }, + "nodemailer-smtp-pool": { + "version": "2.8.2", + "from": "nodemailer-smtp-pool@2.8.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "dev": true, + "optional": true + }, + "nodemailer-smtp-transport": { + "version": "2.7.2", + "from": "nodemailer-smtp-transport@2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "dev": true, + "optional": true + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "from": "nodemailer-wellknown@0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "dev": true + }, + "semver": { + "version": "5.5.0", + "from": "semver@^5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "dev": true + }, + "smtp-connection": { + "version": "2.12.0", + "from": "smtp-connection@2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "dev": true + }, + "socks": { + "version": "1.1.9", + "from": "socks@1.1.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", + "dev": true, + "optional": true + } + } + }, "logger-sharelatex": { "version": "1.5.7", "from": "git+https://github.com/sharelatex/logger-sharelatex.git#master", @@ -2189,6 +6475,158 @@ } } }, + "loggly": { + "version": "1.1.1", + "from": "loggly@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "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", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "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", + "dev": true, + "optional": true + }, + "bl": { + "version": "1.1.2", + "from": "bl@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "dev": true, + "optional": true + }, + "boom": { + "version": "2.10.1", + "from": "boom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "dev": true, + "optional": true + }, + "commander": { + "version": "2.15.1", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "dev": true, + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.0.0", + "from": "form-data@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "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", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "from": "hawk@>=3.1.3 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "dev": true, + "optional": true + }, + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "from": "http-signature@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true, + "optional": true + }, + "node-uuid": { + "version": "1.4.8", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "from": "qs@>=6.2.0 <6.3.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.5 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "dev": true, + "optional": true + }, + "request": { + "version": "2.75.0", + "from": "request@>=2.75.0 <2.76.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.4.3", + "from": "tunnel-agent@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "dev": true, + "optional": true + } + } + }, + "loglevel": { + "version": "1.6.1", + "from": "loglevel@>=1.4.1 <2.0.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "dev": true + }, + "lolex": { + "version": "1.3.2", + "from": "lolex@1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "dev": true + }, "longest": { "version": "1.0.1", "from": "longest@>=1.0.1 <2.0.0", @@ -2199,6 +6637,24 @@ "from": "loose-envify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" }, + "loud-rejection": { + "version": "1.6.0", + "from": "loud-rejection@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "from": "lowercase-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "dev": true + }, + "lpad": { + "version": "0.1.0", + "from": "lpad@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz", + "dev": true + }, "lru-cache": { "version": "2.7.3", "from": "lru-cache@>=2.0.0 <3.0.0", @@ -2219,21 +6675,186 @@ "from": "mailcomposer@3.3.2", "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.3.2.tgz" }, + "mailgun-js": { + "version": "0.18.0", + "from": "mailgun-js@>=0.18.0 <0.19.0", + "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.0.tgz", + "dev": true, + "optional": true, + "dependencies": { + "async": { + "version": "2.6.0", + "from": "async@~2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "dev": true, + "optional": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true, + "optional": true + } + } + }, + "make-dir": { + "version": "1.3.0", + "from": "make-dir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "dev": true + }, "mandrill-api": { "version": "1.0.45", "from": "mandrill-api@>=1.0.45 <2.0.0", "resolved": "https://registry.npmjs.org/mandrill-api/-/mandrill-api-1.0.45.tgz" }, + "map-cache": { + "version": "0.2.2", + "from": "map-cache@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "from": "map-obj@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "from": "map-stream@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "from": "map-visit@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "dev": true + }, "marked": { "version": "0.3.12", "from": "marked@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz" }, + "math-random": { + "version": "1.0.1", + "from": "math-random@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "from": "md5.js@>=1.3.4 <2.0.0", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "dev": true + }, "media-typer": { "version": "0.3.0", "from": "media-typer@0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, + "mem": { + "version": "1.1.0", + "from": "mem@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "from": "memory-fs@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "meow": { + "version": "3.7.0", + "from": "meow@>=3.3.0 <4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "from": "find-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "from": "load-json-file@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "from": "minimist@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "from": "path-exists@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "from": "path-type@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "dev": true + }, + "pify": { + "version": "2.3.0", + "from": "pify@^2.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "from": "read-pkg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "from": "read-pkg-up@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "from": "strip-bom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "dev": true + } + } + }, "merge-descriptors": { "version": "1.0.0", "from": "merge-descriptors@1.0.0", @@ -2278,11 +6899,23 @@ } } }, + "micromatch": { + "version": "2.3.11", + "from": "micromatch@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "dev": true + }, "microtime-nodejs": { "version": "1.0.0", "from": "microtime-nodejs@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/microtime-nodejs/-/microtime-nodejs-1.0.0.tgz" }, + "miller-rabin": { + "version": "4.0.1", + "from": "miller-rabin@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "dev": true + }, "mime": { "version": "1.3.4", "from": "mime@1.3.4", @@ -2303,6 +6936,24 @@ "from": "mimelib@0.2.14", "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.2.14.tgz" }, + "mimic-fn": { + "version": "1.2.0", + "from": "mimic-fn@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "from": "minimalistic-crypto-utils@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "dev": true + }, "minimatch": { "version": "0.2.14", "from": "minimatch@>=0.2.12 <0.3.0", @@ -2313,6 +6964,20 @@ "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, + "mixin-deep": { + "version": "1.3.1", + "from": "mixin-deep@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "dev": true, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "from": "is-extendable@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "dev": true + } + } + }, "mkdirp": { "version": "0.5.1", "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -2540,11 +7205,37 @@ } } }, + "multicast-dns": { + "version": "6.2.3", + "from": "multicast-dns@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "dev": true, + "dependencies": { + "thunky": { + "version": "1.0.2", + "from": "thunky@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "dev": true + } + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "from": "multicast-dns-service-types@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "dev": true + }, "muri": { "version": "1.2.2", "from": "muri@1.2.2", "resolved": "https://registry.npmjs.org/muri/-/muri-1.2.2.tgz" }, + "mute-stream": { + "version": "0.0.7", + "from": "mute-stream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "dev": true + }, "mv": { "version": "0.0.5", "from": "mv@0.0.5", @@ -2556,6 +7247,58 @@ "from": "nan@2.3.5", "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" }, + "nanomatch": { + "version": "1.2.9", + "from": "nanomatch@>=1.2.9 <2.0.0", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "dev": true, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "from": "arr-diff@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "from": "array-unique@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "from": "natural-compare@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "dev": true + }, + "nconf": { + "version": "0.6.9", + "from": "nconf@>=0.6.9 <0.7.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.6.9.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.2.9", + "from": "async@0.2.9", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz", + "dev": true + }, + "optimist": { + "version": "0.6.0", + "from": "optimist@0.6.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", + "dev": true + } + } + }, "ncp": { "version": "2.0.0", "from": "ncp@>=2.0.0 <2.1.0", @@ -2567,6 +7310,25 @@ "from": "negotiator@0.5.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" }, + "neo-async": { + "version": "2.5.1", + "from": "neo-async@>=2.5.0 <3.0.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "dev": true + }, + "netmask": { + "version": "1.0.6", + "from": "netmask@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "dev": true, + "optional": true + }, + "next-tick": { + "version": "1.0.0", + "from": "next-tick@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "dev": true + }, "nise": { "version": "1.2.2", "from": "nise@>=1.2.0 <2.0.0", @@ -2609,6 +7371,52 @@ "from": "node-html-encoder@0.0.2", "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz" }, + "node-libs-browser": { + "version": "2.1.0", + "from": "node-libs-browser@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@^1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + }, + "url": { + "version": "0.11.0", + "from": "url@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "dev": true, + "dependencies": { + "punycode": { + "version": "1.3.2", + "from": "punycode@1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "dev": true + } + } + } + } + }, "node-pre-gyp": { "version": "0.6.30", "from": "node-pre-gyp@0.6.30", @@ -2688,16 +7496,360 @@ "from": "nodemailer-wellknown@0.1.7", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.7.tgz" }, + "nodemon": { + "version": "1.17.4", + "from": "nodemon@>=1.14.3 <2.0.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.17.4.tgz", + "dev": true, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "from": "anymatch@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "from": "arr-diff@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "from": "array-unique@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "dev": true + }, + "braces": { + "version": "2.3.2", + "from": "braces@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "chokidar": { + "version": "2.0.3", + "from": "chokidar@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "dev": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "from": "expand-brackets@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "from": "is-accessor-descriptor@^0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "from": "is-data-descriptor@^0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "from": "is-descriptor@^0.1.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "from": "kind-of@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "from": "extglob@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "1.0.0", + "from": "define-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "fill-range": { + "version": "4.0.0", + "from": "fill-range@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "from": "glob-parent@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "dev": true, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "from": "is-glob@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "from": "is-data-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "from": "is-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "from": "is-extglob@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "from": "is-glob@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "from": "is-number@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "from": "micromatch@>=3.1.4 <4.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@^2.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dev": true + }, + "semver": { + "version": "5.5.0", + "from": "semver@>=5.4.1 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "nomnom": { + "version": "1.6.2", + "from": "nomnom@>=1.6.0 <1.7.0", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "dev": true, + "dependencies": { + "colors": { + "version": "0.5.1", + "from": "colors@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "dev": true + }, + "underscore": { + "version": "1.4.4", + "from": "underscore@>=1.4.4 <1.5.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "dev": true + } + } + }, "nopt": { "version": "3.0.6", "from": "nopt@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" }, + "normalize-package-data": { + "version": "2.4.0", + "from": "normalize-package-data@>=2.3.2 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "from": "normalize-path@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "from": "normalize-range@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "from": "npm-run-path@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "dev": true + }, "npmlog": { "version": "4.1.2", "from": "npmlog@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" }, + "nssocket": { + "version": "0.5.3", + "from": "nssocket@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.5.3.tgz", + "dev": true + }, + "null-check": { + "version": "1.0.0", + "from": "null-check@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "from": "num2fraction@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "from": "number-is-nan@>=1.0.0 <2.0.0", @@ -2723,6 +7875,72 @@ "from": "object-assign@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" }, + "object-component": { + "version": "0.0.3", + "from": "object-component@0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "from": "object-copy@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + } + } + }, + "object-keys": { + "version": "1.0.11", + "from": "object-keys@>=1.0.8 <2.0.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "from": "object-visit@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "from": "object.omit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "dev": true + }, + "object.pick": { + "version": "1.3.0", + "from": "object.pick@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, + "obuf": { + "version": "1.1.2", + "from": "obuf@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "dev": true + }, "on-finished": { "version": "2.3.0", "from": "on-finished@>=2.3.0 <2.4.0", @@ -2743,16 +7961,216 @@ "from": "one-time@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz" }, + "onesky": { + "version": "0.1.6", + "from": "onesky@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/onesky/-/onesky-0.1.6.tgz", + "dev": true, + "dependencies": { + "asn1": { + "version": "0.1.11", + "from": "asn1@0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "from": "assert-plus@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "dev": true, + "optional": true + }, + "async": { + "version": "0.9.2", + "from": "async@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.5.0", + "from": "aws-sign2@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "dev": true, + "optional": true + }, + "boom": { + "version": "0.4.2", + "from": "boom@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "from": "combined-stream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "dev": true, + "optional": true + }, + "cryptiles": { + "version": "0.2.2", + "from": "cryptiles@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "0.0.5", + "from": "delayed-stream@0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "dev": true, + "optional": true + }, + "forever-agent": { + "version": "0.5.2", + "from": "forever-agent@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "dev": true + }, + "form-data": { + "version": "0.1.4", + "from": "form-data@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "dev": true, + "optional": true + }, + "hawk": { + "version": "1.1.1", + "from": "hawk@1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "dev": true, + "optional": true + }, + "hoek": { + "version": "0.9.1", + "from": "hoek@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "dev": true + }, + "http-signature": { + "version": "0.10.1", + "from": "http-signature@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "dev": true, + "optional": true + }, + "mime": { + "version": "1.2.11", + "from": "mime@~1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "1.0.2", + "from": "mime-types@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "from": "node-uuid@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "dev": true + }, + "oauth-sign": { + "version": "0.3.0", + "from": "oauth-sign@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "dev": true, + "optional": true + }, + "qs": { + "version": "1.0.2", + "from": "qs@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", + "dev": true + }, + "request": { + "version": "2.40.0", + "from": "request@>=2.40.0 <2.41.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", + "dev": true + }, + "sntp": { + "version": "0.2.4", + "from": "sntp@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.4.3", + "from": "tunnel-agent@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "dev": true, + "optional": true + } + } + }, + "onetime": { + "version": "2.0.1", + "from": "onetime@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "dev": true + }, + "opn": { + "version": "5.3.0", + "from": "opn@>=5.1.0 <6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "dev": true + }, "optimist": { "version": "0.6.1", "from": "optimist@0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz" }, + "optionator": { + "version": "0.8.2", + "from": "optionator@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "from": "wordwrap@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "dev": true + } + } + }, + "original": { + "version": "1.0.0", + "from": "original@>=0.0.5", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "dev": true, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "from": "url-parse@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "dev": true + } + } + }, + "os-browserify": { + "version": "0.3.0", + "from": "os-browserify@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "dev": true + }, "os-homedir": { "version": "1.0.2", "from": "os-homedir@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" }, + "os-locale": { + "version": "2.1.0", + "from": "os-locale@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "dev": true + }, "os-tmpdir": { "version": "1.0.2", "from": "os-tmpdir@>=1.0.0 <2.0.0", @@ -2763,16 +8181,117 @@ "from": "osenv@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz" }, + "p-finally": { + "version": "1.0.0", + "from": "p-finally@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "from": "p-limit@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "from": "p-locate@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "dev": true + }, + "p-map": { + "version": "1.2.0", + "from": "p-map@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "from": "p-try@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "dev": true + }, + "pac-proxy-agent": { + "version": "2.0.2", + "from": "pac-proxy-agent@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "dev": true, + "optional": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true, + "optional": true + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "from": "pac-resolver@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "dev": true, + "optional": true + }, + "package-json": { + "version": "4.0.1", + "from": "package-json@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "dev": true + }, + "pako": { + "version": "1.0.6", + "from": "pako@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "dev": true + }, + "parse-asn1": { + "version": "5.1.1", + "from": "parse-asn1@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "from": "parse-json@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "dev": true + }, "parse-mongo-url": { "version": "1.1.1", "from": "parse-mongo-url@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/parse-mongo-url/-/parse-mongo-url-1.1.1.tgz" }, + "parseqs": { + "version": "0.0.5", + "from": "parseqs@0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "dev": true + }, + "parseuri": { + "version": "0.0.5", + "from": "parseuri@0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "dev": true + }, "parseurl": { "version": "1.3.2", "from": "parseurl@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" }, + "pascalcase": { + "version": "0.1.1", + "from": "pascalcase@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "dev": true + }, "passport": { "version": "0.3.2", "from": "passport@>=0.3.2 <0.4.0", @@ -2832,21 +8351,81 @@ "from": "passport-strategy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" }, + "path-browserify": { + "version": "0.0.0", + "from": "path-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "from": "path-dirname@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "from": "path-exists@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" }, + "path-is-inside": { + "version": "1.0.2", + "from": "path-is-inside@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "from": "path-key@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "dev": true + }, "path-parse": { "version": "1.0.5", "from": "path-parse@>=1.0.5 <2.0.0", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" }, + "path-proxy": { + "version": "1.0.0", + "from": "path-proxy@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", + "dev": true, + "optional": true, + "dependencies": { + "inflection": { + "version": "1.3.8", + "from": "inflection@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", + "dev": true, + "optional": true + } + } + }, "path-to-regexp": { "version": "0.1.6", "from": "path-to-regexp@0.1.6", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.6.tgz" }, + "path-type": { + "version": "2.0.0", + "from": "path-type@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "dev": true, + "dependencies": { + "pify": { + "version": "2.3.0", + "from": "pify@^2.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + } + } + }, "pathval": { "version": "1.1.0", "from": "pathval@>=1.0.0 <2.0.0", @@ -2857,6 +8436,18 @@ "from": "pause@0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" }, + "pause-stream": { + "version": "0.0.11", + "from": "pause-stream@0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "dev": true + }, + "pbkdf2": { + "version": "3.0.16", + "from": "pbkdf2@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "dev": true + }, "pend": { "version": "1.2.0", "from": "pend@>=1.2.0 <1.3.0", @@ -2867,11 +8458,47 @@ "from": "performance-now@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" }, + "pify": { + "version": "3.0.0", + "from": "pify@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "from": "pkg-dir@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "dev": true + }, + "pkginfo": { + "version": "0.3.1", + "from": "pkginfo@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "dev": true + }, "platform": { "version": "1.3.5", "from": "platform@1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz" }, + "pluralize": { + "version": "7.0.0", + "from": "pluralize@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "dev": true + }, "pooling": { "version": "0.4.6", "from": "pooling@0.4.6", @@ -2889,21 +8516,116 @@ } } }, + "portfinder": { + "version": "1.0.13", + "from": "portfinder@>=1.0.9 <2.0.0", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "dev": true + }, + "debug": { + "version": "2.6.9", + "from": "debug@^2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "from": "posix-character-classes@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "from": "postcss@>=5.2.16 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.5.7", + "from": "source-map@>=0.5.6 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "from": "postcss-value-parser@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "dev": true + }, "precond": { "version": "0.2.3", "from": "precond@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" }, + "prelude-ls": { + "version": "1.1.2", + "from": "prelude-ls@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "from": "prepend-http@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "from": "preserve@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "dev": true + }, + "private": { + "version": "0.1.8", + "from": "private@>=0.1.7 <0.2.0", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "dev": true + }, + "process": { + "version": "0.11.10", + "from": "process@>=0.11.10 <0.12.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "dev": true + }, "process-nextick-args": { "version": "1.0.7", "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" }, + "progress": { + "version": "2.0.0", + "from": "progress@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "dev": true + }, "promise": { "version": "2.0.0", "from": "promise@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz" }, + "promisify-call": { + "version": "2.0.4", + "from": "promisify-call@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", + "dev": true, + "optional": true + }, + "prompt": { + "version": "0.2.14", + "from": "prompt@0.2.14", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", + "dev": true + }, "prop-types": { "version": "15.6.1", "from": "prop-types@>=15.5.10 <16.0.0", @@ -2914,11 +8636,79 @@ "from": "proxy-addr@>=1.0.8 <1.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz" }, + "proxy-agent": { + "version": "3.0.0", + "from": "proxy-agent@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.0.tgz", + "dev": true, + "optional": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true, + "optional": true + }, + "lru-cache": { + "version": "4.1.3", + "from": "lru-cache@^4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "dev": true, + "optional": true + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "from": "proxy-from-env@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "dev": true, + "optional": true + }, + "prr": { + "version": "1.0.1", + "from": "prr@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "dev": true + }, + "ps-tree": { + "version": "0.0.3", + "from": "ps-tree@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-0.0.3.tgz", + "dev": true + }, "pseudomap": { "version": "1.0.2", "from": "pseudomap@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" }, + "pstree.remy": { + "version": "1.1.0", + "from": "pstree.remy@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", + "dev": true, + "dependencies": { + "event-stream": { + "version": "3.3.4", + "from": "event-stream@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "dev": true + }, + "ps-tree": { + "version": "1.1.0", + "from": "ps-tree@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "dev": true + } + } + }, + "public-encrypt": { + "version": "4.0.2", + "from": "public-encrypt@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "dev": true + }, "pug": { "version": "2.0.0-rc.4", "from": "pug@>=2.0.0-beta6 <3.0.0", @@ -3047,6 +8837,12 @@ "from": "q@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz" }, + "qjobs": { + "version": "1.2.0", + "from": "qjobs@>=1.1.4 <2.0.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "dev": true + }, "qs": { "version": "6.5.1", "from": "qs@>=6.5.1 <6.6.0", @@ -3057,11 +8853,55 @@ "from": "querystring@0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" }, + "querystring-es3": { + "version": "0.2.1", + "from": "querystring-es3@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "from": "querystringify@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "dev": true + }, "random-bytes": { "version": "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" }, + "randomatic": { + "version": "3.0.0", + "from": "randomatic@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "dev": true, + "dependencies": { + "is-number": { + "version": "4.0.0", + "from": "is-number@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.6", + "from": "randombytes@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "dev": true + }, + "randomfill": { + "version": "1.0.4", + "from": "randomfill@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "dev": true + }, "range-parser": { "version": "1.0.3", "from": "range-parser@>=1.0.2 <1.1.0", @@ -3118,6 +8958,24 @@ "from": "react-dom@>=15.4.2 <16.0.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz" }, + "read": { + "version": "1.0.7", + "from": "read@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "from": "read-pkg@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "dev": true + }, + "read-pkg-up": { + "version": "2.0.0", + "from": "read-pkg-up@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "dev": true + }, "readable-stream": { "version": "1.0.34", "from": "readable-stream@>=1.0.24 <1.1.0", @@ -3128,6 +8986,12 @@ "from": "readdirp@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-0.2.5.tgz" }, + "redent": { + "version": "1.0.0", + "from": "redent@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "dev": true + }, "redis": { "version": "2.8.0", "from": "redis@>=2.1.0 <3.0.0", @@ -3197,16 +9061,122 @@ "from": "referrer-policy@1.1.0", "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz" }, + "regenerate": { + "version": "1.4.0", + "from": "regenerate@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "from": "regenerator-runtime@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "from": "regenerator-transform@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "from": "regex-not@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "dev": true + }, "regexp-clone": { "version": "0.0.1", "from": "regexp-clone@0.0.1", "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz" }, + "regexpp": { + "version": "1.1.0", + "from": "regexpp@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "from": "regexpu-core@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "dev": true + }, + "registry-auth-token": { + "version": "3.3.2", + "from": "registry-auth-token@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "dev": true + }, + "registry-url": { + "version": "3.1.0", + "from": "registry-url@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "dev": true + }, + "regjsgen": { + "version": "0.2.0", + "from": "regjsgen@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "from": "regjsparser@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "dev": true, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "from": "jsesc@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "from": "remove-trailing-separator@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "from": "repeat-element@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "dev": true + }, "repeat-string": { "version": "1.6.1", "from": "repeat-string@>=1.5.2 <2.0.0", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" }, + "repeating": { + "version": "2.0.1", + "from": "repeating@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "dev": true + }, + "replace": { + "version": "0.2.10", + "from": "replace@>=0.2.4 <0.3.0", + "resolved": "https://registry.npmjs.org/replace/-/replace-0.2.10.tgz", + "dev": true, + "dependencies": { + "colors": { + "version": "0.5.1", + "from": "colors@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "dev": true + } + } + }, "request": { "version": "2.83.0", "from": "request@>=2.69.0 <3.0.0", @@ -3234,11 +9204,43 @@ "from": "require_optional@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz" }, + "require-directory": { + "version": "2.1.1", + "from": "require-directory@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "dev": true + }, "require-like": { "version": "0.1.2", "from": "require-like@0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" }, + "require-main-filename": { + "version": "1.0.1", + "from": "require-main-filename@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "from": "require-uncached@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "dev": true, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "from": "resolve-from@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "dev": true + } + } + }, + "requirejs": { + "version": "2.3.5", + "from": "requirejs@>=2.1.22 <3.0.0", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", + "dev": true + }, "requires-port": { "version": "1.0.0", "from": "requires-port@>=1.0.0 <2.0.0", @@ -3249,11 +9251,43 @@ "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz" }, + "resolve-cwd": { + "version": "2.0.0", + "from": "resolve-cwd@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "dev": true, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "from": "resolve-from@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "dev": true + } + } + }, "resolve-from": { "version": "2.0.0", "from": "resolve-from@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz" }, + "resolve-url": { + "version": "0.2.1", + "from": "resolve-url@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "from": "restore-cursor@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "dev": true + }, + "ret": { + "version": "0.1.15", + "from": "ret@>=0.1.10 <0.2.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "dev": true + }, "retry-as-promised": { "version": "2.3.2", "from": "retry-as-promised@>=2.0.0 <3.0.0", @@ -3271,6 +9305,12 @@ } } }, + "revalidator": { + "version": "0.1.8", + "from": "revalidator@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "dev": true + }, "right-align": { "version": "0.1.3", "from": "right-align@>=0.1.1 <0.2.0", @@ -3281,6 +9321,12 @@ "from": "rimraf@2.2.6", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" }, + "ripemd160": { + "version": "2.0.2", + "from": "ripemd160@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "dev": true + }, "rndm": { "version": "1.2.0", "from": "rndm@1.2.0", @@ -3291,22 +9337,124 @@ "from": "git+https://github.com/ShaneKilkelly/rolling-rate-limiter.git#master", "resolved": "git+https://github.com/ShaneKilkelly/rolling-rate-limiter.git#8a1a2cd8aaf9cd1a75cc81317b7f261157be2149" }, + "run-async": { + "version": "2.3.0", + "from": "run-async@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "dev": true, + "dependencies": { + "is-promise": { + "version": "2.1.0", + "from": "is-promise@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "dev": true + } + } + }, + "rx-lite": { + "version": "4.0.8", + "from": "rx-lite@>=4.0.8 <5.0.0", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "from": "rx-lite-aggregates@>=4.0.8 <5.0.0", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "dev": true + }, "safe-buffer": { "version": "5.1.1", "from": "safe-buffer@>=5.1.1 <5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, + "safe-json-parse": { + "version": "1.0.1", + "from": "safe-json-parse@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "dev": true + }, "safe-json-stringify": { "version": "1.0.4", "from": "safe-json-stringify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz", "optional": true }, + "safe-regex": { + "version": "1.1.0", + "from": "safe-regex@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "from": "safer-buffer@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "dev": true + }, "samsam": { "version": "1.1.2", "from": "samsam@1.1.2", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz" }, + "sandboxed-module": { + "version": "0.2.0", + "from": "sandboxed-module@0.2.0", + "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-0.2.0.tgz", + "dev": true, + "dependencies": { + "stack-trace": { + "version": "0.0.6", + "from": "stack-trace@0.0.6", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.6.tgz", + "dev": true + } + } + }, + "sanitize-html": { + "version": "1.18.2", + "from": "sanitize-html@>=1.14.1 <2.0.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.18.2.tgz", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "postcss": { + "version": "6.0.22", + "from": "postcss@>=6.0.14 <7.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, "sanitizer": { "version": "0.1.1", "from": "sanitizer@0.1.1", @@ -3317,11 +9465,37 @@ "from": "sax@1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" }, + "select-hose": { + "version": "2.0.0", + "from": "select-hose@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "dev": true + }, + "selfsigned": { + "version": "1.10.3", + "from": "selfsigned@>=1.9.1 <2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "dev": true, + "dependencies": { + "node-forge": { + "version": "0.7.5", + "from": "node-forge@0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "dev": true + } + } + }, "semver": { "version": "5.3.0", "from": "semver@>=5.3.0 <5.4.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" }, + "semver-diff": { + "version": "2.1.0", + "from": "semver-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "dev": true + }, "send": { "version": "0.13.0", "from": "send@0.13.0", @@ -3383,6 +9557,52 @@ } } }, + "serve-index": { + "version": "1.9.1", + "from": "serve-index@>=1.7.2 <2.0.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "dev": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "from": "accepts@~1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "dev": true, + "dependencies": { + "mime-types": { + "version": "2.1.18", + "from": "mime-types@~2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@~1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "from": "mime-db@~1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "dev": true + } + } + }, "serve-static": { "version": "1.10.3", "from": "serve-static@>=1.10.0 <1.11.0", @@ -3430,6 +9650,26 @@ "from": "set-blocking@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" }, + "set-immediate-shim": { + "version": "1.0.1", + "from": "set-immediate-shim@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "from": "set-value@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, "setimmediate": { "version": "1.0.5", "from": "setimmediate@>=1.0.4 <2.0.0", @@ -3452,6 +9692,24 @@ } } }, + "sha.js": { + "version": "2.4.11", + "from": "sha.js@>=2.4.0 <3.0.0", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "from": "shebang-command@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "dev": true + }, + "shebang-regex": { + "version": "1.0.0", + "from": "shebang-regex@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "dev": true + }, "shimmer": { "version": "1.1.0", "from": "shimmer@1.1.0", @@ -3467,16 +9725,61 @@ "from": "signal-exit@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" }, + "sinon": { + "version": "1.17.7", + "from": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "dev": true + }, + "sinon-chai": { + "version": "2.14.0", + "from": "sinon-chai@latest", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "dev": true + }, "sixpack-client": { "version": "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" }, + "slack-node": { + "version": "0.2.0", + "from": "slack-node@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", + "dev": true, + "optional": true + }, + "slash": { + "version": "1.0.0", + "from": "slash@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "from": "slice-ansi@1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@^2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + } + } + }, "sliced": { "version": "1.0.1", "from": "sliced@1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz" }, + "smart-buffer": { + "version": "1.1.15", + "from": "smart-buffer@>=1.0.13 <2.0.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "dev": true + }, "smtp-connection": { "version": "2.0.1", "from": "smtp-connection@2.0.1", @@ -3487,16 +9790,322 @@ "from": "smtpapi@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/smtpapi/-/smtpapi-1.3.1.tgz" }, + "snapdragon": { + "version": "0.8.2", + "from": "snapdragon@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "from": "source-map@^0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "from": "snapdragon-node@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "1.0.0", + "from": "define-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "from": "is-data-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "from": "is-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "from": "snapdragon-util@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "dev": true + }, "sntp": { "version": "2.1.0", "from": "sntp@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz" }, + "socket.io": { + "version": "2.0.4", + "from": "socket.io@2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@~2.6.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "from": "socket.io-adapter@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "dev": true + }, + "socket.io-client": { + "version": "2.0.4", + "from": "socket.io-client@2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@~2.6.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.1.3", + "from": "socket.io-parser@>=3.1.1 <3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "from": "isarray@2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "from": "sockjs@0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "dev": true + }, + "sockjs-client": { + "version": "1.1.4", + "from": "sockjs-client@1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.6.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "faye-websocket": { + "version": "0.11.1", + "from": "faye-websocket@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "dev": true + } + } + }, + "socks": { + "version": "1.1.10", + "from": "socks@>=1.1.5 <1.2.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "dev": true + }, + "socks-proxy-agent": { + "version": "3.0.1", + "from": "socks-proxy-agent@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "dev": true + }, + "source-list-map": { + "version": "2.0.0", + "from": "source-list-map@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "dev": true + }, "source-map": { "version": "0.1.34", "from": "source-map@0.1.34", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz" }, + "source-map-resolve": { + "version": "0.5.2", + "from": "source-map-resolve@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "from": "source-map-support@>=0.4.15 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.5.7", + "from": "source-map@^0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "from": "source-map-url@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "from": "spdx-correct@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "dev": true + }, + "spdx-exceptions": { + "version": "2.1.0", + "from": "spdx-exceptions@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "from": "spdx-expression-parse@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "dev": true + }, + "spdx-license-ids": { + "version": "3.0.0", + "from": "spdx-license-ids@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "from": "spdy@>=3.4.1 <4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "spdy-transport": { + "version": "2.1.0", + "from": "spdy-transport@>=2.0.18 <3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "split": { + "version": "0.3.3", + "from": "split@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "from": "split-string@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "from": "sprintf-js@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "dev": true + }, + "srcset": { + "version": "1.0.0", + "from": "srcset@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", + "dev": true + }, "sshpk": { "version": "1.13.1", "from": "sshpk@>=1.7.0 <2.0.0", @@ -3507,6 +10116,20 @@ "from": "stack-trace@0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" }, + "static-extend": { + "version": "0.1.2", + "from": "static-extend@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + } + } + }, "statsd-parser": { "version": "0.0.4", "from": "statsd-parser@>=0.0.4 <0.1.0", @@ -3517,6 +10140,114 @@ "from": "statuses@>=1.3.1 <2.0.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" }, + "stream-browserify": { + "version": "2.0.1", + "from": "stream-browserify@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "stream-combiner": { + "version": "0.0.4", + "from": "stream-combiner@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "dev": true + }, + "stream-http": { + "version": "2.8.2", + "from": "stream-http@>=2.7.2 <3.0.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "streamroller": { + "version": "0.7.0", + "from": "streamroller@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, "streamsearch": { "version": "0.1.2", "from": "streamsearch@0.1.2", @@ -3527,6 +10258,12 @@ "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, + "string-template": { + "version": "0.2.1", + "from": "string-template@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "dev": true + }, "string-width": { "version": "1.0.2", "from": "string-width@>=1.0.1 <2.0.0", @@ -3542,11 +10279,97 @@ "from": "strip-ansi@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" }, + "strip-bom": { + "version": "3.0.0", + "from": "strip-bom@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "from": "strip-eof@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "from": "strip-indent@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "from": "strip-json-comments@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + }, + "table": { + "version": "4.0.2", + "from": "table@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@^3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@^3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@^2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@^2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@^4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "tapable": { + "version": "0.2.8", + "from": "tapable@>=0.2.7 <0.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "dev": true + }, "tar": { "version": "2.2.1", "from": "tar@>=2.2.0 <2.3.0", @@ -3604,6 +10427,12 @@ "from": "temp@>=0.8.3 <0.9.0", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" }, + "term-size": { + "version": "1.2.0", + "from": "term-size@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "dev": true + }, "terraformer": { "version": "1.0.8", "from": "terraformer@>=1.0.5 <1.1.0", @@ -3619,21 +10448,128 @@ "from": "text-encoding@>=0.6.4 <0.7.0", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz" }, + "text-table": { + "version": "0.2.0", + "from": "text-table@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "dev": true + }, + "through": { + "version": "2.3.8", + "from": "through@>=2.3.1 <2.4.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "dev": true + }, + "thunkify": { + "version": "2.1.2", + "from": "thunkify@>=2.1.1 <2.2.0", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "dev": true, + "optional": true + }, "thunky": { "version": "0.1.0", "from": "thunky@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz" }, + "time-stamp": { + "version": "2.0.0", + "from": "time-stamp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "from": "timed-out@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "dev": true + }, "timekeeper": { "version": "2.0.0", "from": "timekeeper@", "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-2.0.0.tgz" }, + "timers-browserify": { + "version": "2.0.10", + "from": "timers-browserify@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "dev": true + }, + "timespan": { + "version": "2.3.0", + "from": "timespan@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "dev": true + }, + "tiny-lr": { + "version": "1.1.1", + "from": "tiny-lr@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + } + } + }, + "tmp": { + "version": "0.0.33", + "from": "tmp@0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "from": "to-array@0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "from": "to-arraybuffer@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "from": "to-fast-properties@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "dev": true + }, "to-mongodb-core": { "version": "2.0.0", "from": "to-mongodb-core@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/to-mongodb-core/-/to-mongodb-core-2.0.0.tgz" }, + "to-object-path": { + "version": "0.3.0", + "from": "to-object-path@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "from": "to-regex@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "from": "to-regex-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "dev": true, + "dependencies": { + "is-number": { + "version": "3.0.0", + "from": "is-number@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "dev": true + } + } + }, "token-stream": { "version": "0.0.1", "from": "token-stream@0.0.1", @@ -3644,6 +10580,20 @@ "from": "toposort-class@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz" }, + "touch": { + "version": "3.1.0", + "from": "touch@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "dev": true, + "dependencies": { + "nopt": { + "version": "1.0.10", + "from": "nopt@>=1.0.10 <1.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "dev": true + } + } + }, "tough-cookie": { "version": "2.3.3", "from": "tough-cookie@>=2.3.3 <2.4.0", @@ -3666,11 +10616,43 @@ } } }, + "translations-sharelatex": { + "version": "0.1.4", + "from": "git+https://github.com/sharelatex/translations-sharelatex.git#e219c18a5f305d7724946908b67fb32218fac577", + "resolved": "git+https://github.com/sharelatex/translations-sharelatex.git#e219c18a5f305d7724946908b67fb32218fac577", + "dev": true, + "dependencies": { + "async": { + "version": "2.6.0", + "from": "async@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "dev": true + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "from": "trim-newlines@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "from": "trim-right@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "dev": true + }, "tsscmp": { "version": "1.0.5", "from": "tsscmp@1.0.5", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz" }, + "tty-browserify": { + "version": "0.0.0", + "from": "tty-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "from": "tunnel-agent@>=0.6.0 <0.7.0", @@ -3682,11 +10664,29 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "optional": true }, + "type-check": { + "version": "0.3.2", + "from": "type-check@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "dev": true + }, + "type-detect": { + "version": "1.0.0", + "from": "type-detect@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "dev": true + }, "type-is": { "version": "1.6.15", "from": "type-is@>=1.6.15 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz" }, + "typedarray": { + "version": "0.0.6", + "from": "typedarray@>=0.0.6 <0.0.7", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "dev": true + }, "ua-parser-js": { "version": "0.7.17", "from": "ua-parser-js@>=0.7.9 <0.8.0", @@ -3709,6 +10709,32 @@ "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" }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "from": "uglifyjs-webpack-plugin@>=0.4.6 <0.5.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.5.7", + "from": "source-map@^0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "from": "uglify-js@>=2.8.29 <3.0.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "from": "yargs@>=3.10.0 <3.11.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "dev": true + } + } + }, "uid-number": { "version": "0.0.6", "from": "uid-number@>=0.0.6 <0.1.0", @@ -3724,6 +10750,26 @@ "from": "uid2@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" }, + "ultron": { + "version": "1.1.1", + "from": "ultron@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "dev": true + }, + "undefsafe": { + "version": "2.0.2", + "from": "undefsafe@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, "underscore": { "version": "1.6.0", "from": "underscore@1.6.0", @@ -3734,6 +10780,32 @@ "from": "underscore.string@>=2.2.1 <2.3.0", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" }, + "union-value": { + "version": "1.0.0", + "from": "union-value@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + }, + "set-value": { + "version": "0.4.3", + "from": "set-value@>=0.4.3 <0.5.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "dev": true + } + } + }, + "unique-string": { + "version": "1.0.0", + "from": "unique-string@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "dev": true + }, "universalify": { "version": "0.1.1", "from": "universalify@>=0.1.0 <0.2.0", @@ -3744,6 +10816,110 @@ "from": "unpipe@1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" }, + "unset-value": { + "version": "1.0.0", + "from": "unset-value@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "dev": true, + "dependencies": { + "has-value": { + "version": "0.3.1", + "from": "has-value@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "dev": true, + "dependencies": { + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "dev": true + } + } + }, + "has-values": { + "version": "0.1.4", + "from": "has-values@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "from": "unzip-response@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "dev": true + }, + "upath": { + "version": "1.0.5", + "from": "upath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "from": "update-notifier@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "from": "ansi-styles@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.1", + "from": "uri-js@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", + "dev": true, + "dependencies": { + "punycode": { + "version": "2.1.0", + "from": "punycode@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "from": "urix@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "dev": true + }, "url": { "version": "0.10.3", "from": "url@0.10.3", @@ -3756,11 +10932,93 @@ } } }, + "url-parse": { + "version": "1.4.0", + "from": "url-parse@>=1.1.8 <2.0.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz", + "dev": true, + "dependencies": { + "querystringify": { + "version": "2.0.0", + "from": "querystringify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "from": "url-parse-lax@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "dev": true + }, + "use": { + "version": "3.1.0", + "from": "use@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + } + } + }, + "useragent": { + "version": "2.2.1", + "from": "useragent@2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "dev": true, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "from": "lru-cache@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "from": "util@>=0.10.3 <1.0.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "dev": true, + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "dev": true + } + } + }, "util-deprecate": { "version": "1.0.2", "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, + "utile": { + "version": "0.2.1", + "from": "utile@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.2.10", + "from": "async@>=0.2.9 <0.3.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "dev": true + }, + "ncp": { + "version": "0.4.2", + "from": "ncp@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "dev": true + } + } + }, "utils-merge": { "version": "1.0.0", "from": "utils-merge@1.0.0", @@ -3771,6 +11029,13 @@ "from": "uuid@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz" }, + "uws": { + "version": "9.14.0", + "from": "uws@>=9.14.0 <9.15.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", + "dev": true, + "optional": true + }, "v8-profiler": { "version": "5.7.0", "from": "v8-profiler@>=5.2.3 <6.0.0", @@ -3913,6 +11178,12 @@ "from": "valid-url@>=1.0.9 <2.0.0", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz" }, + "validate-npm-package-license": { + "version": "3.0.3", + "from": "validate-npm-package-license@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "dev": true + }, "validator": { "version": "5.7.0", "from": "validator@>=5.2.0 <6.0.0", @@ -3962,11 +11233,1033 @@ "from": "verror@1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" }, + "vm-browserify": { + "version": "0.0.4", + "from": "vm-browserify@0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "dev": true + }, "void-elements": { "version": "2.0.1", "from": "void-elements@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" }, + "watch": { + "version": "0.13.0", + "from": "watch@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.13.0.tgz", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + } + } + }, + "watchpack": { + "version": "1.6.0", + "from": "watchpack@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "dev": true, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "from": "anymatch@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "from": "arr-diff@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "from": "array-unique@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "dev": true + }, + "braces": { + "version": "2.3.2", + "from": "braces@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "chokidar": { + "version": "2.0.3", + "from": "chokidar@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "dev": true + }, + "debug": { + "version": "2.6.9", + "from": "debug@^2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "from": "expand-brackets@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "from": "is-accessor-descriptor@^0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "from": "is-data-descriptor@^0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "from": "is-descriptor@^0.1.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "from": "kind-of@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "from": "extglob@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "1.0.0", + "from": "define-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "fill-range": { + "version": "4.0.0", + "from": "fill-range@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "from": "glob-parent@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "dev": true, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "from": "is-glob@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "dev": true + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "from": "is-data-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "from": "is-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "from": "is-extglob@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "from": "is-glob@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "from": "is-number@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "from": "micromatch@>=3.1.4 <4.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + } + } + }, + "wbuf": { + "version": "1.7.3", + "from": "wbuf@>=1.7.2 <2.0.0", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "dev": true + }, + "webpack": { + "version": "3.12.0", + "from": "webpack@>=3.10.0 <4.0.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "dev": true, + "dependencies": { + "acorn": { + "version": "5.5.3", + "from": "acorn@^5.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "dev": true + }, + "ajv": { + "version": "6.5.0", + "from": "ajv@>=6.1.0 <7.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "from": "ajv-keywords@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "async": { + "version": "2.6.0", + "from": "async@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "from": "camelcase@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "from": "cliui@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "dev": true, + "dependencies": { + "string-width": { + "version": "1.0.2", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "from": "fast-deep-equal@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "from": "source-map@^0.5.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + } + } + }, + "supports-color": { + "version": "4.5.0", + "from": "supports-color@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "from": "yargs@>=8.0.2 <9.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "from": "webpack-dev-middleware@1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "dev": true, + "dependencies": { + "mime": { + "version": "1.6.0", + "from": "mime@>=1.5.0 <2.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "2.11.2", + "from": "webpack-dev-server@>=2.11.1 <3.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", + "dev": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "from": "accepts@~1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "from": "anymatch@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "from": "arr-diff@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "from": "array-flatten@1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "from": "array-unique@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "dev": true + }, + "braces": { + "version": "2.3.2", + "from": "braces@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "camelcase": { + "version": "3.0.0", + "from": "camelcase@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "dev": true + }, + "chokidar": { + "version": "2.0.3", + "from": "chokidar@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "from": "cliui@^3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "from": "content-disposition@0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "dev": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "del": { + "version": "3.0.0", + "from": "del@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "dev": true + }, + "etag": { + "version": "1.8.1", + "from": "etag@>=1.8.1 <1.9.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "from": "expand-brackets@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@^2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "from": "is-accessor-descriptor@^0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "from": "is-data-descriptor@^0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "from": "is-descriptor@^0.1.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "from": "kind-of@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "dev": true + } + } + }, + "express": { + "version": "4.16.3", + "from": "express@>=4.16.2 <5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "from": "extglob@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "dev": true, + "dependencies": { + "define-property": { + "version": "1.0.0", + "from": "define-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "fill-range": { + "version": "4.0.0", + "from": "fill-range@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "dev": true, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "dev": true + } + } + }, + "finalhandler": { + "version": "1.1.1", + "from": "finalhandler@1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "find-up": { + "version": "1.1.2", + "from": "find-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "from": "fresh@0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "dev": true + }, + "glob": { + "version": "7.1.2", + "from": "glob@^7.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "from": "glob-parent@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "dev": true, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "from": "is-glob@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "dev": true + } + } + }, + "globby": { + "version": "6.1.0", + "from": "globby@>=6.1.0 <7.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "dev": true, + "dependencies": { + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "from": "ipaddr.js@1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "from": "is-accessor-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "from": "is-data-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "from": "is-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "from": "is-extglob@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "from": "is-glob@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "from": "is-number@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "dev": true + } + } + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@~1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "from": "kind-of@^6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "from": "load-json-file@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "dev": true, + "dependencies": { + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "from": "merge-descriptors@1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "from": "micromatch@>=3.1.4 <4.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "dev": true + }, + "mime": { + "version": "1.4.1", + "from": "mime@1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "from": "mime-db@~1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "from": "mime-types@~2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@^3.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "from": "os-locale@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "from": "path-exists@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "from": "path-to-regexp@0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "from": "path-type@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "dev": true, + "dependencies": { + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@~2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "dev": true + }, + "proxy-addr": { + "version": "2.0.3", + "from": "proxy-addr@>=2.0.3 <2.1.0", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "from": "range-parser@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "from": "read-pkg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "from": "read-pkg-up@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@^2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dev": true + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@^2.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "from": "rimraf@^2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "dev": true + }, + "send": { + "version": "0.16.2", + "from": "send@0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "from": "serve-static@1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "from": "setprototypeof@1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@~1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "from": "strip-bom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.1.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "from": "type-is@>=1.6.16 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "from": "utils-merge@1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "dev": true + }, + "vary": { + "version": "1.1.2", + "from": "vary@~1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "dev": true + }, + "which-module": { + "version": "1.0.0", + "from": "which-module@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "from": "yargs@6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "dev": true + }, + "yargs-parser": { + "version": "4.2.1", + "from": "yargs-parser@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "dev": true + } + } + }, + "webpack-merge": { + "version": "4.1.2", + "from": "webpack-merge@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "dev": true, + "dependencies": { + "lodash": { + "version": "4.17.10", + "from": "lodash@>=4.17.5 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "from": "webpack-sources@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "from": "websocket-driver@>=0.5.1", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "dev": true + }, + "websocket-extensions": { + "version": "0.1.3", + "from": "websocket-extensions@>=0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "dev": true + }, "whatwg-fetch": { "version": "2.0.4", "from": "whatwg-fetch@>=0.10.0", @@ -3982,21 +12275,80 @@ "from": "which@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" }, + "which-module": { + "version": "2.0.0", + "from": "which-module@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "dev": true + }, "wide-align": { "version": "1.1.2", "from": "wide-align@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz" }, + "widest-line": { + "version": "2.0.0", + "from": "widest-line@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@^3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@^2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@^2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + } + } + }, "window-size": { "version": "0.1.0", "from": "window-size@0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, + "winston": { + "version": "0.8.3", + "from": "winston@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.2.10", + "from": "async@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "dev": true + } + } + }, "with": { "version": "3.0.1", "from": "with@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/with/-/with-3.0.1.tgz" }, + "with-callback": { + "version": "1.0.2", + "from": "with-callback@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", + "dev": true, + "optional": true + }, "wkx": { "version": "0.2.0", "from": "wkx@0.2.0", @@ -4007,16 +12359,46 @@ "from": "wordwrap@0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" }, + "wrap-ansi": { + "version": "2.1.0", + "from": "wrap-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "dev": true + }, "wrappy": { "version": "1.0.2", "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" }, + "write": { + "version": "0.2.1", + "from": "write@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "from": "write-file-atomic@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "dev": true + }, + "ws": { + "version": "3.3.3", + "from": "ws@>=3.3.1 <3.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "dev": true + }, "x-xss-protection": { "version": "1.0.0", "from": "x-xss-protection@1.0.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz" }, + "xdg-basedir": { + "version": "3.0.0", + "from": "xdg-basedir@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "dev": true + }, "xhr-response": { "version": "1.0.1", "from": "xhr-response@>=1.0.0 <1.1.0", @@ -4071,6 +12453,12 @@ "from": "xmldom@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz" }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "from": "xmlhttprequest-ssl@>=1.5.4 <1.6.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "dev": true + }, "xpath": { "version": "0.0.5", "from": "xpath@0.0.5", @@ -4081,21 +12469,60 @@ "from": "xpath.js@>=0.0.3", "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz" }, + "xregexp": { + "version": "2.0.0", + "from": "xregexp@2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "dev": true, + "optional": true + }, "xtend": { "version": "4.0.1", "from": "xtend@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" }, + "y18n": { + "version": "3.2.1", + "from": "y18n@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "from": "yallist@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "dev": true + }, "yargs": { "version": "3.5.4", "from": "yargs@>=3.5.4 <3.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz" }, + "yargs-parser": { + "version": "7.0.0", + "from": "yargs-parser@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "dev": true, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "from": "camelcase@^4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "dev": true + } + } + }, "yauzl": { "version": "2.9.1", "from": "yauzl@>=2.8.0 <3.0.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz" }, + "yeast": { + "version": "0.1.2", + "from": "yeast@0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "dev": true + }, "zip-stream": { "version": "0.3.7", "from": "zip-stream@>=0.3.0 <0.4.0", diff --git a/services/web/package.json b/services/web/package.json index 2aa9ccc56f..f82e7c19d0 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -46,8 +46,7 @@ "express-session": "^1.14.2", "fs-extra": "^4.0.2", "fuse.js": "^3.0.0", - "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "handlebars-loader": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.0.tgz", + "handlebars": "^4.0.11", "heapdump": "^0.3.7", "helmet": "^3.8.1", "http-proxy": "^1.8.1", @@ -142,6 +141,7 @@ "grunt-postcss": "^0.8.0", "grunt-sed": "^0.1.1", "grunt-shell": "^2.1.0", + "handlebars-loader": "^1.7.0", "karma": "^2.0.0", "karma-chai-sinon": "^0.1.5", "karma-chrome-launcher": "^2.2.0", From 1fd923bf27b6995f6dd9e0db3d820b0a54444bb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Tue, 15 May 2018 09:44:57 +0100 Subject: [PATCH 45/87] Add some comments to the webpack config --- services/web/webpack.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/web/webpack.config.js b/services/web/webpack.config.js index 7050a7eb0e..c914bc1f21 100644 --- a/services/web/webpack.config.js +++ b/services/web/webpack.config.js @@ -1,6 +1,5 @@ const fs = require('fs') const path = require('path') -const webpack = require('webpack') const MODULES_PATH = path.join(__dirname, '/modules') @@ -63,6 +62,8 @@ module.exports = { }] }, { + // These options are necesary for handlebars to have access to helper + // methods test: /\.handlebars$/, loader: "handlebars-loader", options: { @@ -74,6 +75,7 @@ module.exports = { }, resolve: { alias: { + // makes handlerbars globally accessible to backbone handlebars: 'handlebars/dist/handlebars.min.js', jquery: path.join(__dirname, 'node_modules/jquery/dist/jquery'), } From 15c52af0aad1752d8b30ca5c835ac5e87aa5984e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Tue, 15 May 2018 09:48:22 +0100 Subject: [PATCH 46/87] Remove unused dependency --- services/web/npm-shrinkwrap.json | 22 +++++++--------------- services/web/package.json | 1 - 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/services/web/npm-shrinkwrap.json b/services/web/npm-shrinkwrap.json index 7d121f27f7..89fbd65bf1 100644 --- a/services/web/npm-shrinkwrap.json +++ b/services/web/npm-shrinkwrap.json @@ -1001,7 +1001,8 @@ "big.js": { "version": "3.2.0", "from": "big.js@>=3.1.3 <4.0.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz" + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "dev": true }, "binary-extensions": { "version": "1.11.0", @@ -2559,7 +2560,8 @@ "emojis-list": { "version": "2.1.0", "from": "emojis-list@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "dev": true }, "encodeurl": { "version": "1.0.2", @@ -4791,18 +4793,6 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", "dev": true }, - "imports-loader": { - "version": "0.8.0", - "from": "imports-loader@latest", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", - "dependencies": { - "source-map": { - "version": "0.6.1", - "from": "source-map@>=0.6.1 <0.7.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - } - } - }, "imurmurhash": { "version": "0.1.4", "from": "imurmurhash@>=0.1.4 <0.2.0", @@ -5933,11 +5923,13 @@ "version": "1.1.0", "from": "loader-utils@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "dev": true, "dependencies": { "json5": { "version": "0.5.1", "from": "json5@^0.5.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "dev": true } } }, diff --git a/services/web/package.json b/services/web/package.json index f82e7c19d0..999712d432 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -50,7 +50,6 @@ "heapdump": "^0.3.7", "helmet": "^3.8.1", "http-proxy": "^1.8.1", - "imports-loader": "^0.8.0", "jade": "~1.3.1", "jquery": "^1.11.1", "jsonwebtoken": "^8.0.1", From ddb53e0272af2f384e48e5466c72c7d93721adfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Fern=C3=A1ndez=20Capel?= Date: Wed, 16 May 2018 10:13:43 +0100 Subject: [PATCH 47/87] Pin translations-sharelatex to master --- services/web/npm-shrinkwrap.json | 4 ++-- services/web/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/npm-shrinkwrap.json b/services/web/npm-shrinkwrap.json index 89fbd65bf1..51545471c4 100644 --- a/services/web/npm-shrinkwrap.json +++ b/services/web/npm-shrinkwrap.json @@ -10610,8 +10610,8 @@ }, "translations-sharelatex": { "version": "0.1.4", - "from": "git+https://github.com/sharelatex/translations-sharelatex.git#e219c18a5f305d7724946908b67fb32218fac577", - "resolved": "git+https://github.com/sharelatex/translations-sharelatex.git#e219c18a5f305d7724946908b67fb32218fac577", + "from": "git+https://github.com/sharelatex/translations-sharelatex.git#master", + "resolved": "git+https://github.com/sharelatex/translations-sharelatex.git#c3dbe7869c594cb91cd366020f8b69e50a9405c9", "dev": true, "dependencies": { "async": { diff --git a/services/web/package.json b/services/web/package.json index 999712d432..168aaf2066 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -155,7 +155,7 @@ "sinon": "^1.17.0", "sinon-chai": "^2.14.0", "timekeeper": "", - "translations-sharelatex": "git+https://github.com/sharelatex/translations-sharelatex.git#e219c18a5f305d7724946908b67fb32218fac577", + "translations-sharelatex": "git+https://github.com/sharelatex/translations-sharelatex.git#master", "webpack": "^3.10.0", "webpack-dev-server": "^2.11.1", "webpack-merge": "^4.1.1" From 859858c02c6bb034c32e188a6e610f26e0c634cd Mon Sep 17 00:00:00 2001 From: Michael Mazour Date: Thu, 22 Mar 2018 09:41:22 +0000 Subject: [PATCH 48/87] Add V1 API to settings file --- services/web/config/settings.defaults.coffee | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/web/config/settings.defaults.coffee b/services/web/config/settings.defaults.coffee index d53b1a73ba..0892804778 100644 --- a/services/web/config/settings.defaults.coffee +++ b/services/web/config/settings.defaults.coffee @@ -156,6 +156,10 @@ module.exports = settings = url: process.env['LINKED_URL_PROXY'] thirdpartyreferences: url: "http://#{process.env['THIRD_PARTY_REFERENCES_HOST'] or 'localhost'}:3046" + v1: + url: "http://#{process.env['V1_HOST'] or 'localhost'}:5000" + user: 'overleaf' + pass: 'password' templates: user_id: process.env.TEMPLATES_USER_ID or "5395eb7aad1f29a88756c7f2" @@ -363,7 +367,7 @@ module.exports = settings = appName: "ShareLaTeX (Community Edition)" adminEmail: "placeholder@example.com" - + brandPrefix: "" # Set to 'ol-' for overleaf styles nav: From a661084485334553847aba8d54f31a137e2a9d0b Mon Sep 17 00:00:00 2001 From: Michael Mazour Date: Fri, 16 Mar 2018 10:25:40 +0000 Subject: [PATCH 49/87] Add ExportsHander for project exports performed via v1 --- .../Features/Exports/ExportsHandler.coffee | 93 ++++++++ .../coffee/Exports/ExportsHandlerTests.coffee | 202 ++++++++++++++++++ 2 files changed, 295 insertions(+) create mode 100644 services/web/app/coffee/Features/Exports/ExportsHandler.coffee create mode 100644 services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee diff --git a/services/web/app/coffee/Features/Exports/ExportsHandler.coffee b/services/web/app/coffee/Features/Exports/ExportsHandler.coffee new file mode 100644 index 0000000000..727b01a575 --- /dev/null +++ b/services/web/app/coffee/Features/Exports/ExportsHandler.coffee @@ -0,0 +1,93 @@ +ProjectGetter = require('../Project/ProjectGetter') +ProjectLocator = require('../Project/ProjectLocator') +UserGetter = require('../User/UserGetter') +logger = require('logger-sharelatex') +settings = require 'settings-sharelatex' +async = require 'async' +request = require 'request' +request = request.defaults() +settings = require 'settings-sharelatex' + +module.exports = ExportsHandler = self = + + exportProject: (project_id, user_id, brand_variation_id, callback=(error, export_data) ->) -> + self._buildExport project_id, user_id, brand_variation_id, (err, export_data) -> + return callback(err) if err? + self._requestExport export_data, (err, export_v1_id) -> + return callback(err) if err? + export_data.v1_id = export_v1_id + # TODO: possibly store the export data in Mongo + callback null, export_data + + _buildExport: (project_id, user_id, brand_variation_id, callback=(err, export_data) ->) -> + jobs = + project: (cb) -> + ProjectGetter.getProject project_id, cb + # TODO: when we update async, signature will change from (cb, results) to (results, cb) + rootDoc: [ 'project', (cb, results) -> + ProjectLocator.findRootDoc {project: results.project, project_id: project_id}, cb + ] + user: (cb) -> + UserGetter.getUser user_id, {first_name: 1, last_name: 1, email: 1}, cb + historyVersion: (cb) -> + self._requestVersion project_id, cb + + async.auto jobs, (err, results) -> + if err? + logger.err err:err, project_id:project_id, user_id:user_id, brand_variation_id:brand_variation_id, "error building project export" + return callback(err) + + {project, rootDoc, user, historyVersion} = results + if !rootDoc[1]? + err = new Error("cannot export project without root doc") + logger.err err:err, project_id: project_id + return callback(err) + + export_data = + project: + id: project_id + rootDocPath: rootDoc[1]?.fileSystem + historyId: project.overleaf?.history?.id + historyVersion: historyVersion + user: + id: user_id + firstName: user.first_name + lastName: user.last_name + email: user.email + orcidId: null # until v2 gets ORCID + destination: + brandVariationId: brand_variation_id + options: + callbackUrl: null # for now, until we want v1 to call us back + callback null, export_data + + _requestExport: (export_data, callback=(err, export_v1_id) ->) -> + request.post { + url: "#{settings.apis.v1.url}/api/v1/sharelatex/exports" + auth: {user: settings.apis.v1.user, pass: settings.apis.v1.pass } + json: export_data + }, (err, res, body) -> + if err? + logger.err err:err, export:export_data, "error making request to v1 export" + callback err + else if 200 <= res.statusCode < 300 + callback null, body.exportId + else + err = new Error("v1 export returned a failure status code: #{res.statusCode}") + logger.err err:err, export:export_data, "v1 export returned failure status code: #{res.statusCode}" + callback err + + _requestVersion: (project_id, callback=(err, export_v1_id) ->) -> + request.get { + url: "#{settings.apis.project_history.url}/project/#{project_id}/version" + json: true + }, (err, res, body) -> + if err? + logger.err err:err, project_id:project_id, "error making request to project history" + callback err + else if res.statusCode >= 200 and res.statusCode < 300 + callback null, body.version + else + err = new Error("project history version returned a failure status code: #{res.statusCode}") + logger.err err:err, project_id:project_id, "project history version returned failure status code: #{res.statusCode}" + callback err diff --git a/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee b/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee new file mode 100644 index 0000000000..6333db8270 --- /dev/null +++ b/services/web/test/unit/coffee/Exports/ExportsHandlerTests.coffee @@ -0,0 +1,202 @@ +sinon = require('sinon') +chai = require('chai') +should = chai.should() +expect = chai.expect +modulePath = '../../../../app/js/Features/Exports/ExportsHandler.js' +SandboxedModule = require('sandboxed-module') + +describe 'ExportsHandler', -> + + beforeEach -> + @ProjectGetter = {} + @ProjectLocator = {} + @UserGetter = {} + @settings = {} + @stubRequest = {} + @request = defaults: => return @stubRequest + @ExportsHandler = SandboxedModule.require modulePath, requires: + 'logger-sharelatex': + log: -> + err: -> + '../Project/ProjectGetter': @ProjectGetter + '../Project/ProjectLocator': @ProjectLocator + '../User/UserGetter': @UserGetter + 'settings-sharelatex': @settings + 'request': @request + @project_id = "project-id-123" + @project_history_id = 987 + @user_id = "user-id-456" + @brand_variation_id = 789 + @callback = sinon.stub() + + describe 'exportProject', -> + beforeEach (done) -> + @export_data = {iAmAnExport: true} + @response_body = {iAmAResponseBody: true} + @ExportsHandler._buildExport = sinon.stub().yields(null, @export_data) + @ExportsHandler._requestExport = sinon.stub().yields(null, @response_body) + @ExportsHandler.exportProject @project_id, @user_id, @brand_variation_id, (error, export_data) => + @callback(error, export_data) + done() + + it "should build the export", -> + @ExportsHandler._buildExport + .calledWith(@project_id, @user_id, @brand_variation_id) + .should.equal true + + it "should request the export", -> + @ExportsHandler._requestExport + .calledWith(@export_data) + .should.equal true + + it "should return the export", -> + @callback + .calledWith(null, @export_data) + .should.equal true + + describe '_buildExport', -> + beforeEach (done) -> + @project = + id: @project_id + overleaf: + history: + id: @project_history_id + @user = + id: @user_id + first_name: 'Arthur' + last_name: 'Author' + email: 'arthur.author@arthurauthoring.org' + @rootDocPath = 'main.tex' + @historyVersion = 777 + @ProjectGetter.getProject = sinon.stub().yields(null, @project) + @ProjectLocator.findRootDoc = sinon.stub().yields(null, [null, {fileSystem: 'main.tex'}]) + @UserGetter.getUser = sinon.stub().yields(null, @user) + @ExportsHandler._requestVersion = sinon.stub().yields(null, @historyVersion) + done() + + describe "when all goes well", -> + beforeEach (done) -> + @ExportsHandler._buildExport @project_id, @user_id, @brand_variation_id, (error, export_data) => + @callback(error, export_data) + done() + + it "should request the project history version", -> + @ExportsHandler._requestVersion.called + .should.equal true + + it "should return export data", -> + expected_export_data = + project: + id: @project_id + rootDocPath: @rootDocPath + historyId: @project_history_id + historyVersion: @historyVersion + user: + id: @user_id + firstName: @user.first_name + lastName: @user.last_name + email: @user.email + orcidId: null + destination: + brandVariationId: @brand_variation_id + options: + callbackUrl: null + @callback.calledWith(null, expected_export_data) + .should.equal true + + describe "when project is not found", -> + beforeEach (done) -> + @ProjectGetter.getProject = sinon.stub().yields(new Error("project not found")) + @ExportsHandler._buildExport @project_id, @user_id, @brand_variation_id, (error, export_data) => + @callback(error, export_data) + done() + + it "should return an error", -> + (@callback.args[0][0] instanceof Error) + .should.equal true + + describe "when project has no root doc", -> + beforeEach (done) -> + @ProjectLocator.findRootDoc = sinon.stub().yields(null, [null, null]) + @ExportsHandler._buildExport @project_id, @user_id, @brand_variation_id, (error, export_data) => + @callback(error, export_data) + done() + + it "should return an error", -> + (@callback.args[0][0] instanceof Error) + .should.equal true + + describe "when user is not found", -> + beforeEach (done) -> + @UserGetter.getUser = sinon.stub().yields(new Error("user not found")) + @ExportsHandler._buildExport @project_id, @user_id, @brand_variation_id, (error, export_data) => + @callback(error, export_data) + done() + + it "should return an error", -> + (@callback.args[0][0] instanceof Error) + .should.equal true + + describe "when project history request fails", -> + beforeEach (done) -> + @ExportsHandler._requestVersion = sinon.stub().yields(new Error("project history call failed")) + @ExportsHandler._buildExport @project_id, @user_id, @brand_variation_id, (error, export_data) => + @callback(error, export_data) + done() + + it "should return an error", -> + (@callback.args[0][0] instanceof Error) + .should.equal true + + describe '_requestExport', -> + beforeEach (done) -> + @settings.apis = + v1: + url: 'http://localhost:5000' + user: 'overleaf' + pass: 'pass' + @export_data = {iAmAnExport: true} + @export_id = 4096 + @stubPost = sinon.stub().yields(null, {statusCode: 200}, { exportId: @export_id }) + done() + + describe "when all goes well", -> + beforeEach (done) -> + @stubRequest.post = @stubPost + @ExportsHandler._requestExport @export_data, (error, export_v1_id) => + @callback(error, export_v1_id) + done() + + it 'should issue the request', -> + expect(@stubPost.getCall(0).args[0]).to.deep.equal + url: @settings.apis.v1.url + '/api/v1/sharelatex/exports' + auth: + user: @settings.apis.v1.user + pass: @settings.apis.v1.pass + json: @export_data + + it 'should return the v1 export id', -> + @callback.calledWith(null, @export_id) + .should.equal true + + describe "when the request fails", -> + beforeEach (done) -> + @stubRequest.post = sinon.stub().yields(new Error("export request failed")) + @ExportsHandler._requestExport @export_data, (error, export_v1_id) => + @callback(error, export_v1_id) + done() + + it "should return an error", -> + (@callback.args[0][0] instanceof Error) + .should.equal true + + describe "when the request returns an error code", -> + beforeEach (done) -> + @stubRequest.post = sinon.stub().yields(null, {statusCode: 401}, { }) + @ExportsHandler._requestExport @export_data, (error, export_v1_id) => + @callback(error, export_v1_id) + done() + + it "should return the error", -> + (@callback.args[0][0] instanceof Error) + .should.equal true From e34dd90a1f729a5150c53db068ea16a0e1c0ae46 Mon Sep 17 00:00:00 2001 From: Michael Mazour Date: Fri, 23 Mar 2018 16:30:48 +0000 Subject: [PATCH 50/87] Add project export route and controller --- .../Features/Exports/ExportsController.coffee | 18 +++++++++ services/web/app/coffee/router.coffee | 2 + .../Exports/ExportsControllerTests.coffee | 39 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 services/web/app/coffee/Features/Exports/ExportsController.coffee create mode 100644 services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee diff --git a/services/web/app/coffee/Features/Exports/ExportsController.coffee b/services/web/app/coffee/Features/Exports/ExportsController.coffee new file mode 100644 index 0000000000..cda2296249 --- /dev/null +++ b/services/web/app/coffee/Features/Exports/ExportsController.coffee @@ -0,0 +1,18 @@ +ExportsHandler = require("./ExportsHandler") +AuthenticationController = require("../Authentication/AuthenticationController") +logger = require("logger-sharelatex") + +module.exports = + + exportProject: (req, res) -> + {project_id, brand_variation_id} = req.params + user_id = AuthenticationController.getLoggedInUserId(req) + ExportsHandler.exportProject project_id, user_id, brand_variation_id, (err, export_data) -> + logger.log + user_id:user_id + project_id: project_id + brand_variation_id:brand_variation_id + export_v1_id:export_data.v1_id + "exported project" + res.send export_v1_id: export_data.v1_id + diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 7ec4dafbf4..e6b2692f7c 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -26,6 +26,7 @@ HealthCheckController = require("./Features/HealthCheck/HealthCheckController") ProjectDownloadsController = require "./Features/Downloads/ProjectDownloadsController" FileStoreController = require("./Features/FileStore/FileStoreController") HistoryController = require("./Features/History/HistoryController") +ExportsController = require("./Features/Exports/ExportsController") PasswordResetRouter = require("./Features/PasswordReset/PasswordResetRouter") StaticPagesRouter = require("./Features/StaticPages/StaticPagesRouter") ChatController = require("./Features/Chat/ChatController") @@ -205,6 +206,7 @@ module.exports = class Router webRouter.post "/project/:project_id/restore_file", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, HistoryController.restoreFileFromV2 privateApiRouter.post "/project/:Project_id/history/resync", AuthenticationController.httpAuth, HistoryController.resyncProjectHistory + webRouter.post '/project/:project_id/export/:brand_variation_id', AuthorizationMiddlewear.ensureUserCanAdminProject, ExportsController.exportProject webRouter.get '/Project/:Project_id/download/zip', AuthorizationMiddlewear.ensureUserCanReadProject, ProjectDownloadsController.downloadProject webRouter.get '/project/download/zip', AuthorizationMiddlewear.ensureUserCanReadMultipleProjects, ProjectDownloadsController.downloadMultipleProjects diff --git a/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee b/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee new file mode 100644 index 0000000000..821eb5b4e0 --- /dev/null +++ b/services/web/test/unit/coffee/Exports/ExportsControllerTests.coffee @@ -0,0 +1,39 @@ +SandboxedModule = require('sandboxed-module') +assert = require('assert') +chai = require('chai') +expect = chai.expect +sinon = require('sinon') +modulePath = require('path').join __dirname, '../../../../app/js/Features/Exports/ExportsController.js' + + +describe 'ExportsController', -> + project_id = "123njdskj9jlk" + user_id = "123nd3ijdks" + brand_variation_id = 22 + + beforeEach -> + @handler = + getUserNotifications: sinon.stub().callsArgWith(1) + @req = + params: + project_id: project_id + brand_variation_id: brand_variation_id + session: + user: + _id:user_id + i18n: + translate:-> + @AuthenticationController = + getLoggedInUserId: sinon.stub().returns(@req.session.user._id) + @controller = SandboxedModule.require modulePath, requires: + "./ExportsHandler":@handler + 'logger-sharelatex': + log:-> + err:-> + '../Authentication/AuthenticationController': @AuthenticationController + + it 'should ask the handler to perform the export', (done) -> + @handler.exportProject = sinon.stub().yields(null, {iAmAnExport: true, v1_id: 897}) + @controller.exportProject @req, send:(body) => + expect(body).to.deep.equal {export_v1_id: 897} + done() From 3922b8b9165579c5675a0df59fba3c2384dda461 Mon Sep 17 00:00:00 2001 From: Michael Mazour Date: Thu, 22 Mar 2018 09:49:12 +0000 Subject: [PATCH 51/87] Add project export acceptance tests - Add acceptance tests - Add `MockV1Api` helper - Add flush endpoint to `MockProjectHistoryApi` helper --- .../acceptance/coffee/ExportsTests.coffee | 56 +++++++++++++++++++ .../helpers/MockProjectHistoryApi.coffee | 12 ++++ .../coffee/helpers/MockV1Api.coffee | 34 +++++++++++ 3 files changed, 102 insertions(+) create mode 100644 services/web/test/acceptance/coffee/ExportsTests.coffee create mode 100644 services/web/test/acceptance/coffee/helpers/MockV1Api.coffee diff --git a/services/web/test/acceptance/coffee/ExportsTests.coffee b/services/web/test/acceptance/coffee/ExportsTests.coffee new file mode 100644 index 0000000000..7a6784008d --- /dev/null +++ b/services/web/test/acceptance/coffee/ExportsTests.coffee @@ -0,0 +1,56 @@ +expect = require('chai').expect +request = require './helpers/request' +_ = require 'underscore' + + +User = require './helpers/User' +ProjectGetter = require '../../../app/js/Features/Project/ProjectGetter.js' +ExportsHandler = require '../../../app/js/Features/Exports/ExportsHandler.js' + +MockProjectHistoryApi = require './helpers/MockProjectHistoryApi' +MockV1Api = require './helpers/MockV1Api' + +describe 'Exports', -> + before (done) -> + @brand_variation_id = '18' + @owner = new User() + @owner.login (error) => + throw error if error? + @owner.createProject 'example-project', {template: 'example'}, (error, @project_id) => + throw error if error? + done() + + describe 'exporting a project', -> + beforeEach (done) -> + @version = Math.floor(Math.random() * 10000) + MockProjectHistoryApi.setProjectVersion(@project_id, @version) + @export_id = Math.floor(Math.random() * 10000) + MockV1Api.setExportId(@export_id) + MockV1Api.clearExportParams() + @owner.request { + method: 'POST', + url: "/project/#{@project_id}/export/#{@brand_variation_id}", + json: {}, + }, (error, response, body) => + throw error if error? + expect(response.statusCode).to.equal 200 + @exportResponseBody = body + done() + + it 'should have sent correct data to v1', (done) -> + {project, user, destination, options} = MockV1Api.getLastExportParams() + # project details should match + expect(project.id).to.equal @project_id + expect(project.rootDocPath).to.equal '/main.tex' + # version should match what was retrieved from project-history + expect(project.historyVersion).to.equal @version + # user details should match + expect(user.id).to.equal @owner.id + expect(user.email).to.equal @owner.email + # brand-variation should match + expect(destination.brandVariationId).to.equal @brand_variation_id + done() + + it 'should have returned the export ID provided by v1', (done) -> + expect(@exportResponseBody.export_v1_id).to.equal @export_id + done() diff --git a/services/web/test/acceptance/coffee/helpers/MockProjectHistoryApi.coffee b/services/web/test/acceptance/coffee/helpers/MockProjectHistoryApi.coffee index 381d7ab272..b7df202d72 100644 --- a/services/web/test/acceptance/coffee/helpers/MockProjectHistoryApi.coffee +++ b/services/web/test/acceptance/coffee/helpers/MockProjectHistoryApi.coffee @@ -6,9 +6,14 @@ module.exports = MockProjectHistoryApi = oldFiles: {} + projectVersions: {} + addOldFile: (project_id, version, pathname, content) -> @oldFiles["#{project_id}:#{version}:#{pathname}"] = content + setProjectVersion: (project_id, version) -> + @projectVersions[project_id] = version + run: () -> app.post "/project", (req, res, next) => res.json project: id: 1 @@ -21,6 +26,13 @@ module.exports = MockProjectHistoryApi = else res.send 404 + app.get "/project/:project_id/version", (req, res, next) => + {project_id} = req.params + if @projectVersions[project_id]? + res.json version: @projectVersions[project_id] + else + res.send 404 + app.listen 3054, (error) -> throw error if error? .on "error", (error) -> diff --git a/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee b/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee new file mode 100644 index 0000000000..f27a4e1662 --- /dev/null +++ b/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee @@ -0,0 +1,34 @@ +express = require("express") +app = express() +bodyParser = require('body-parser') + +app.use(bodyParser.json()) + +module.exports = MockV1Api = + + exportId: null + + exportParams: null + + setExportId: (id) -> + @exportId = id + + getLastExportParams: () -> + @exportParams + + clearExportParams: () -> + @exportParams = null + + run: () -> + app.post "/api/v1/sharelatex/exports", (req, res, next) => + #{project, version, pathname} + @exportParams = Object.assign({}, req.body) + res.json exportId: @exportId + + app.listen 5000, (error) -> + throw error if error? + .on "error", (error) -> + console.error "error starting MockOverleafAPI:", error.message + process.exit(1) + +MockV1Api.run() From 3724edfc10c43ef831e0efa01dc60f67a9226ec2 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 17 May 2018 11:25:14 +0100 Subject: [PATCH 52/87] Fix translation string interpolation --- services/web/app/views/contact-us-modal.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/views/contact-us-modal.pug b/services/web/app/views/contact-us-modal.pug index aad68a53d3..eacfd10533 100644 --- a/services/web/app/views/contact-us-modal.pug +++ b/services/web/app/views/contact-us-modal.pug @@ -22,7 +22,7 @@ script(type='text/ng-template', id='supportModalTemplate') tabindex='1', onkeyup='') .contact-suggestions(ng-show="suggestions.length") - p.contact-suggestion-label !{translate("kb_suggestions_enquiry", { kbLink: "__kb__", kb: translate("knowledge_base") })} + p.contact-suggestion-label !{translate("kb_suggestions_enquiry", { kbLink: "" + translate("knowledge_base") + "" })} ul.contact-suggestion-list li(ng-repeat="suggestion in suggestions") a.contact-suggestion-list-item(ng-href="{{ suggestion.url }}", ng-click="clickSuggestionLink(suggestion.url);" target="_blank") From 0fd29d481928247689780c1734862fdff779f275 Mon Sep 17 00:00:00 2001 From: Jessica Lawshe Date: Thu, 17 May 2018 09:43:19 -0500 Subject: [PATCH 53/87] Remove missing wiki controller --- services/web/public/coffee/main/learn.coffee | 28 -------------------- 1 file changed, 28 deletions(-) diff --git a/services/web/public/coffee/main/learn.coffee b/services/web/public/coffee/main/learn.coffee index eeae4219b8..375c2f0365 100644 --- a/services/web/public/coffee/main/learn.coffee +++ b/services/web/public/coffee/main/learn.coffee @@ -55,32 +55,4 @@ define [ hits = _.map response.hits, buildHitViewModel updateHits hits - $scope.showMissingTemplateModal = () -> - modalInstance = $modal.open( - templateUrl: "missingWikiPageModal" - controller: "MissingWikiPageController" - ) - - App.controller 'MissingWikiPageController', ($scope, $modalInstance) -> - $scope.form = {} - $scope.sent = false - $scope.sending = false - $scope.contactUs = -> - if !$scope.form.message? - console.log "message not set" - return - $scope.sending = true - ticketNumber = Math.floor((1 + Math.random()) * 0x10000).toString(32) - params = - email: $scope.form.email or "support@sharelatex.com" - message: $scope.form.message or "" - subject: "new wiki page sujection - [#{ticketNumber}]" - labels: "support wiki" - - Groove.createTicket params, (err, json)-> - $scope.sent = true - $scope.$apply() - - $scope.close = () -> - $modalInstance.close() From 37ca7b54a69186c0ed0bffd75ebfc467f83eff04 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 24 Apr 2018 10:27:17 +0100 Subject: [PATCH 54/87] Re-implement spell check manager with adapter to abstract away editor --- .../spell-check/SpellCheckManager.coffee | 184 +++++------------- 1 file changed, 51 insertions(+), 133 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index acbd636531..4dee1faf52 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -1,129 +1,38 @@ -define [ - "ide/editor/directives/aceEditor/spell-check/HighlightedWordManager" - "ace/ace" -], (HighlightedWordManager) -> - Range = ace.require("ace/range").Range - +define [], () -> class SpellCheckManager - constructor: (@$scope, @editor, @element, @cache, @$http, @$q) -> - $(document.body).append @element.find(".spell-check-menu") + constructor: (@$scope, @cache, @$http, @$q, @adapter) -> @inProgressRequest = null @updatedLines = [] - @highlightedWordManager = new HighlightedWordManager(@editor) - @$scope.$watch "spellCheckLanguage", (language, oldLanguage) => + @$scope.$watch 'spellCheckLanguage', (language, oldLanguage) => if language != oldLanguage and oldLanguage? @runFullCheck() - onChange = (e) => - @runCheckOnChange(e) - - onScroll = () => - @closeContextMenu() + init: () -> + @updatedLines = Array(@adapter.getLines().length).fill(true) + @runSpellCheckSoon(200) if @isSpellCheckEnabled() - @editor.on "changeSession", (e) => - @highlightedWordManager.reset() - if @inProgressRequest? - @inProgressRequest.abort() + isSpellCheckEnabled: () -> + return !!( + @$scope.spellCheck and + @$scope.spellCheckLanguage and + @$scope.spellCheckLanguage != '' + ) - if @$scope.spellCheckEnabled and @$scope.spellCheckLanguage and @$scope.spellCheckLanguage != "" - @runSpellCheckSoon(200) - - e.oldSession?.getDocument().off "change", onChange - e.session.getDocument().on "change", onChange - - e.oldSession?.off "changeScrollTop", onScroll - e.session.on "changeScrollTop", onScroll - - @$scope.spellingMenu = {left: '0px', top: '0px'} - - @editor.on "nativecontextmenu", (e) => - e.domEvent.stopPropagation(); - @closeContextMenu(e.domEvent) - @openContextMenu(e.domEvent) - - $(document).on "click", (e) => - if e.which != 3 # Ignore if this was a right click - @closeContextMenu(e) - return true - - @$scope.replaceWord = (highlight, suggestion) => - @replaceWord(highlight, suggestion) - - @$scope.learnWord = (highlight) => - @learnWord(highlight) - - runFullCheck: () -> - @highlightedWordManager.clearRows() - if @$scope.spellCheckLanguage and @$scope.spellCheckLanguage != "" - @runSpellCheck() - - runCheckOnChange: (e) -> - if @$scope.spellCheckLanguage and @$scope.spellCheckLanguage != "" - @highlightedWordManager.applyChange(e) - @markLinesAsUpdated(e) + onChange: (e) => + if @isSpellCheckEnabled() + @markLinesAsUpdated(@adapter.normalizeChangeEvent(e)) @runSpellCheckSoon() - openContextMenu: (e) -> - position = @editor.renderer.screenToTextCoordinates(e.clientX, e.clientY) - highlight = @highlightedWordManager.findHighlightWithinRange - start: position - end: position + onSessionChange: () => + @adapter.wordManager.reset() + @inProgressRequest.abort() if @inProgressRequest? - @$scope.$apply () => - @$scope.spellingMenu.highlight = highlight + @runSpellCheckSoon(200) if @isSpellCheckEnabled() - if highlight - e.stopPropagation() - e.preventDefault() - - @editor.getSession().getSelection().setSelectionRange( - new Range( - highlight.row, highlight.column - highlight.row, highlight.column + highlight.word.length - ) - ) - - @$scope.$apply () => - @$scope.spellingMenu.open = true - @$scope.spellingMenu.left = e.clientX + 'px' - @$scope.spellingMenu.top = e.clientY + 'px' - return false - - closeContextMenu: (e) -> - # this is triggered on scroll, so for performance only apply - # setting when it changes - if @$scope?.spellingMenu?.open != false - @$scope.$apply () => - @$scope.spellingMenu.open = false - - replaceWord: (highlight, text) -> - @editor.getSession().replace(new Range( - highlight.row, highlight.column, - highlight.row, highlight.column + highlight.word.length - ), text) - - learnWord: (highlight) -> - @apiRequest "/learn", word: highlight.word - @highlightedWordManager.removeWord highlight.word - language = @$scope.spellCheckLanguage - @cache?.put("#{language}:#{highlight.word}", true) - - getHighlightedWordAtCursor: () -> - cursor = @editor.getCursorPosition() - highlight = @highlightedWordManager.findHighlightWithinRange - start: cursor - end: cursor - return highlight - - runSpellCheckSoon: (delay = 1000) -> - run = () => - delete @timeoutId - @runSpellCheck(@updatedLines) - @updatedLines = [] - if @timeoutId? - clearTimeout @timeoutId - @timeoutId = setTimeout run, delay + runFullCheck: () -> + @adapter.wordManager.reset() + @runSpellCheck() if @isSpellCheckEnabled() markLinesAsUpdated: (change) -> start = change.start @@ -146,6 +55,15 @@ define [ @updatedLines[start.row] = true removeLines() + runSpellCheckSoon: (delay = 1000) -> + run = () => + delete @timeoutId + @runSpellCheck(@updatedLines) + @updatedLines = [] + if @timeoutId? + clearTimeout @timeoutId + @timeoutId = setTimeout run, delay + runSpellCheck: (linesToProcess) -> {words, positions} = @getWords(linesToProcess) language = @$scope.spellCheckLanguage @@ -178,11 +96,11 @@ define [ displayResult = (highlights) => if linesToProcess? for shouldProcess, row in linesToProcess - @highlightedWordManager.clearRows(row, row) if shouldProcess + @adapter.wordManager.clearRow(row) if shouldProcess else - @highlightedWordManager.clearRows() + @adapter.wordManager.reset() for highlight in highlights - @highlightedWordManager.addHighlight highlight + @adapter.wordManager.addHighlight highlight if not words.length displayResult highlights @@ -212,8 +130,24 @@ define [ seen[key] = true displayResult highlights + apiRequest: (endpoint, data, callback = (error, result) ->)-> + data.token = window.user.id + data._csrf = window.csrfToken + # use angular timeout option to cancel request if doc is changed + requestHandler = @$q.defer() + options = {timeout: requestHandler.promise} + httpRequest = @$http.post("/spelling" + endpoint, data, options) + .then (response) => + callback(null, response.data) + .catch (response) => + callback(new Error('api failure')) + # provide a method to cancel the request + abortRequest = () -> + requestHandler.resolve() + return { abort: abortRequest } + getWords: (linesToProcess) -> - lines = @editor.getValue().split("\n") + lines = @adapter.getLines() words = [] positions = [] for line, row in lines @@ -232,22 +166,6 @@ define [ words.push(word) return words: words, positions: positions - apiRequest: (endpoint, data, callback = (error, result) ->)-> - data.token = window.user.id - data._csrf = window.csrfToken - # use angular timeout option to cancel request if doc is changed - requestHandler = @$q.defer() - options = {timeout: requestHandler.promise} - httpRequest = @$http.post("/spelling" + endpoint, data, options) - .then (response) => - callback(null, response.data) - .catch (response) => - callback(new Error('api failure')) - # provide a method to cancel the request - abortRequest = () -> - requestHandler.resolve() - return { abort: abortRequest } - blacklistedCommandRegex: /// \\ # initial backslash (label # any of these commands From 22e41cdce75c02af3ce87ea29fe24629eef7bce5 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 24 Apr 2018 10:27:17 +0100 Subject: [PATCH 55/87] Simplify word manager to use Range + Anchor to automatically keep marker positions up-to-date Re-implement highlighted word manager to be simpler --- .../spell-check/HighlightedWordManager.coffee | 138 +++--------------- 1 file changed, 22 insertions(+), 116 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index 5014559562..ba7561411d 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -13,18 +13,31 @@ define [ class HighlightedWordManager constructor: (@editor) -> @reset() - + reset: () -> + @highlights?.rows.forEach (highlight) => + @editor.getSession().removeMarker(highlight.markerId) @highlights = rows: [] addHighlight: (highlight) -> unless highlight instanceof Highlight highlight = new Highlight(highlight) - range = new Range( - highlight.row, highlight.column, - highlight.row, highlight.column + highlight.word.length - ) - highlight.markerId = @editor.getSession().addMarker range, "spelling-highlight", 'text', false + + session = @editor.getSession() + doc = session.getDocument() + # Set up Range that will automatically update it's positions when the + # document changes + range = new Range() + range.start = doc.createAnchor({ + row: highlight.row, + column: highlight.column + }) + range.end = doc.createAnchor({ + row: highlight.row, + column: highlight.column + highlight.word.length + }) + + highlight.markerId = session.addMarker range, "spelling-highlight", 'text', false @highlights.rows[highlight.row] ||= [] @highlights.rows[highlight.row].push highlight @@ -34,114 +47,7 @@ define [ if h == highlight @highlights.rows[highlight.row].splice(i, 1) - removeWord: (word) -> - toRemove = [] - for row in @highlights.rows - for highlight in (row || []) - if highlight.word == word - toRemove.push(highlight) - for highlight in toRemove + clearRow: (row) -> + row = @highlights.rows[row] + for highlight in (row || []).slice() @removeHighlight highlight - - moveHighlight: (highlight, position) -> - @removeHighlight highlight - highlight.row = position.row - highlight.column = position.column - @addHighlight highlight - - clearRows: (from, to) -> - from ||= 0 - to ||= @highlights.rows.length - 1 - for row in @highlights.rows.slice(from, to + 1) - for highlight in (row || []).slice(0) - @removeHighlight highlight - - insertRows: (offset, number) -> - # rows are inserted after offset. i.e. offset row is not modified - affectedHighlights = [] - for row in @highlights.rows.slice(offset) - affectedHighlights.push(highlight) for highlight in (row || []) - for highlight in affectedHighlights - @moveHighlight highlight, - row: highlight.row + number - column: highlight.column - - removeRows: (offset, number) -> - # offset is the first row to delete - affectedHighlights = [] - for row in @highlights.rows.slice(offset) - affectedHighlights.push(highlight) for highlight in (row || []) - for highlight in affectedHighlights - if highlight.row >= offset + number - @moveHighlight highlight, - row: highlight.row - number - column: highlight.column - else - @removeHighlight highlight - - findHighlightWithinRange: (range) -> - rows = @highlights.rows.slice(range.start.row, range.end.row + 1) - for row in rows - for highlight in (row || []) - if @_doesHighlightOverlapRange(highlight, range.start, range.end) - return highlight - return null - - applyChange: (change) -> - start = change.start - end = change.end - if change.action == "insert" - if start.row != end.row - rowsAdded = end.row - start.row - @insertRows start.row + 1, rowsAdded - # make a copy since we're going to modify in place - oldHighlights = (@highlights.rows[start.row] || []).slice(0) - for highlight in oldHighlights - if highlight.column > start.column - # insertion was fully before this highlight - @moveHighlight highlight, - row: end.row - column: highlight.column + (end.column - start.column) - else if highlight.column + highlight.word.length >= start.column - # insertion was inside this highlight - @removeHighlight highlight - - else if change.action == "remove" - if start.row == end.row - oldHighlights = (@highlights.rows[start.row] || []).slice(0) - else - rowsRemoved = end.row - start.row - oldHighlights = - (@highlights.rows[start.row] || []).concat( - (@highlights.rows[end.row] || []) - ) - @removeRows start.row + 1, rowsRemoved - - for highlight in oldHighlights - if @_doesHighlightOverlapRange highlight, start, end - @removeHighlight highlight - else if @_isHighlightAfterRange highlight, start, end - @moveHighlight highlight, - row: start.row - column: highlight.column - (end.column - start.column) - - _doesHighlightOverlapRange: (highlight, start, end) -> - highlightIsAllBeforeRange = - highlight.row < start.row or - (highlight.row == start.row and highlight.column + highlight.word.length <= start.column) - highlightIsAllAfterRange = - highlight.row > end.row or - (highlight.row == end.row and highlight.column >= end.column) - !(highlightIsAllBeforeRange or highlightIsAllAfterRange) - - _isHighlightAfterRange: (highlight, start, end) -> - return true if highlight.row > end.row - return false if highlight.row < end.row - highlight.column >= end.column - - - - - - - From 8de226782495666fd2d7f779e2d1f552349a9084 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 30 Apr 2018 16:03:35 +0100 Subject: [PATCH 56/87] Adapt aceEditor to use new spell check manager with adapter --- .../ide/editor/directives/aceEditor.coffee | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index ef3c5b20f8..77a0b94b46 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -7,6 +7,7 @@ define [ "ide/editor/directives/aceEditor/undo/UndoManager" "ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager" "ide/editor/directives/aceEditor/spell-check/SpellCheckManager" + "ide/editor/directives/aceEditor/spell-check/HighlightedWordManager" "ide/editor/directives/aceEditor/highlights/HighlightsManager" "ide/editor/directives/aceEditor/cursor-position/CursorPositionManager" "ide/editor/directives/aceEditor/track-changes/TrackChangesManager" @@ -15,7 +16,7 @@ define [ "ide/graphics/services/graphics" "ide/preamble/services/preamble" "ide/files/services/files" -], (App, Ace, SearchBox, Vim, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) -> +], (App, Ace, SearchBox, Vim, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightedWordManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) -> EditSession = ace.require('ace/edit_session').EditSession ModeList = ace.require('ace/ext/modelist') Vim = ace.require('ace/keyboard/vim').Vim @@ -103,7 +104,8 @@ define [ if scope.spellCheck # only enable spellcheck when explicitly required spellCheckCache = $cacheFactory.get("spellCheck-#{scope.name}") || $cacheFactory("spellCheck-#{scope.name}", {capacity: 1000}) - spellCheckManager = new SpellCheckManager(scope, editor, element, spellCheckCache, $http, $q) + spellCheckManager = new SpellCheckManager(scope, spellCheckCache, $http, $q, new SpellCheckAdapter(editor)) + undoManager = new UndoManager(scope, editor, element) highlightsManager = new HighlightsManager(scope, editor, element) cursorPositionManager = new CursorPositionManager(scope, editor, element, localStorage) @@ -361,6 +363,19 @@ define [ session.setScrollTop(session.getScrollTop() + 1) session.setScrollTop(session.getScrollTop() - 1) + onSessionChange = (e) -> + spellCheckManager.onSessionChange() + e.oldSession?.getDocument().off "change", spellCheckManager.onChange + e.session.getDocument().on "change", spellCheckManager.onChange + + attachToSpellCheck = () -> + spellCheckManager.init() + editor.on 'changeSession', onSessionChange + onSessionChange({ session: editor.getSession() }) # Force initial setup + + detachFromSpellCheck = () -> + editor.off 'changeSession', onSessionChange + attachToAce = (sharejs_doc) -> lines = sharejs_doc.getSnapshot().split("\n") session = editor.getSession() @@ -406,6 +421,7 @@ define [ editor.initing = false # now ready to edit document editor.setReadOnly(scope.readOnly) # respect the readOnly setting, normally false + attachToSpellCheck() resetScrollMargins() @@ -467,6 +483,7 @@ define [ scope.$on '$destroy', () -> if scope.sharejsDoc? + detachFromSpellCheck() detachFromAce(scope.sharejsDoc) session = editor.getSession() session?.destroy() @@ -585,3 +602,9 @@ define [ SearchBox::$init = () -> @element = $compile(searchHtml)($rootScope.$new())[0]; $init.apply(@) + + class SpellCheckAdapter + constructor: (@editor) -> + @wordManager = new HighlightedWordManager(@editor) + getLines: () -> @editor.getValue().split('\n') + normalizeChangeEvent: (e) -> e From abcc2cc11bd27bd689100740807affdfabef9a0a Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 24 Apr 2018 10:27:17 +0100 Subject: [PATCH 57/87] Style codemirror spelling errors --- services/web/public/stylesheets/app/editor/rich-text.less | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/web/public/stylesheets/app/editor/rich-text.less b/services/web/public/stylesheets/app/editor/rich-text.less index 493540e705..37a896269d 100644 --- a/services/web/public/stylesheets/app/editor/rich-text.less +++ b/services/web/public/stylesheets/app/editor/rich-text.less @@ -219,4 +219,11 @@ font-style: italic; color: #999; } + + .spelling-error { + background-image: url(/img/spellcheck-underline.png); + background-repeat: repeat-x; + background-position: bottom; + } } + From e6ffaaa489a68a902a4c77363f7d16ae7339133b Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 3 May 2018 17:28:36 +0100 Subject: [PATCH 58/87] Handle contextmenu for spelling --- .../ide/editor/directives/aceEditor.coffee | 42 +++++++++++++++---- .../spell-check/HighlightedWordManager.coffee | 17 ++++++++ .../spell-check/SpellCheckManager.coffee | 40 ++++++++++++++++++ 3 files changed, 91 insertions(+), 8 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 77a0b94b46..ad34d4d493 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -20,6 +20,7 @@ define [ EditSession = ace.require('ace/edit_session').EditSession ModeList = ace.require('ace/ext/modelist') Vim = ace.require('ace/keyboard/vim').Vim + Range = ace.require('ace/range').Range # set the path for ace workers if using a CDN (from editor.pug) if window.aceWorkerPath != "" @@ -363,18 +364,22 @@ define [ session.setScrollTop(session.getScrollTop() + 1) session.setScrollTop(session.getScrollTop() - 1) - onSessionChange = (e) -> + onSessionChangeForSpellCheck = (e) -> spellCheckManager.onSessionChange() e.oldSession?.getDocument().off "change", spellCheckManager.onChange e.session.getDocument().on "change", spellCheckManager.onChange + e.oldSession?.off "changeScrollTop", spellCheckManager.onScroll + e.session.on "changeScrollTop", spellCheckManager.onScroll - attachToSpellCheck = () -> + initSpellCheck = () -> spellCheckManager.init() - editor.on 'changeSession', onSessionChange - onSessionChange({ session: editor.getSession() }) # Force initial setup + editor.on 'changeSession', onSessionChangeForSpellCheck + onSessionChangeForSpellCheck({ session: editor.getSession() }) # Force initial setup + editor.on 'nativecontextmenu', spellCheckManager.onContextMenu - detachFromSpellCheck = () -> - editor.off 'changeSession', onSessionChange + tearDownSpellCheck = () -> + editor.off 'changeSession', onSessionChangeForSpellCheck + editor.off 'nativecontextmenu', spellCheckManager.onContextMenu attachToAce = (sharejs_doc) -> lines = sharejs_doc.getSnapshot().split("\n") @@ -421,7 +426,7 @@ define [ editor.initing = false # now ready to edit document editor.setReadOnly(scope.readOnly) # respect the readOnly setting, normally false - attachToSpellCheck() + initSpellCheck() resetScrollMargins() @@ -483,7 +488,7 @@ define [ scope.$on '$destroy', () -> if scope.sharejsDoc? - detachFromSpellCheck() + tearDownSpellCheck() detachFromAce(scope.sharejsDoc) session = editor.getSession() session?.destroy() @@ -608,3 +613,24 @@ define [ @wordManager = new HighlightedWordManager(@editor) getLines: () -> @editor.getValue().split('\n') normalizeChangeEvent: (e) -> e + getCoordsFromContextMenuEvent: (e) -> + e.domEvent.stopPropagation() + return { + x: e.domEvent.clientX, + y: e.domEvent.clientY + } + preventContextMenuEventDefault: (e) -> + e.domEvent.preventDefault() + getHighlightFromCoords: (coords) -> + position = @editor.renderer.screenToTextCoordinates(coords.x, coords.y) + @wordManager.findHighlightWithinRange({ + start: position + end: position + }) + selectHighlightedWord: (highlight) -> + @editor.getSession().getSelection().setSelectionRange( + new Range( + highlight.row, highlight.column, + highlight.row, highlight.column + highlight.word.length + ) + ) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index ba7561411d..5477bdcafa 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -51,3 +51,20 @@ define [ row = @highlights.rows[row] for highlight in (row || []).slice() @removeHighlight highlight + + findHighlightWithinRange: (range) -> + rows = @highlights.rows.slice(range.start.row, range.end.row + 1) + for row in rows + for highlight in (row || []) + if @_doesHighlightOverlapRange(highlight, range.start, range.end) + return highlight + return null + + _doesHighlightOverlapRange: (highlight, start, end) -> + highlightIsAllBeforeRange = + highlight.row < start.row or + (highlight.row == start.row and highlight.column + highlight.word.length <= start.column) + highlightIsAllAfterRange = + highlight.row > end.row or + (highlight.row == end.row and highlight.column >= end.column) + !(highlightIsAllBeforeRange or highlightIsAllAfterRange) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index 4dee1faf52..c6b40c7b77 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -1,6 +1,12 @@ define [], () -> class SpellCheckManager constructor: (@$scope, @cache, @$http, @$q, @adapter) -> + @$scope.spellMenu = { + open: false + top: '0px' + left: '0px' + suggestions: [] + } @inProgressRequest = null @updatedLines = [] @@ -30,6 +36,40 @@ define [], () -> @runSpellCheckSoon(200) if @isSpellCheckEnabled() + onContextMenu: (e) => + @closeContextMenu() + @openContextMenu(e) + + onScroll: () => @closeContextMenu() + + openContextMenu: (e) -> + coords = @adapter.getCoordsFromContextMenuEvent(e) + highlight = @adapter.getHighlightFromCoords(coords) + if highlight + @adapter.preventContextMenuEventDefault(e) + @adapter.selectHighlightedWord(highlight) + @$scope.$apply () => + @$scope.spellMenu = { + open: true + top: coords.y + 'px' + left: coords.x + 'px' + suggestions: highlight.suggestions + } + @setUpClickOffContextMenuListener() + return false + + setUpClickOffContextMenuListener: () -> + $(document).one 'click', (e) => + @closeContextMenu() if e.which != 3 # Ignore if right click + return true + + closeContextMenu: () -> + # This is triggered on scroll, so for performance only apply setting when + # it changes + if @$scope?.spellMenu and @$scope.spellMenu.open != false + @$scope.$apply () => + @$scope.spellMenu.open = false + runFullCheck: () -> @adapter.wordManager.reset() @runSpellCheck() if @isSpellCheckEnabled() From cf123ce85727f057906baa9339ec01e4c9f17050 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 3 May 2018 17:29:05 +0100 Subject: [PATCH 59/87] Extract spellMenu component and use when showing spell suggestions --- .../coffee/ide/editor/EditorManager.coffee | 1 + .../ide/editor/components/spellMenu.coffee | 29 +++++++++++++++++++ .../ide/editor/directives/aceEditor.coffee | 22 ++++---------- 3 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 services/web/public/coffee/ide/editor/components/spellMenu.coffee diff --git a/services/web/public/coffee/ide/editor/EditorManager.coffee b/services/web/public/coffee/ide/editor/EditorManager.coffee index 72bbe8509a..e3cabf8e98 100644 --- a/services/web/public/coffee/ide/editor/EditorManager.coffee +++ b/services/web/public/coffee/ide/editor/EditorManager.coffee @@ -1,5 +1,6 @@ define [ "ide/editor/Document" + "ide/editor/components/spellMenu" "ide/editor/directives/aceEditor" "ide/editor/directives/toggleSwitch" "ide/editor/controllers/SavingNotificationController" diff --git a/services/web/public/coffee/ide/editor/components/spellMenu.coffee b/services/web/public/coffee/ide/editor/components/spellMenu.coffee new file mode 100644 index 0000000000..c3fd78efba --- /dev/null +++ b/services/web/public/coffee/ide/editor/components/spellMenu.coffee @@ -0,0 +1,29 @@ +define ["base"], (App) -> + App.component "spellMenu", { + bindings: { + open: "<" + top: "<" + left: "<" + suggestions: "<" + replaceWord: "&" + learnWord: "&" + } + template: """ + + """ + } \ No newline at end of file diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index ad34d4d493..a30b93aaa0 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -510,22 +510,12 @@ define [ >Dismiss
- +
Date: Fri, 4 May 2018 15:30:06 +0100 Subject: [PATCH 60/87] Replace word with suggestion and learn word --- .../coffee/ide/editor/components/spellMenu.coffee | 13 +++++++++---- .../coffee/ide/editor/directives/aceEditor.coffee | 9 ++++++++- .../aceEditor/spell-check/SpellCheckManager.coffee | 11 ++++++++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/services/web/public/coffee/ide/editor/components/spellMenu.coffee b/services/web/public/coffee/ide/editor/components/spellMenu.coffee index c3fd78efba..ff3462e03e 100644 --- a/services/web/public/coffee/ide/editor/components/spellMenu.coffee +++ b/services/web/public/coffee/ide/editor/components/spellMenu.coffee @@ -4,7 +4,7 @@ define ["base"], (App) -> open: "<" top: "<" left: "<" - suggestions: "<" + highlight: "<" replaceWord: "&" learnWord: "&" } @@ -16,12 +16,17 @@ define ["base"], (App) -> ng-class="{open: $ctrl.open}" >
diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index a30b93aaa0..34ffedcac8 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -514,7 +514,9 @@ define [ open="spellMenu.open" top="spellMenu.top" left="spellMenu.left" - suggestions="spellMenu.suggestions" + highlight="spellMenu.highlight" + replace-word="replaceWord(highlight, suggestion)" + learn-word="learnWord(highlight)" >
+ @editor.getSession().replace(new Range( + highlight.row, highlight.column, + highlight.row, highlight.column + highlight.word.length + ), newWord) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index c6b40c7b77..3d274abea4 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -14,6 +14,9 @@ define [], () -> if language != oldLanguage and oldLanguage? @runFullCheck() + @$scope.replaceWord = @adapter.replaceWord + @$scope.learnWord = @learnWord + init: () -> @updatedLines = Array(@adapter.getLines().length).fill(true) @runSpellCheckSoon(200) if @isSpellCheckEnabled() @@ -53,7 +56,7 @@ define [], () -> open: true top: coords.y + 'px' left: coords.x + 'px' - suggestions: highlight.suggestions + highlight: highlight } @setUpClickOffContextMenuListener() return false @@ -70,6 +73,12 @@ define [], () -> @$scope.$apply () => @$scope.spellMenu.open = false + learnWord: (highlight) => + @apiRequest "/learn", word: highlight.word + @adapter.wordManager.removeHighlight highlight + language = @$scope.spellCheckLanguage + @cache?.put("#{language}:#{highlight.word}", true) + runFullCheck: () -> @adapter.wordManager.reset() @runSpellCheck() if @isSpellCheckEnabled() From 9c56f6c2fccb56c59810e00c548f644185bef01f Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Wed, 9 May 2018 16:35:59 +0100 Subject: [PATCH 61/87] Add init test for SpellCheckManager --- .../spell-check/SpellCheckManagerTests.coffee | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee diff --git a/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee b/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee new file mode 100644 index 0000000000..68e47511d3 --- /dev/null +++ b/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee @@ -0,0 +1,46 @@ +define [ + 'ide/editor/directives/aceEditor/spell-check/SpellCheckManager' +], (SpellCheckManager) -> + describe 'SpellCheckManager', -> + beforeEach (done) -> + @timelord = sinon.useFakeTimers() + + window.user = { id: 1 } + window.csrfToken = 'token' + @scope = { + $watch: sinon.stub() + spellCheck: true + spellCheckLanguage: 'en' + } + @wordManager = { + reset: sinon.stub() + clearRow: sinon.stub() + addHighlight: sinon.stub() + } + @adapter = { + getLines: sinon.stub() + wordManager: @wordManager + } + inject ($q, $http, $httpBackend, $cacheFactory) => + @$http = $http + @$q = $q + @$httpBackend = $httpBackend + cache = $cacheFactory('spellCheckTest', {capacity: 1000}) + @spellCheckManager = new SpellCheckManager(@scope, cache, $http, $q, @adapter) + done() + + afterEach -> + @timelord.restore() + + it 'runs a full check soon after init', () -> + @$httpBackend.when('POST', '/spelling/check').respond({ + misspellings: [{ + index: 0 + suggestions: ['opposition'] + }] + }) + @adapter.getLines.returns(['oppozition']) + @spellCheckManager.init() + @timelord.tick(200) + @$httpBackend.flush() + expect(@wordManager.addHighlight).to.have.been.called From d2bba0eb60c2361e337ebedfcf55492458ed10fd Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 11 May 2018 17:53:22 +0100 Subject: [PATCH 62/87] Fix firefox not closing contextmenu correctly --- .../aceEditor/spell-check/SpellCheckManager.coffee | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index 3d274abea4..6cc95d58c4 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -17,6 +17,10 @@ define [], () -> @$scope.replaceWord = @adapter.replaceWord @$scope.learnWord = @learnWord + $(document).on 'click', (e) => + @closeContextMenu() if e.which != 3 # Ignore if right click + return true + init: () -> @updatedLines = Array(@adapter.getLines().length).fill(true) @runSpellCheckSoon(200) if @isSpellCheckEnabled() @@ -58,14 +62,8 @@ define [], () -> left: coords.x + 'px' highlight: highlight } - @setUpClickOffContextMenuListener() return false - setUpClickOffContextMenuListener: () -> - $(document).one 'click', (e) => - @closeContextMenu() if e.which != 3 # Ignore if right click - return true - closeContextMenu: () -> # This is triggered on scroll, so for performance only apply setting when # it changes From ebf1b7c84c6b3eb42e92cedf7a148c8c44fdd57c Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 11 May 2018 12:22:45 +0100 Subject: [PATCH 63/87] Extract SpellCheckAdapter to separate file --- .../ide/editor/directives/aceEditor.coffee | 37 +-------------- .../spell-check/SpellCheckAdapter.coffee | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 35 deletions(-) create mode 100644 services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index 34ffedcac8..617b41b845 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -7,7 +7,7 @@ define [ "ide/editor/directives/aceEditor/undo/UndoManager" "ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager" "ide/editor/directives/aceEditor/spell-check/SpellCheckManager" - "ide/editor/directives/aceEditor/spell-check/HighlightedWordManager" + "ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter" "ide/editor/directives/aceEditor/highlights/HighlightsManager" "ide/editor/directives/aceEditor/cursor-position/CursorPositionManager" "ide/editor/directives/aceEditor/track-changes/TrackChangesManager" @@ -16,11 +16,10 @@ define [ "ide/graphics/services/graphics" "ide/preamble/services/preamble" "ide/files/services/files" -], (App, Ace, SearchBox, Vim, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightedWordManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) -> +], (App, Ace, SearchBox, Vim, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, SpellCheckAdapter, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) -> EditSession = ace.require('ace/edit_session').EditSession ModeList = ace.require('ace/ext/modelist') Vim = ace.require('ace/keyboard/vim').Vim - Range = ace.require('ace/range').Range # set the path for ace workers if using a CDN (from editor.pug) if window.aceWorkerPath != "" @@ -599,35 +598,3 @@ define [ SearchBox::$init = () -> @element = $compile(searchHtml)($rootScope.$new())[0]; $init.apply(@) - - class SpellCheckAdapter - constructor: (@editor) -> - @wordManager = new HighlightedWordManager(@editor) - getLines: () -> @editor.getValue().split('\n') - normalizeChangeEvent: (e) -> e - getCoordsFromContextMenuEvent: (e) -> - e.domEvent.stopPropagation() - return { - x: e.domEvent.clientX, - y: e.domEvent.clientY - } - preventContextMenuEventDefault: (e) -> - e.domEvent.preventDefault() - getHighlightFromCoords: (coords) -> - position = @editor.renderer.screenToTextCoordinates(coords.x, coords.y) - @wordManager.findHighlightWithinRange({ - start: position - end: position - }) - selectHighlightedWord: (highlight) -> - @editor.getSession().getSelection().setSelectionRange( - new Range( - highlight.row, highlight.column, - highlight.row, highlight.column + highlight.word.length - ) - ) - replaceWord: (highlight, newWord) => - @editor.getSession().replace(new Range( - highlight.row, highlight.column, - highlight.row, highlight.column + highlight.word.length - ), newWord) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee new file mode 100644 index 0000000000..feed646c95 --- /dev/null +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee @@ -0,0 +1,45 @@ +define [ + "ace/ace" + "ide/editor/directives/aceEditor/spell-check/HighlightedWordManager" +], (Ace, HighlightedWordManager) -> + Range = ace.require('ace/range').Range + + class SpellCheckAdapter + constructor: (@editor) -> + @wordManager = new HighlightedWordManager(@editor) + + getLines: () -> + @editor.getValue().split('\n') + + normalizeChangeEvent: (e) -> e + + getCoordsFromContextMenuEvent: (e) -> + e.domEvent.stopPropagation() + return { + x: e.domEvent.clientX, + y: e.domEvent.clientY + } + + preventContextMenuEventDefault: (e) -> + e.domEvent.preventDefault() + + getHighlightFromCoords: (coords) -> + position = @editor.renderer.screenToTextCoordinates(coords.x, coords.y) + @wordManager.findHighlightWithinRange({ + start: position + end: position + }) + + selectHighlightedWord: (highlight) -> + @editor.getSession().getSelection().setSelectionRange( + new Range( + highlight.row, highlight.column, + highlight.row, highlight.column + highlight.word.length + ) + ) + + replaceWord: (highlight, newWord) => + @editor.getSession().replace(new Range( + highlight.row, highlight.column, + highlight.row, highlight.column + highlight.word.length + ), newWord) From 9fa85400b35b061d2a48373f901d32c26a26b4dd Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 14 May 2018 16:28:16 +0100 Subject: [PATCH 64/87] HighlightedWordManager is more naive about tracking position We are relying entirely on Ace's tracking of markers with the anchor trick. This means that we don't have to apply changes to ensure that the word manager data structure tracks which row the highlights are on. This is traded off against slightly less efficient searching/removing --- .../spell-check/HighlightedWordManager.coffee | 59 +++++++++---------- .../spell-check/SpellCheckAdapter.coffee | 16 +++-- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index 5477bdcafa..627fbb0f88 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -4,9 +4,7 @@ define [ Range = ace.require("ace/range").Range class Highlight - constructor: (options) -> - @row = options.row - @column = options.column + constructor: (@markerId, @range, options) -> @word = options.word @suggestions = options.suggestions @@ -15,56 +13,53 @@ define [ @reset() reset: () -> - @highlights?.rows.forEach (highlight) => + @highlights?.forEach (highlight) => @editor.getSession().removeMarker(highlight.markerId) - @highlights = rows: [] - - addHighlight: (highlight) -> - unless highlight instanceof Highlight - highlight = new Highlight(highlight) + @highlights = [] + addHighlight: (options) -> session = @editor.getSession() doc = session.getDocument() # Set up Range that will automatically update it's positions when the # document changes range = new Range() range.start = doc.createAnchor({ - row: highlight.row, - column: highlight.column + row: options.row, + column: options.column }) range.end = doc.createAnchor({ - row: highlight.row, - column: highlight.column + highlight.word.length + row: options.row, + column: options.column + options.word.length }) - highlight.markerId = session.addMarker range, "spelling-highlight", 'text', false - @highlights.rows[highlight.row] ||= [] - @highlights.rows[highlight.row].push highlight + markerId = session.addMarker range, "spelling-highlight", 'text', false + + @highlights.push new Highlight(markerId, range, options) removeHighlight: (highlight) -> @editor.getSession().removeMarker(highlight.markerId) - for h, i in @highlights.rows[highlight.row] - if h == highlight - @highlights.rows[highlight.row].splice(i, 1) + @highlights = @highlights.filter (hl) -> + hl != highlight clearRow: (row) -> - row = @highlights.rows[row] - for highlight in (row || []).slice() - @removeHighlight highlight + @highlights.filter (highlight) -> + highlight.range.start.row == row + .forEach (highlight) => + @removeHighlight(highlight) findHighlightWithinRange: (range) -> - rows = @highlights.rows.slice(range.start.row, range.end.row + 1) - for row in rows - for highlight in (row || []) - if @_doesHighlightOverlapRange(highlight, range.start, range.end) - return highlight - return null + @highlights.find (highlight) => + @_doesHighlightOverlapRange highlight, range.start, range.end _doesHighlightOverlapRange: (highlight, start, end) -> + highlightRow = highlight.range.start.row + highlightStartColumn = highlight.range.start.column + highlightEndColumn = highlight.range.end.column + highlightIsAllBeforeRange = - highlight.row < start.row or - (highlight.row == start.row and highlight.column + highlight.word.length <= start.column) + highlightRow < start.row or + (highlightRow == start.row and highlightEndColumn <= start.column) highlightIsAllAfterRange = - highlight.row > end.row or - (highlight.row == end.row and highlight.column >= end.column) + highlightRow > end.row or + (highlightRow == end.row and highlightStartColumn >= end.column) !(highlightIsAllBeforeRange or highlightIsAllAfterRange) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee index feed646c95..51443d9848 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee @@ -31,15 +31,23 @@ define [ }) selectHighlightedWord: (highlight) -> + row = highlight.range.start.row + startColumn = highlight.range.start.column + endColumn = highlight.range.end.column + @editor.getSession().getSelection().setSelectionRange( new Range( - highlight.row, highlight.column, - highlight.row, highlight.column + highlight.word.length + row, startColumn, + row, endColumn ) ) replaceWord: (highlight, newWord) => + row = highlight.range.start.row + startColumn = highlight.range.start.column + endColumn = highlight.range.end.column + @editor.getSession().replace(new Range( - highlight.row, highlight.column, - highlight.row, highlight.column + highlight.word.length + row, startColumn, + row, endColumn ), newWord) From 2be023c731343f192c58f85c873756dbc7b7fece Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 14 May 2018 16:31:45 +0100 Subject: [PATCH 65/87] Prevent spell error marker adding newly typed characters --- .../aceEditor/spell-check/HighlightedWordManager.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index 627fbb0f88..46b7a218ab 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -31,6 +31,10 @@ define [ row: options.row, column: options.column + options.word.length }) + # Prevent range from adding newly typed characters to the end of the word. + # This makes it appear as if the spelling error continues to the next word + # even after a space + range.end.$insertRight = true markerId = session.addMarker range, "spelling-highlight", 'text', false From 846f27f0adfcfa3d05360af3a892646a9b97efb2 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 15 May 2018 15:08:36 +0100 Subject: [PATCH 66/87] Clear highlights that are "touching" the cursor on change This means that correcting a mistake won't wait until the request has resolved and that only the word at the end of the line will have it's spelling highlight removed instead of the entire row --- .../spell-check/HighlightedWordManager.coffee | 21 +++++++++++++++++++ .../spell-check/SpellCheckManager.coffee | 3 +++ 2 files changed, 24 insertions(+) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index 46b7a218ab..8bb350914f 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -67,3 +67,24 @@ define [ highlightRow > end.row or (highlightRow == end.row and highlightStartColumn >= end.column) !(highlightIsAllBeforeRange or highlightIsAllAfterRange) + + clearHighlightTouchingRange: (range) -> + highlight = @highlights.find (hl) => + @_doesHighlightTouchRange hl, range.start, range.end + if highlight + @removeHighlight highlight + + _doesHighlightTouchRange: (highlight, start, end) -> + highlightRow = highlight.range.start.row + highlightStartColumn = highlight.range.start.column + highlightEndColumn = highlight.range.end.column + + rangeStartIsWithinHighlight = + highlightStartColumn <= start.column and + highlightEndColumn >= start.column + rangeEndIsWithinHighlight = + highlightStartColumn <= end.column and + highlightEndColumn >= end.column + + highlightRow == start.row and + (rangeStartIsWithinHighlight or rangeEndIsWithinHighlight) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index 6cc95d58c4..2828f4b426 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -35,6 +35,9 @@ define [], () -> onChange: (e) => if @isSpellCheckEnabled() @markLinesAsUpdated(@adapter.normalizeChangeEvent(e)) + + @adapter.wordManager.clearHighlightTouchingRange(e) + @runSpellCheckSoon() onSessionChange: () => From 681e67ecea10a569946c66c7e8ba8157afcd532d Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 17 May 2018 15:59:13 +0100 Subject: [PATCH 67/87] Be more consistent with naming --- .../aceEditor/spell-check/SpellCheckAdapter.coffee | 4 ++-- .../aceEditor/spell-check/SpellCheckManager.coffee | 14 +++++++------- .../spell-check/SpellCheckManagerTests.coffee | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee index 51443d9848..9b6d809a37 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee @@ -6,7 +6,7 @@ define [ class SpellCheckAdapter constructor: (@editor) -> - @wordManager = new HighlightedWordManager(@editor) + @highlightedWordManager = new HighlightedWordManager(@editor) getLines: () -> @editor.getValue().split('\n') @@ -25,7 +25,7 @@ define [ getHighlightFromCoords: (coords) -> position = @editor.renderer.screenToTextCoordinates(coords.x, coords.y) - @wordManager.findHighlightWithinRange({ + @highlightedWordManager.findHighlightWithinRange({ start: position end: position }) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index 2828f4b426..89e3d1509d 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -36,12 +36,12 @@ define [], () -> if @isSpellCheckEnabled() @markLinesAsUpdated(@adapter.normalizeChangeEvent(e)) - @adapter.wordManager.clearHighlightTouchingRange(e) + @adapter.highlightedWordManager.clearHighlightTouchingRange(e) @runSpellCheckSoon() onSessionChange: () => - @adapter.wordManager.reset() + @adapter.highlightedWordManager.reset() @inProgressRequest.abort() if @inProgressRequest? @runSpellCheckSoon(200) if @isSpellCheckEnabled() @@ -76,12 +76,12 @@ define [], () -> learnWord: (highlight) => @apiRequest "/learn", word: highlight.word - @adapter.wordManager.removeHighlight highlight + @adapter.highlightedWordManager.removeHighlight highlight language = @$scope.spellCheckLanguage @cache?.put("#{language}:#{highlight.word}", true) runFullCheck: () -> - @adapter.wordManager.reset() + @adapter.highlightedWordManager.reset() @runSpellCheck() if @isSpellCheckEnabled() markLinesAsUpdated: (change) -> @@ -146,11 +146,11 @@ define [], () -> displayResult = (highlights) => if linesToProcess? for shouldProcess, row in linesToProcess - @adapter.wordManager.clearRow(row) if shouldProcess + @adapter.highlightedWordManager.clearRow(row) if shouldProcess else - @adapter.wordManager.reset() + @adapter.highlightedWordManager.reset() for highlight in highlights - @adapter.wordManager.addHighlight highlight + @adapter.highlightedWordManager.addHighlight highlight if not words.length displayResult highlights diff --git a/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee b/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee index 68e47511d3..1b0dddced6 100644 --- a/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee +++ b/services/web/test/unit_frontend/coffee/ide/editor/aceEditor/spell-check/SpellCheckManagerTests.coffee @@ -12,14 +12,14 @@ define [ spellCheck: true spellCheckLanguage: 'en' } - @wordManager = { + @highlightedWordManager = { reset: sinon.stub() clearRow: sinon.stub() addHighlight: sinon.stub() } @adapter = { getLines: sinon.stub() - wordManager: @wordManager + highlightedWordManager: @highlightedWordManager } inject ($q, $http, $httpBackend, $cacheFactory) => @$http = $http @@ -43,4 +43,4 @@ define [ @spellCheckManager.init() @timelord.tick(200) @$httpBackend.flush() - expect(@wordManager.addHighlight).to.have.been.called + expect(@highlightedWordManager.addHighlight).to.have.been.called From a719ac6e6e61e114cd2a1197aa3a2afd8d4f0135 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 18 May 2018 13:33:06 +0100 Subject: [PATCH 68/87] IE11 doesn't support Array.find so use underscore instead --- .../aceEditor/spell-check/HighlightedWordManager.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index 8bb350914f..c36edb309c 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -52,7 +52,7 @@ define [ @removeHighlight(highlight) findHighlightWithinRange: (range) -> - @highlights.find (highlight) => + _.find @highlights, (highlight) => @_doesHighlightOverlapRange highlight, range.start, range.end _doesHighlightOverlapRange: (highlight, start, end) -> @@ -69,7 +69,7 @@ define [ !(highlightIsAllBeforeRange or highlightIsAllAfterRange) clearHighlightTouchingRange: (range) -> - highlight = @highlights.find (hl) => + highlight = _.find @highlights, (hl) => @_doesHighlightTouchRange hl, range.start, range.end if highlight @removeHighlight highlight From c2d7809e055053b583ee958c9b570705dd7688d0 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 18 May 2018 14:23:36 +0100 Subject: [PATCH 69/87] Add removeWord so that learning word removes all highlights for given word --- .../aceEditor/spell-check/HighlightedWordManager.coffee | 6 ++++++ .../aceEditor/spell-check/SpellCheckManager.coffee | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee index c36edb309c..daeb4cc034 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/HighlightedWordManager.coffee @@ -45,6 +45,12 @@ define [ @highlights = @highlights.filter (hl) -> hl != highlight + removeWord: (word) -> + @highlights.filter (highlight) -> + highlight.word == word + .forEach (highlight) => + @removeHighlight(highlight) + clearRow: (row) -> @highlights.filter (highlight) -> highlight.range.start.row == row diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee index 89e3d1509d..cbe4fdbd64 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.coffee @@ -76,7 +76,7 @@ define [], () -> learnWord: (highlight) => @apiRequest "/learn", word: highlight.word - @adapter.highlightedWordManager.removeHighlight highlight + @adapter.highlightedWordManager.removeWord highlight.word language = @$scope.spellCheckLanguage @cache?.put("#{language}:#{highlight.word}", true) From 19e07485bc5b68581cc1421e76838c672aa71c0a Mon Sep 17 00:00:00 2001 From: Michael Mazour Date: Fri, 18 May 2018 15:08:33 +0100 Subject: [PATCH 70/87] Handle error in ExportsController --- .../web/app/coffee/Features/Exports/ExportsController.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/web/app/coffee/Features/Exports/ExportsController.coffee b/services/web/app/coffee/Features/Exports/ExportsController.coffee index cda2296249..b60f58ba20 100644 --- a/services/web/app/coffee/Features/Exports/ExportsController.coffee +++ b/services/web/app/coffee/Features/Exports/ExportsController.coffee @@ -8,6 +8,7 @@ module.exports = {project_id, brand_variation_id} = req.params user_id = AuthenticationController.getLoggedInUserId(req) ExportsHandler.exportProject project_id, user_id, brand_variation_id, (err, export_data) -> + return next(err) if err? logger.log user_id:user_id project_id: project_id From 309792401f8c6c1239fcb56c1981624367134b86 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Mon, 21 May 2018 10:35:43 +0100 Subject: [PATCH 71/87] Re-focus editor after clicking suggestion --- .../directives/aceEditor/spell-check/SpellCheckAdapter.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee index 9b6d809a37..2afc2cf0ff 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/spell-check/SpellCheckAdapter.coffee @@ -51,3 +51,6 @@ define [ row, startColumn, row, endColumn ), newWord) + + # Bring editor back into focus after clicking on suggestion + @editor.focus() From b1f378208de893e2f4ff155b740e08354d9ed5af Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 16 May 2018 16:31:28 +0100 Subject: [PATCH 72/87] Properly merge subscriptions from different places --- services/web/Makefile | 2 +- .../Features/Referal/ReferalAllocator.coffee | 6 +- .../SubscriptionController.coffee | 7 + .../Subscription/SubscriptionLocator.coffee | 4 +- .../Subscription/SubscriptionRouter.coffee | 2 + .../Subscription/SubscriptionUpdater.coffee | 87 ++++++---- .../Subscription/UserFeaturesUpdater.coffee | 9 +- .../Subscription/V1SubscriptionManager.coffee | 48 ++++++ services/web/docker-compose.yml | 1 + .../coffee/SubscriptionTests.coffee | 151 ++++++++++++++++++ .../coffee/helpers/MockV1Api.coffee | 13 +- .../acceptance/config/settings.test.coffee | 101 ++++++++++++ 12 files changed, 389 insertions(+), 42 deletions(-) create mode 100644 services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee create mode 100644 services/web/test/acceptance/coffee/SubscriptionTests.coffee create mode 100644 services/web/test/acceptance/config/settings.test.coffee diff --git a/services/web/Makefile b/services/web/Makefile index a0f8c1c503..720df034e8 100644 --- a/services/web/Makefile +++ b/services/web/Makefile @@ -9,7 +9,7 @@ COFFEE := node_modules/.bin/coffee $(COFFEE_OPTIONS) GRUNT := node_modules/.bin/grunt APP_COFFEE_FILES := $(shell find app/coffee -name '*.coffee') FRONT_END_COFFEE_FILES := $(shell find public/coffee -name '*.coffee') -TEST_COFFEE_FILES := $(shell find test -name '*.coffee') +TEST_COFFEE_FILES := $(shell find test/*/coffee -name '*.coffee') MODULE_MAIN_COFFEE_FILES := $(shell find modules -type f -wholename '*main/index.coffee') MODULE_IDE_COFFEE_FILES := $(shell find modules -type f -wholename '*ide/index.coffee') COFFEE_FILES := app.coffee $(APP_COFFEE_FILES) $(FRONT_END_COFFEE_FILES) $(TEST_COFFEE_FILES) diff --git a/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee b/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee index b28979aaf0..aef283d68d 100644 --- a/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee +++ b/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee @@ -31,7 +31,7 @@ module.exports = ReferalAllocator = - assignBonus: (user_id, callback = (error) ->) -> + getBonusFeatures: (user_id, callback = (error) ->) -> query = _id: user_id User.findOne query, (error, user) -> return callback(error) if error @@ -39,9 +39,7 @@ module.exports = ReferalAllocator = logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus" if user.refered_user_count? and user.refered_user_count > 0 newFeatures = ReferalAllocator._calculateFeatures(user) - if _.isEqual newFeatures, user.features - return callback() - User.update query, { $set: features: newFeatures }, callback + callback null, newFeatures else callback() diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee index 9da6fc688d..1b7078d9cb 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee @@ -9,6 +9,7 @@ logger = require('logger-sharelatex') GeoIpLookup = require("../../infrastructure/GeoIpLookup") SubscriptionDomainHandler = require("./SubscriptionDomainHandler") UserGetter = require "../User/UserGetter" +SubscriptionUpdater = require './SubscriptionUpdater' module.exports = SubscriptionController = @@ -237,3 +238,9 @@ module.exports = SubscriptionController = return next(error) if error? req.body = body next() + + refreshUserSubscription: (req, res, next) -> + {user_id} = req.params + SubscriptionUpdater.refreshSubscription user_id, (error) -> + return next(error) if error? + res.sendStatus 200 \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee index 1452f26d99..33376f504b 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionLocator.coffee @@ -28,8 +28,8 @@ module.exports = getSubscriptionByMemberIdAndId: (user_id, subscription_id, callback)-> Subscription.findOne {member_ids: user_id, _id:subscription_id}, {_id:1}, callback - getGroupSubscriptionMemberOf: (user_id, callback)-> - Subscription.findOne {member_ids: user_id}, {_id:1, planCode:1}, callback + getGroupSubscriptionsMemberOf: (user_id, callback)-> + Subscription.find {member_ids: user_id}, {_id:1, planCode:1}, callback getGroupsWithEmailInvite: (email, callback) -> Subscription.find { invited_emails: email }, callback \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee index d6d049f5bf..692f6c92c8 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee @@ -46,4 +46,6 @@ module.exports = webRouter.get "/user/subscription/upgrade-annual", AuthenticationController.requireLogin(), SubscriptionController.renderUpgradeToAnnualPlanPage webRouter.post "/user/subscription/upgrade-annual", AuthenticationController.requireLogin(), SubscriptionController.processUpgradeToAnnualPlan + # Currently used in acceptance tests only, as a way to trigger the syncing logic + publicApiRouter.post "/user/:user_id/subscription/sync", AuthenticationController.httpAuth, SubscriptionController.refreshUserSubscription diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee index 649551b5b2..c76bffd453 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee @@ -8,6 +8,7 @@ Settings = require("settings-sharelatex") logger = require("logger-sharelatex") ObjectId = require('mongoose').Types.ObjectId ReferalAllocator = require("../Referal/ReferalAllocator") +V1SubscriptionManager = require("./V1SubscriptionManager") oneMonthInSeconds = 60 * 60 * 24 * 30 @@ -105,38 +106,66 @@ module.exports = SubscriptionUpdater = _setUsersMinimumFeatures: (user_id, callback)-> jobs = - subscription: (cb)-> - SubscriptionLocator.getUsersSubscription user_id, cb - groupSubscription: (cb)-> - SubscriptionLocator.getGroupSubscriptionMemberOf user_id, cb - v1PlanCode: (cb) -> - Modules = require '../../infrastructure/Modules' - Modules.hooks.fire 'getV1PlanCode', user_id, (err, results) -> - cb(err, results?[0] || null) + individualFeatures: (cb)-> + SubscriptionLocator.getUsersSubscription user_id, (err, sub)-> + cb err, SubscriptionUpdater._subscriptionToFeatures(sub) + groupFeatures: (cb) -> + SubscriptionLocator.getGroupSubscriptionsMemberOf user_id, (err, subs) -> + cb err, (subs or []).map SubscriptionUpdater._subscriptionToFeatures + v1Features: (cb) -> + V1SubscriptionManager.getPlanCodeFromV1 user_id, (err, planCode) -> + cb err, SubscriptionUpdater._planCodeToFeatures(planCode) + bonusFeatures: (cb) -> + ReferalAllocator.getBonusFeatures user_id, cb async.series jobs, (err, results)-> if err? logger.err err:err, user_id:user_id, "error getting subscription or group for _setUsersMinimumFeatures" return callback(err) - {subscription, groupSubscription, v1PlanCode} = results - # Group Subscription - if groupSubscription? and groupSubscription.planCode? - logger.log user_id:user_id, "using group which user is memor of for features" - UserFeaturesUpdater.updateFeatures user_id, groupSubscription.planCode, callback - # Personal Subscription - else if subscription? and subscription.planCode? and subscription.planCode != Settings.defaultPlanCode - logger.log user_id:user_id, "using users subscription plan code for features" - UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback - # V1 Subscription - else if v1PlanCode? - logger.log user_id: user_id, "using the V1 plan for features" - UserFeaturesUpdater.updateFeatures user_id, v1PlanCode, callback - # Default - else - logger.log user_id:user_id, "using default features for user with no subscription or group" - UserFeaturesUpdater.updateFeatures user_id, Settings.defaultPlanCode, (err)-> - if err? - logger.err err:err, user_id:user_id, "Error setting minimum user feature" - return callback(err) - ReferalAllocator.assignBonus user_id, callback + {individualFeatures, groupFeatures, v1Features, bonusFeatures} = results + logger.log {user_id, individualFeatures, groupFeatures, v1Features, bonusFeatures}, 'merging user features' + featureSets = groupFeatures.concat [individualFeatures, v1Features, bonusFeatures] + features = _.reduce(featureSets, SubscriptionUpdater._mergeFeatures, Settings.defaultFeatures) + + logger.log {user_id, features}, 'updating user features' + UserFeaturesUpdater.updateFeatures user_id, features, callback + + _mergeFeatures: (featuresA, featuresB) -> + features = Object.assign({}, featuresA) + for key, value of featuresB + # Special merging logic for non-boolean features + if key == 'compileGroup' + if features['compileGroup'] == 'priority' or featuresB['compileGroup'] == 'priority' + features['compileGroup'] = 'priority' + else + features['compileGroup'] = 'standard' + else if key == 'collaborators' + if features['collaborators'] == -1 or featuresB['collaborators'] == -1 + features['collaborators'] = -1 + else + features['collaborators'] = Math.max( + features['collaborators'] or 0, + featuresB['collaborators'] or 0 + ) + else if key == 'compileTimeout' + features['compileTimeout'] = Math.max( + features['compileTimeout'] or 0, + featuresB['compileTimeout'] or 0 + ) + else + # Boolean keys, true is better + features[key] = features[key] or featuresB[key] + return features + + _subscriptionToFeatures: (subscription) -> + SubscriptionUpdater._planCodeToFeatures(subscription?.planCode) + + _planCodeToFeatures: (planCode) -> + if !planCode? + return {} + plan = PlansLocator.findLocalPlanInSettings planCode + if !plan? + return {} + else + return plan.features \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee b/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee index c0b691e677..520139e9be 100644 --- a/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee @@ -4,12 +4,11 @@ PlansLocator = require("./PlansLocator") module.exports = - updateFeatures: (user_id, plan_code, callback = (err, features)->)-> + updateFeatures: (user_id, features, callback = (err, features)->)-> conditions = _id:user_id update = {} - plan = PlansLocator.findLocalPlanInSettings(plan_code) - logger.log user_id:user_id, features:plan.features, plan_code:plan_code, "updating users features" - update["features.#{key}"] = value for key, value of plan.features + logger.log user_id:user_id, features:features, "updating users features" + update["features.#{key}"] = value for key, value of features User.update conditions, update, (err)-> - callback err, plan.features + callback err, features diff --git a/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee b/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee new file mode 100644 index 0000000000..37460cd773 --- /dev/null +++ b/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee @@ -0,0 +1,48 @@ +UserGetter = require "../User/UserGetter" +request = require "request" +settings = require "settings-sharelatex" +logger = require "logger-sharelatex" + +module.exports = V1SubscriptionManager = + # Returned planCode = 'v1_pro' | 'v1_pro_plus' | 'v1_student' | 'v1_free' | null + # For this to work, we need plans in settings with plan-codes: + # - 'v1_pro' + # - 'v1_pro_plus' + # - 'v1_student' + # - 'v1_free' + getPlanCodeFromV1: (userId, callback=(err, planCode)->) -> + logger.log {userId}, "[V1SubscriptionManager] fetching v1 plan for user" + UserGetter.getUser userId, {'overleaf.id': 1}, (err, user) -> + return callback(err) if err? + v1Id = user?.overleaf?.id + if !v1Id? + logger.log {userId}, "[V1SubscriptionManager] no v1 id found for user" + return callback(null, null) + V1SubscriptionManager._v1PlanRequest v1Id, (err, body) -> + return callback(err) if err? + planName = body.plan_name + logger.log {userId, planName, body}, "[V1SubscriptionManager] fetched v1 plan for user" + if planName in ['pro', 'pro_plus', 'student', 'free'] + planName = "v1_#{planName}" + else + # Throw away 'anonymous', etc as being equivalent to null + planName = null + return callback(null, planName) + + _v1PlanRequest: (v1Id, callback=(err, body)->) -> + request { + method: 'GET', + url: settings.apis.v1.url + + "/api/v1/sharelatex/users/#{v1Id}/plan_code" + auth: + user: settings.apis.v1.user + pass: settings.apis.v1.pass + sendImmediately: true + json: true, + timeout: 5 * 1000 + }, (error, response, body) -> + return callback(error) if error? + if 200 <= response.statusCode < 300 + return callback null, body + else + return callback new Error("non-success code from v1: #{response.statusCode}") \ No newline at end of file diff --git a/services/web/docker-compose.yml b/services/web/docker-compose.yml index 5a668bc4a3..a062c0df4e 100644 --- a/services/web/docker-compose.yml +++ b/services/web/docker-compose.yml @@ -17,6 +17,7 @@ services: PROJECT_HISTORY_ENABLED: 'true' ENABLED_LINKED_FILE_TYPES: 'url' LINKED_URL_PROXY: 'http://localhost:6543' + SHARELATEX_CONFIG: /app/test/acceptance/config/settings.test.coffee depends_on: - redis - mongo diff --git a/services/web/test/acceptance/coffee/SubscriptionTests.coffee b/services/web/test/acceptance/coffee/SubscriptionTests.coffee new file mode 100644 index 0000000000..55f3a0efbc --- /dev/null +++ b/services/web/test/acceptance/coffee/SubscriptionTests.coffee @@ -0,0 +1,151 @@ +expect = require("chai").expect +async = require("async") +UserClient = require "./helpers/User" +request = require "./helpers/request" +settings = require "settings-sharelatex" +{ObjectId} = require("../../../app/js/infrastructure/mongojs") +Subscription = require("../../../app/js/models/Subscription").Subscription +User = require("../../../app/js/models/User").User + +MockV1Api = require "./helpers/MockV1Api" + +syncUserAndGetFeatures = (user, callback = (error, features) ->) -> + request { + method: 'POST', + url: "/user/#{user._id}/subscription/sync", + auth: + user: 'sharelatex' + pass: 'password' + sendImmediately: true + }, (error, response, body) -> + throw error if error? + expect(response.statusCode).to.equal 200 + User.findById user._id, (error, user) -> + return callback(error) if error? + features = user.toObject().features + delete features.$init # mongoose internals + return callback null, features + +describe "Subscriptions", -> + beforeEach (done) -> + @user = new UserClient() + @user.ensureUserExists (error) -> + throw error if error? + done() + + describe "when user has no subscriptions", -> + it "should set their features to the basic set", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + expect(features).to.deep.equal(settings.defaultFeatures) + done() + + describe "when the user has an individual subscription", -> + beforeEach -> + Subscription.create { + admin_id: @user._id + planCode: 'collaborator' + customAccount: true + } # returns a promise + + it "should set their features to the upgraded set", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + plan = settings.plans.find (plan) -> plan.planCode == 'collaborator' + expect(features).to.deep.equal(plan.features) + done() + + describe "when the user is in a group subscription", -> + beforeEach -> + Subscription.create { + admin_id: ObjectId() + member_ids: [@user._id] + groupAccount: true + planCode: 'collaborator' + customAccount: true + } # returns a promise + + it "should set their features to the upgraded set", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + plan = settings.plans.find (plan) -> plan.planCode == 'collaborator' + expect(features).to.deep.equal(plan.features) + done() + + describe "when the user has bonus features", -> + beforeEach -> + User.update { + _id: @user._id + }, { + refered_user_count: 10 + } # returns a promise + + it "should set their features to the bonus set", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + expect(features).to.deep.equal(Object.assign( + {}, settings.defaultFeatures, settings.bonus_features[9] + )) + done() + + describe "when the user has a v1 plan", -> + beforeEach -> + MockV1Api.setUser 42, plan_name: 'free' + User.update { + _id: @user._id + }, { + overleaf: + id: 42 + } # returns a promise + + it "should set their features to the v1 plan", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + plan = settings.plans.find (plan) -> plan.planCode == 'v1_free' + expect(features).to.deep.equal(plan.features) + done() + + describe "when the user has a v1 plan and bonus features", -> + beforeEach -> + MockV1Api.setUser 42, plan_name: 'free' + User.update { + _id: @user._id + }, { + overleaf: + id: 42 + refered_user_count: 10 + } # returns a promise + + it "should set their features to the best of the v1 plan and bonus features", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + v1plan = settings.plans.find (plan) -> plan.planCode == 'v1_free' + expectedFeatures = Object.assign( + {}, v1plan.features, settings.bonus_features[9] + ) + expect(features).to.deep.equal(expectedFeatures) + done() + + describe "when the user has a group and personal subscription", -> + beforeEach (done) -> + Subscription.create { + admin_id: @user._id + planCode: 'professional' + customAccount: true + }, (error) => + throw error if error? + Subscription.create { + admin_id: ObjectId() + member_ids: [@user._id] + groupAccount: true + planCode: 'collaborator' + customAccount: true + }, done + return + + it "should set their features to the best set", (done) -> + syncUserAndGetFeatures @user, (error, features) => + throw error if error? + plan = settings.plans.find (plan) -> plan.planCode == 'professional' + expect(features).to.deep.equal(plan.features) + done() \ No newline at end of file diff --git a/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee b/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee index f27a4e1662..5c2cf47ad9 100644 --- a/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee +++ b/services/web/test/acceptance/coffee/helpers/MockV1Api.coffee @@ -5,6 +5,10 @@ bodyParser = require('body-parser') app.use(bodyParser.json()) module.exports = MockV1Api = + users: { } + + setUser: (id, user) -> + @users[id] = user exportId: null @@ -20,6 +24,13 @@ module.exports = MockV1Api = @exportParams = null run: () -> + app.get "/api/v1/sharelatex/users/:ol_user_id/plan_code", (req, res, next) => + user = @users[req.params.ol_user_id] + if user + res.json user + else + res.sendStatus 404 + app.post "/api/v1/sharelatex/exports", (req, res, next) => #{project, version, pathname} @exportParams = Object.assign({}, req.body) @@ -28,7 +39,7 @@ module.exports = MockV1Api = app.listen 5000, (error) -> throw error if error? .on "error", (error) -> - console.error "error starting MockOverleafAPI:", error.message + console.error "error starting MockV1Api:", error.message process.exit(1) MockV1Api.run() diff --git a/services/web/test/acceptance/config/settings.test.coffee b/services/web/test/acceptance/config/settings.test.coffee new file mode 100644 index 0000000000..1bcb7426ff --- /dev/null +++ b/services/web/test/acceptance/config/settings.test.coffee @@ -0,0 +1,101 @@ +module.exports = + apis: + v1: + url: "http://localhost:5000" + user: 'overleaf' + pass: 'password' + + enableSubscriptions: true + + features: features = + v1_free: + collaborators: 1 + dropbox: false + versioning: false + github: true + templates: false + references: false + referencesSearch: false + mendeley: true + compileTimeout: 60 + compileGroup: "standard" + trackChanges: false + personal: + collaborators: 1 + dropbox: false + versioning: false + github: false + templates: false + references: false + referencesSearch: false + mendeley: false + compileTimeout: 60 + compileGroup: "standard" + trackChanges: false + collaborator: + collaborators: 10 + dropbox: true + versioning: true + github: true + templates: true + references: true + referencesSearch: true + mendeley: true + compileTimeout: 180 + compileGroup: "priority" + trackChanges: true + professional: + collaborators: -1 + dropbox: true + versioning: true + github: true + templates: true + references: true + referencesSearch: true + mendeley: true + compileTimeout: 180 + compileGroup: "priority" + trackChanges: true + + defaultFeatures: features.personal + defaultPlanCode: 'personal' + + plans: plans = [{ + planCode: "v1_free" + name: "V1 Free" + price: 0 + features: features.v1_free + },{ + planCode: "personal" + name: "Personal" + price: 0 + features: features.personal + },{ + planCode: "collaborator" + name: "Collaborator" + price: 1500 + features: features.collaborator + },{ + planCode: "professional" + name: "Professional" + price: 3000 + features: features.professional + }] + + bonus_features: + 1: + collaborators: 2 + dropbox: false + versioning: false + 3: + collaborators: 4 + dropbox: false + versioning: false + 6: + collaborators: 4 + dropbox: true + versioning: true + 9: + collaborators: -1 + dropbox: true + versioning: true From 4deaf7865da6f939241c87a1b83d986775dbd30b Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 16 May 2018 16:33:26 +0100 Subject: [PATCH 73/87] Guard against no apis.v1 setting --- .../coffee/Features/Subscription/V1SubscriptionManager.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee b/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee index 37460cd773..05dc140be2 100644 --- a/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee +++ b/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee @@ -20,7 +20,7 @@ module.exports = V1SubscriptionManager = return callback(null, null) V1SubscriptionManager._v1PlanRequest v1Id, (err, body) -> return callback(err) if err? - planName = body.plan_name + planName = body?.plan_name logger.log {userId, planName, body}, "[V1SubscriptionManager] fetched v1 plan for user" if planName in ['pro', 'pro_plus', 'student', 'free'] planName = "v1_#{planName}" @@ -30,6 +30,8 @@ module.exports = V1SubscriptionManager = return callback(null, planName) _v1PlanRequest: (v1Id, callback=(err, body)->) -> + if !settings?.apis?.v1 + return callback null, null request { method: 'GET', url: settings.apis.v1.url + From 0830c473ad94da146a1549db656d1424ed224c86 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 17 May 2018 16:58:58 +0100 Subject: [PATCH 74/87] Update unit tests and refactor to make more testable --- .../Features/Referal/ReferalAllocator.coffee | 46 +--- .../Features/Referal/ReferalFeatures.coffee | 44 ++++ .../SubscriptionController.coffee | 4 +- .../Subscription/SubscriptionRouter.coffee | 2 +- .../Subscription/SubscriptionUpdater.coffee | 48 ++-- .../Subscription/UserFeaturesUpdater.coffee | 2 - .../coffee/SubscriptionTests.coffee | 2 +- .../Referal/ReferalAllocatorTests.coffee | 125 +--------- .../Referal/ReferalFeaturesTests.coffee | 65 +++++ .../SubscriptionControllerTests.coffee | 1 + .../SubscriptionUpdaterTests.coffee | 236 ++++++++++++------ .../UserFeaturesUpdaterTests.coffee | 17 +- .../V1SusbcriptionManagerTests.coffee | 128 ++++++++++ 13 files changed, 438 insertions(+), 282 deletions(-) create mode 100644 services/web/app/coffee/Features/Referal/ReferalFeatures.coffee create mode 100644 services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee create mode 100644 services/web/test/unit/coffee/Subscription/V1SusbcriptionManagerTests.coffee diff --git a/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee b/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee index aef283d68d..3344747968 100644 --- a/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee +++ b/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee @@ -1,8 +1,8 @@ _ = require("underscore") logger = require('logger-sharelatex') User = require('../../models/User').User -SubscriptionLocator = require "../Subscription/SubscriptionLocator" Settings = require "settings-sharelatex" +SubscriptionUpdater = require "../Subscription/SubscriptionUpdater" module.exports = ReferalAllocator = allocate: (referal_id, new_user_id, referal_source, referal_medium, callback = ->)-> @@ -25,48 +25,6 @@ module.exports = ReferalAllocator = if err? logger.err err:err, referal_id:referal_id, new_user_id:new_user_id, "something went wrong allocating referal" return callback(err) - ReferalAllocator.assignBonus user._id, callback + SubscriptionUpdater.refreshFeatures user._id, callback else callback() - - - - getBonusFeatures: (user_id, callback = (error) ->) -> - query = _id: user_id - User.findOne query, (error, user) -> - return callback(error) if error - return callback(new Error("user not found #{user_id} for assignBonus")) if !user? - logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus" - if user.refered_user_count? and user.refered_user_count > 0 - newFeatures = ReferalAllocator._calculateFeatures(user) - callback null, newFeatures - else - callback() - - _calculateFeatures : (user)-> - bonusLevel = ReferalAllocator._getBonusLevel(user) - currentFeatures = _.clone(user.features) #need to clone because we exend with underscore later - betterBonusFeatures = {} - _.each Settings.bonus_features["#{bonusLevel}"], (bonusLevel, key)-> - currentLevel = user?.features?[key] - if _.isBoolean(currentLevel) and currentLevel == false - betterBonusFeatures[key] = bonusLevel - - if _.isNumber(currentLevel) - if currentLevel == -1 - return - bonusIsGreaterThanCurrent = currentLevel < bonusLevel - if bonusIsGreaterThanCurrent or bonusLevel == -1 - betterBonusFeatures[key] = bonusLevel - newFeatures = _.extend(currentFeatures, betterBonusFeatures) - return newFeatures - - - _getBonusLevel: (user)-> - highestBonusLevel = 0 - _.each _.keys(Settings.bonus_features), (level)-> - levelIsLessThanUser = level <= user.refered_user_count - levelIsMoreThanCurrentHighest = level >= highestBonusLevel - if levelIsLessThanUser and levelIsMoreThanCurrentHighest - highestBonusLevel = level - return highestBonusLevel diff --git a/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee new file mode 100644 index 0000000000..34651ef1f5 --- /dev/null +++ b/services/web/app/coffee/Features/Referal/ReferalFeatures.coffee @@ -0,0 +1,44 @@ +_ = require("underscore") +logger = require('logger-sharelatex') +User = require('../../models/User').User +Settings = require "settings-sharelatex" + +module.exports = ReferalFeatures = + getBonusFeatures: (user_id, callback = (error) ->) -> + query = _id: user_id + User.findOne query, (error, user) -> + return callback(error) if error + return callback(new Error("user not found #{user_id} for assignBonus")) if !user? + logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus" + if user.refered_user_count? and user.refered_user_count > 0 + newFeatures = ReferalFeatures._calculateFeatures(user) + callback null, newFeatures + else + callback null, {} + + _calculateFeatures : (user)-> + bonusLevel = ReferalFeatures._getBonusLevel(user) + currentFeatures = _.clone(user.features) #need to clone because we exend with underscore later + betterBonusFeatures = {} + _.each Settings.bonus_features["#{bonusLevel}"], (bonusLevel, key)-> + currentLevel = user?.features?[key] + if _.isBoolean(currentLevel) and currentLevel == false + betterBonusFeatures[key] = bonusLevel + + if _.isNumber(currentLevel) + if currentLevel == -1 + return + bonusIsGreaterThanCurrent = currentLevel < bonusLevel + if bonusIsGreaterThanCurrent or bonusLevel == -1 + betterBonusFeatures[key] = bonusLevel + newFeatures = _.extend(currentFeatures, betterBonusFeatures) + return newFeatures + + _getBonusLevel: (user)-> + highestBonusLevel = 0 + _.each _.keys(Settings.bonus_features), (level)-> + levelIsLessThanUser = level <= user.refered_user_count + levelIsMoreThanCurrentHighest = level >= highestBonusLevel + if levelIsLessThanUser and levelIsMoreThanCurrentHighest + highestBonusLevel = level + return highestBonusLevel diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee index 1b7078d9cb..f127f7ed35 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee @@ -239,8 +239,8 @@ module.exports = SubscriptionController = req.body = body next() - refreshUserSubscription: (req, res, next) -> + refreshUserFeatures: (req, res, next) -> {user_id} = req.params - SubscriptionUpdater.refreshSubscription user_id, (error) -> + SubscriptionUpdater.refreshFeatures user_id, (error) -> return next(error) if error? res.sendStatus 200 \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee index 692f6c92c8..8c5f631e12 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionRouter.coffee @@ -47,5 +47,5 @@ module.exports = webRouter.post "/user/subscription/upgrade-annual", AuthenticationController.requireLogin(), SubscriptionController.processUpgradeToAnnualPlan # Currently used in acceptance tests only, as a way to trigger the syncing logic - publicApiRouter.post "/user/:user_id/subscription/sync", AuthenticationController.httpAuth, SubscriptionController.refreshUserSubscription + publicApiRouter.post "/user/:user_id/features/sync", AuthenticationController.httpAuth, SubscriptionController.refreshUserFeatures diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee index c76bffd453..8e583bd07b 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee @@ -7,7 +7,7 @@ PlansLocator = require("./PlansLocator") Settings = require("settings-sharelatex") logger = require("logger-sharelatex") ObjectId = require('mongoose').Types.ObjectId -ReferalAllocator = require("../Referal/ReferalAllocator") +ReferalFeatures = require("../Referal/ReferalFeatures") V1SubscriptionManager = require("./V1SubscriptionManager") oneMonthInSeconds = 60 * 60 * 24 * 30 @@ -54,7 +54,7 @@ module.exports = SubscriptionUpdater = if err? logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from group" return callback(err) - SubscriptionUpdater._setUsersMinimumFeatures user_id, callback + SubscriptionUpdater.refreshFeatures user_id, callback removeEmailInviteFromGroup: (adminUser_id, email, callback)-> Subscription.update { @@ -63,9 +63,6 @@ module.exports = SubscriptionUpdater = invited_emails: email }, callback - refreshSubscription: (user_id, callback=(err)->) -> - SubscriptionUpdater._setUsersMinimumFeatures user_id, callback - deleteSubscription: (subscription_id, callback = (error) ->) -> SubscriptionLocator.getSubscription subscription_id, (err, subscription) -> return callback(err) if err? @@ -73,7 +70,7 @@ module.exports = SubscriptionUpdater = logger.log {subscription_id, affected_user_ids}, "deleting subscription and downgrading users" Subscription.remove {_id: ObjectId(subscription_id)}, (err) -> return callback(err) if err? - async.mapSeries affected_user_ids, SubscriptionUpdater._setUsersMinimumFeatures, callback + async.mapSeries affected_user_ids, SubscriptionUpdater.refreshFeatures, callback _createNewSubscription: (adminUser_id, callback)-> logger.log adminUser_id:adminUser_id, "creating new subscription" @@ -101,36 +98,41 @@ module.exports = SubscriptionUpdater = allIds = _.union subscription.member_ids, [subscription.admin_id] jobs = allIds.map (user_id)-> return (cb)-> - SubscriptionUpdater._setUsersMinimumFeatures user_id, cb + SubscriptionUpdater.refreshFeatures user_id, cb async.series jobs, callback - _setUsersMinimumFeatures: (user_id, callback)-> + refreshFeatures: (user_id, callback)-> jobs = - individualFeatures: (cb)-> - SubscriptionLocator.getUsersSubscription user_id, (err, sub)-> - cb err, SubscriptionUpdater._subscriptionToFeatures(sub) - groupFeatures: (cb) -> - SubscriptionLocator.getGroupSubscriptionsMemberOf user_id, (err, subs) -> - cb err, (subs or []).map SubscriptionUpdater._subscriptionToFeatures - v1Features: (cb) -> - V1SubscriptionManager.getPlanCodeFromV1 user_id, (err, planCode) -> - cb err, SubscriptionUpdater._planCodeToFeatures(planCode) - bonusFeatures: (cb) -> - ReferalAllocator.getBonusFeatures user_id, cb + individualFeatures: (cb) -> SubscriptionUpdater._getIndividualFeatures user_id, cb + groupFeatureSets: (cb) -> SubscriptionUpdater._getGroupFeatureSets user_id, cb + v1Features: (cb) -> SubscriptionUpdater._getV1Features user_id, cb + bonusFeatures: (cb) -> ReferalFeatures.getBonusFeatures user_id, cb async.series jobs, (err, results)-> if err? logger.err err:err, user_id:user_id, - "error getting subscription or group for _setUsersMinimumFeatures" + "error getting subscription or group for refreshFeatures" return callback(err) - {individualFeatures, groupFeatures, v1Features, bonusFeatures} = results - logger.log {user_id, individualFeatures, groupFeatures, v1Features, bonusFeatures}, 'merging user features' - featureSets = groupFeatures.concat [individualFeatures, v1Features, bonusFeatures] + {individualFeatures, groupFeatureSets, v1Features, bonusFeatures} = results + logger.log {user_id, individualFeatures, groupFeatureSets, v1Features, bonusFeatures}, 'merging user features' + featureSets = groupFeatureSets.concat [individualFeatures, v1Features, bonusFeatures] features = _.reduce(featureSets, SubscriptionUpdater._mergeFeatures, Settings.defaultFeatures) logger.log {user_id, features}, 'updating user features' UserFeaturesUpdater.updateFeatures user_id, features, callback + _getIndividualFeatures: (user_id, callback = (error, features = {}) ->) -> + SubscriptionLocator.getUsersSubscription user_id, (err, sub)-> + callback err, SubscriptionUpdater._subscriptionToFeatures(sub) + + _getGroupFeatureSets: (user_id, callback = (error, featureSets = []) ->) -> + SubscriptionLocator.getGroupSubscriptionsMemberOf user_id, (err, subs) -> + callback err, (subs or []).map SubscriptionUpdater._subscriptionToFeatures + + _getV1Features: (user_id, callback = (error, features = {}) ->) -> + V1SubscriptionManager.getPlanCodeFromV1 user_id, (err, planCode) -> + callback err, SubscriptionUpdater._planCodeToFeatures(planCode) + _mergeFeatures: (featuresA, featuresB) -> features = Object.assign({}, featuresA) for key, value of featuresB diff --git a/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee b/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee index 520139e9be..28a49b2126 100644 --- a/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/UserFeaturesUpdater.coffee @@ -1,9 +1,7 @@ logger = require("logger-sharelatex") User = require('../../models/User').User -PlansLocator = require("./PlansLocator") module.exports = - updateFeatures: (user_id, features, callback = (err, features)->)-> conditions = _id:user_id update = {} diff --git a/services/web/test/acceptance/coffee/SubscriptionTests.coffee b/services/web/test/acceptance/coffee/SubscriptionTests.coffee index 55f3a0efbc..ce762ea0ee 100644 --- a/services/web/test/acceptance/coffee/SubscriptionTests.coffee +++ b/services/web/test/acceptance/coffee/SubscriptionTests.coffee @@ -12,7 +12,7 @@ MockV1Api = require "./helpers/MockV1Api" syncUserAndGetFeatures = (user, callback = (error, features) ->) -> request { method: 'POST', - url: "/user/#{user._id}/subscription/sync", + url: "/user/#{user._id}/features/sync", auth: user: 'sharelatex' pass: 'password' diff --git a/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee b/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee index 3fe925f91c..ef0f0243c8 100644 --- a/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee +++ b/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee @@ -4,12 +4,12 @@ require('chai').should() sinon = require('sinon') modulePath = require('path').join __dirname, '../../../../app/js/Features/Referal/ReferalAllocator.js' -describe 'Referalallocator', -> +describe 'ReferalAllocator', -> beforeEach -> @ReferalAllocator = SandboxedModule.require modulePath, requires: '../../models/User': User: @User = {} - "../Subscription/SubscriptionLocator": @SubscriptionLocator = {} + "../Subscription/SubscriptionUpdater": @SubscriptionUpdater = {} "settings-sharelatex": @Settings = {} 'logger-sharelatex': log:-> @@ -26,7 +26,7 @@ describe 'Referalallocator', -> @referal_source = "bonus" @User.update = sinon.stub().callsArgWith 3, null @User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id } - @ReferalAllocator.assignBonus = sinon.stub().callsArg 1 + @SubscriptionUpdater.refreshFeatures = sinon.stub().yields() @ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback it 'should update the referring user with the refered users id', -> @@ -44,8 +44,8 @@ describe 'Referalallocator', -> .calledWith( referal_id: @referal_id ) .should.equal true - it "shoudl assign the user their bonus", -> - @ReferalAllocator.assignBonus + it "should refresh the user's subscription", -> + @SubscriptionUpdater.refreshFeatures .calledWith(@user_id) .should.equal true @@ -57,7 +57,7 @@ describe 'Referalallocator', -> @referal_source = "public_share" @User.update = sinon.stub().callsArgWith 3, null @User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id } - @ReferalAllocator.assignBonus = sinon.stub().callsArg 1 + @SubscriptionUpdater.refreshFeatures = sinon.stub().yields() @ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback it 'should not update the referring user with the refered users id', -> @@ -69,118 +69,7 @@ describe 'Referalallocator', -> .should.equal true it "should not assign the user a bonus", -> - @ReferalAllocator.assignBonus.called.should.equal false + @SubscriptionUpdater.refreshFeatures.called.should.equal false it "should call the callback", -> @callback.called.should.equal true - - describe "assignBonus", -> - beforeEach -> - @refered_user_count = 3 - @Settings.bonus_features = - "3": - collaborators: 3 - dropbox: false - versioning: false - stubbedUser = { - refered_user_count: @refered_user_count, - features:{collaborators:1, dropbox:false, versioning:false} - } - - @User.findOne = sinon.stub().callsArgWith 1, null, stubbedUser - @User.update = sinon.stub().callsArgWith 2, null - @ReferalAllocator.assignBonus @user_id, @callback - - it "should get the users number of refered user", -> - @User.findOne - .calledWith(_id: @user_id) - .should.equal true - - it "should update the user to bonus features", -> - @User.update - .calledWith({ - _id: @user_id - }, { - $set: - features: - @Settings.bonus_features[@refered_user_count.toString()] - }) - .should.equal true - - it "should call the callback", -> - @callback.called.should.equal true - - describe "when there is nothing to assign", -> - - beforeEach -> - @ReferalAllocator._calculateBonuses = sinon.stub().returns({}) - @stubbedUser = - refered_user_count:4 - features:{collaborators:3, versioning:true, dropbox:false} - @Settings.bonus_features = - "4": - collaborators:3 - versioning:true - dropbox:false - @User.findOne = sinon.stub().callsArgWith 1, null, @stubbedUser - @User.update = sinon.stub().callsArgWith 2, null - - it "should not call update if there are no bonuses to apply", (done)-> - @ReferalAllocator.assignBonus @user_id, (err)=> - @User.update.called.should.equal false - done() - - describe "when the user has better features already", -> - - beforeEach -> - @refered_user_count = 3 - @stubbedUser = - refered_user_count:4 - features: - collaborators:3 - dropbox:false - versioning:false - @Settings.bonus_features = - "4": - collaborators: 10 - dropbox: true - versioning: false - - @User.findOne = sinon.stub().callsArgWith 1, null, @stubbedUser - @User.update = sinon.stub().callsArgWith 2, null - - it "should not set in in mongo when the feature is better", (done)-> - @ReferalAllocator.assignBonus @user_id, => - @User.update.calledWith({_id: @user_id }, {$set: features:{dropbox:true, versioning:false, collaborators:10} }).should.equal true - done() - - it "should not overright if the user has -1 users", (done)-> - @stubbedUser.features.collaborators = -1 - @ReferalAllocator.assignBonus @user_id, => - @User.update.calledWith({_id: @user_id }, {$set: features:{dropbox:true, versioning:false, collaborators:-1} }).should.equal true - done() - - describe "when the user is not at a bonus level", -> - beforeEach -> - @refered_user_count = 0 - @Settings.bonus_features = - "1": - collaborators: 3 - dropbox: false - versioning: false - @User.findOne = sinon.stub().callsArgWith 1, null, { refered_user_count: @refered_user_count } - @User.update = sinon.stub().callsArgWith 2, null - @ReferalAllocator.assignBonus @user_id, @callback - - it "should get the users number of refered user", -> - @User.findOne - .calledWith(_id: @user_id) - .should.equal true - - it "should not update the user to bonus features", -> - @User.update.called.should.equal false - - it "should call the callback", -> - @callback.called.should.equal true - - diff --git a/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee new file mode 100644 index 0000000000..dfa70f8ebe --- /dev/null +++ b/services/web/test/unit/coffee/Referal/ReferalFeaturesTests.coffee @@ -0,0 +1,65 @@ +SandboxedModule = require('sandboxed-module') +assert = require('assert') +require('chai').should() +sinon = require('sinon') +modulePath = require('path').join __dirname, '../../../../app/js/Features/Referal/ReferalFeatures.js' + +describe 'ReferalFeatures', -> + + beforeEach -> + @ReferalFeatures = SandboxedModule.require modulePath, requires: + '../../models/User': User: @User = {} + "settings-sharelatex": @Settings = {} + 'logger-sharelatex': + log:-> + err:-> + @callback = sinon.stub() + @referal_id = "referal-id-123" + @referal_medium = "twitter" + @user_id = "user-id-123" + @new_user_id = "new-user-id-123" + + describe "getBonusFeatures", -> + beforeEach -> + @refered_user_count = 3 + @Settings.bonus_features = + "3": + collaborators: 3 + dropbox: false + versioning: false + stubbedUser = { + refered_user_count: @refered_user_count, + features:{collaborators:1, dropbox:false, versioning:false} + } + + @User.findOne = sinon.stub().callsArgWith 1, null, stubbedUser + @ReferalFeatures.getBonusFeatures @user_id, @callback + + it "should get the users number of refered user", -> + @User.findOne + .calledWith(_id: @user_id) + .should.equal true + + it "should call the callback with the features", -> + @callback.calledWith(null, @Settings.bonus_features[3]).should.equal true + + describe "when the user is not at a bonus level", -> + beforeEach -> + @refered_user_count = 0 + @Settings.bonus_features = + "1": + collaborators: 3 + dropbox: false + versioning: false + @User.findOne = sinon.stub().callsArgWith 1, null, { refered_user_count: @refered_user_count } + @ReferalFeatures.getBonusFeatures @user_id, @callback + + it "should get the users number of refered user", -> + @User.findOne + .calledWith(_id: @user_id) + .should.equal true + + it "should call the callback with no features", -> + @callback.calledWith(null, {}).should.equal true + + diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee index 22f571ffa8..47301ecf7c 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee @@ -75,6 +75,7 @@ describe "SubscriptionController", -> "./SubscriptionDomainHandler":@SubscriptionDomainHandler "../User/UserGetter": @UserGetter "./RecurlyWrapper": @RecurlyWrapper = {} + "./SubscriptionUpdater": @SubscriptionUpdater = {} @res = new MockResponse() diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee index 93479a03a1..71ae6346ce 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee @@ -1,5 +1,6 @@ SandboxedModule = require('sandboxed-module') should = require('chai').should() +expect = require('chai').expect sinon = require 'sinon' modulePath = "../../../../app/js/Features/Subscription/SubscriptionUpdater" assert = require("chai").assert @@ -22,6 +23,7 @@ describe "SubscriptionUpdater", -> save: sinon.stub().callsArgWith(0) freeTrial:{} planCode:"student_or_something" + @user_id = @adminuser_id @groupSubscription = admin_id: @adminUser._id @@ -48,15 +50,15 @@ describe "SubscriptionUpdater", -> @Settings = freeTrialPlanCode: "collaborator" defaultPlanCode: "personal" + defaultFeatures: { "default": "features" } @UserFeaturesUpdater = - updateFeatures : sinon.stub().callsArgWith(2) + updateFeatures : sinon.stub().yields() @PlansLocator = findLocalPlanInSettings: sinon.stub().returns({}) - @ReferalAllocator = assignBonus:sinon.stub().callsArgWith(1) - @ReferalAllocator.cock = true + @ReferalFeatures = getBonusFeatures: sinon.stub().callsArgWith(1) @Modules = {hooks: {fire: sinon.stub().callsArgWith(2, null, null)}} @SubscriptionUpdater = SandboxedModule.require modulePath, requires: '../../models/Subscription': Subscription:@SubscriptionModel @@ -65,8 +67,9 @@ describe "SubscriptionUpdater", -> './PlansLocator': @PlansLocator "logger-sharelatex": log:-> 'settings-sharelatex': @Settings - "../Referal/ReferalAllocator" : @ReferalAllocator + "../Referal/ReferalFeatures" : @ReferalFeatures '../../infrastructure/Modules': @Modules + "./V1SubscriptionManager": @V1SubscriptionManager = {} describe "syncSubscription", -> @@ -97,7 +100,7 @@ describe "SubscriptionUpdater", -> describe "_updateSubscriptionFromRecurly", -> beforeEach -> - @SubscriptionUpdater._setUsersMinimumFeatures = sinon.stub().callsArgWith(1) + @SubscriptionUpdater.refreshFeatures = sinon.stub().callsArgWith(1) it "should update the subscription with token etc when not expired", (done)-> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> @@ -108,7 +111,7 @@ describe "SubscriptionUpdater", -> assert.equal(@subscription.freeTrial.expiresAt, undefined) assert.equal(@subscription.freeTrial.planCode, undefined) @subscription.save.called.should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true done() it "should remove the recurlySubscription_id when expired", (done)-> @@ -117,15 +120,15 @@ describe "SubscriptionUpdater", -> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> assert.equal(@subscription.recurlySubscription_id, undefined) @subscription.save.called.should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true done() it "should update all the users features", (done)-> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@allUserIds[0]).should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@allUserIds[1]).should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@allUserIds[2]).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@allUserIds[0]).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@allUserIds[1]).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@allUserIds[2]).should.equal true done() it "should set group to true and save how many members can be added to group", (done)-> @@ -168,7 +171,7 @@ describe "SubscriptionUpdater", -> describe "removeUserFromGroup", -> beforeEach -> - @SubscriptionUpdater._setUsersMinimumFeatures = sinon.stub().callsArgWith(1) + @SubscriptionUpdater.refreshFeatures = sinon.stub().callsArgWith(1) it "should pull the users id from the group", (done)-> @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, => @@ -181,70 +184,159 @@ describe "SubscriptionUpdater", -> it "should update the users features", (done)-> @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, => - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@otherUserId).should.equal true + @SubscriptionUpdater.refreshFeatures.calledWith(@otherUserId).should.equal true done() - describe "_setUsersMinimumFeatures", -> + describe "refreshFeatures", -> + beforeEach -> + @SubscriptionUpdater._getIndividualFeatures = sinon.stub().yields(null, { 'individual': 'features' }) + @SubscriptionUpdater._getGroupFeatureSets = sinon.stub().yields(null, [{ 'group': 'features' }, { 'group': 'features2' }]) + @SubscriptionUpdater._getV1Features = sinon.stub().yields(null, { 'v1': 'features' }) + @ReferalFeatures.getBonusFeatures = sinon.stub().yields(null, { 'bonus': 'features' }) + @SubscriptionUpdater._mergeFeatures = sinon.stub().returns({'merged': 'features'}) + @callback = sinon.stub() + @SubscriptionUpdater.refreshFeatures @user_id, @callback - it "should call updateFeatures with the subscription if set", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription) - @SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null) + it "should get the individual features", -> + @SubscriptionUpdater._getIndividualFeatures + .calledWith(@user_id) + .should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures @adminUser._id, (err)=> - args = @UserFeaturesUpdater.updateFeatures.args[0] - assert.equal args[0], @adminUser._id - assert.equal args[1], @subscription.planCode - done() + it "should get the group features", -> + @SubscriptionUpdater._getGroupFeatureSets + .calledWith(@user_id) + .should.equal true - it "should call updateFeatures with the group subscription if set", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null) - @SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null, @groupSubscription) + it "should get the v1 features", -> + @SubscriptionUpdater._getV1Features + .calledWith(@user_id) + .should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures @adminUser._id, (err)=> - args = @UserFeaturesUpdater.updateFeatures.args[0] - assert.equal args[0], @adminUser._id - assert.equal args[1], @groupSubscription.planCode - done() + it "should get the bonus features", -> + @ReferalFeatures.getBonusFeatures + .calledWith(@user_id) + .should.equal true - it "should call updateFeatures with the overleaf subscription if set", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null) - @SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null, null) - @Modules.hooks.fire = sinon.stub().callsArgWith(2, null, ['ol_pro']) + it "should merge from the default features", -> + @SubscriptionUpdater._mergeFeatures.calledWith(@Settings.defaultFeatures).should.equal true - @SubscriptionUpdater._setUsersMinimumFeatures @adminUser._id, (err)=> - args = @UserFeaturesUpdater.updateFeatures.args[0] - assert.equal args[0], @adminUser._id - assert.equal args[1], 'ol_pro' - done() + it "should merge the individual features", -> + @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'individual': 'features' }).should.equal true - it "should call not call updateFeatures with users subscription if the subscription plan code is the default one (downgraded)", (done)-> - @subscription.planCode = @Settings.defaultPlanCode - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription) - @SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null, @groupSubscription) - @Modules.hooks.fire = sinon.stub().callsArgWith(2, null, null) - @SubscriptionUpdater._setUsersMinimumFeatures @adminuser_id, (err)=> - args = @UserFeaturesUpdater.updateFeatures.args[0] - assert.equal args[0], @adminUser._id - assert.equal args[1], @groupSubscription.planCode - done() + it "should merge the group features", -> + @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'group': 'features' }).should.equal true + @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'group': 'features2' }).should.equal true + it "should merge the v1 features", -> + @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'v1': 'features' }).should.equal true - it "should call updateFeatures with default if there are no subscriptions for user", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null) - @SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null) - @Modules.hooks.fire = sinon.stub().callsArgWith(2, null, null) - @SubscriptionUpdater._setUsersMinimumFeatures @adminuser_id, (err)=> - args = @UserFeaturesUpdater.updateFeatures.args[0] - assert.equal args[0], @adminUser._id - assert.equal args[1], @Settings.defaultPlanCode - done() + it "should merge the bonus features", -> + @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'bonus': 'features' }).should.equal true - it "should call assignBonus", (done)-> - @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null) - @SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null) - @SubscriptionUpdater._setUsersMinimumFeatures @adminuser_id, (err)=> - @ReferalAllocator.assignBonus.calledWith(@adminuser_id).should.equal true - done() + it "should update the user with the merged features", -> + @UserFeaturesUpdater.updateFeatures + .calledWith(@user_id, {'merged': 'features'}) + .should.equal true + + describe "_mergeFeatures", -> + it "should prefer priority over standard for compileGroup", -> + expect(@SubscriptionUpdater._mergeFeatures({ + compileGroup: 'priority' + }, { + compileGroup: 'standard' + })).to.deep.equal({ + compileGroup: 'priority' + }) + expect(@SubscriptionUpdater._mergeFeatures({ + compileGroup: 'standard' + }, { + compileGroup: 'priority' + })).to.deep.equal({ + compileGroup: 'priority' + }) + expect(@SubscriptionUpdater._mergeFeatures({ + compileGroup: 'priority' + }, { + compileGroup: 'priority' + })).to.deep.equal({ + compileGroup: 'priority' + }) + expect(@SubscriptionUpdater._mergeFeatures({ + compileGroup: 'standard' + }, { + compileGroup: 'standard' + })).to.deep.equal({ + compileGroup: 'standard' + }) + + it "should prefer -1 over any other for collaborators", -> + expect(@SubscriptionUpdater._mergeFeatures({ + collaborators: -1 + }, { + collaborators: 10 + })).to.deep.equal({ + collaborators: -1 + }) + expect(@SubscriptionUpdater._mergeFeatures({ + collaborators: 10 + }, { + collaborators: -1 + })).to.deep.equal({ + collaborators: -1 + }) + expect(@SubscriptionUpdater._mergeFeatures({ + collaborators: 4 + }, { + collaborators: 10 + })).to.deep.equal({ + collaborators: 10 + }) + + it "should prefer the higher of compileTimeout", -> + expect(@SubscriptionUpdater._mergeFeatures({ + compileTimeout: 20 + }, { + compileTimeout: 10 + })).to.deep.equal({ + compileTimeout: 20 + }) + expect(@SubscriptionUpdater._mergeFeatures({ + compileTimeout: 10 + }, { + compileTimeout: 20 + })).to.deep.equal({ + compileTimeout: 20 + }) + + it "should prefer the true over false for other keys", -> + expect(@SubscriptionUpdater._mergeFeatures({ + github: true + }, { + github: false + })).to.deep.equal({ + github: true + }) + expect(@SubscriptionUpdater._mergeFeatures({ + github: false + }, { + github: true + })).to.deep.equal({ + github: true + }) + expect(@SubscriptionUpdater._mergeFeatures({ + github: true + }, { + github: true + })).to.deep.equal({ + github: true + }) + expect(@SubscriptionUpdater._mergeFeatures({ + github: false + }, { + github: false + })).to.deep.equal({ + github: false + }) describe "deleteSubscription", -> beforeEach (done) -> @@ -255,7 +347,7 @@ describe "SubscriptionUpdater", -> member_ids: [ ObjectId(), ObjectId(), ObjectId() ] } @SubscriptionLocator.getSubscription = sinon.stub().yields(null, @subscription) - @SubscriptionUpdater._setUsersMinimumFeatures = sinon.stub().yields() + @SubscriptionUpdater.refreshFeatures = sinon.stub().yields() @SubscriptionUpdater.deleteSubscription @subscription_id, done it "should look up the subscription", -> @@ -269,22 +361,12 @@ describe "SubscriptionUpdater", -> .should.equal true it "should downgrade the admin_id", -> - @SubscriptionUpdater._setUsersMinimumFeatures + @SubscriptionUpdater.refreshFeatures .calledWith(@subscription.admin_id) .should.equal true it "should downgrade all of the members", -> for user_id in @subscription.member_ids - @SubscriptionUpdater._setUsersMinimumFeatures + @SubscriptionUpdater.refreshFeatures .calledWith(user_id) .should.equal true - - describe 'refreshSubscription', -> - beforeEach -> - @SubscriptionUpdater._setUsersMinimumFeatures = sinon.stub() - .callsArgWith(1, null) - - it 'should call to _setUsersMinimumFeatures', -> - @SubscriptionUpdater.refreshSubscription(@adminUser._id, ()->) - @SubscriptionUpdater._setUsersMinimumFeatures.callCount.should.equal 1 - @SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true diff --git a/services/web/test/unit/coffee/Subscription/UserFeaturesUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/UserFeaturesUpdaterTests.coffee index d388d67c3b..1ba4e0b32f 100644 --- a/services/web/test/unit/coffee/Subscription/UserFeaturesUpdaterTests.coffee +++ b/services/web/test/unit/coffee/Subscription/UserFeaturesUpdaterTests.coffee @@ -4,31 +4,20 @@ sinon = require 'sinon' modulePath = "../../../../app/js/Features/Subscription/UserFeaturesUpdater" assert = require("chai").assert - describe "UserFeaturesUpdater", -> - beforeEach -> - @User = update: sinon.stub().callsArgWith(2) - - @PlansLocator = - findLocalPlanInSettings : sinon.stub() - @UserFeaturesUpdater = SandboxedModule.require modulePath, requires: '../../models/User': User:@User "logger-sharelatex": log:-> - './PlansLocator': @PlansLocator describe "updateFeatures", -> - it "should send the users features", (done)-> user_id = "5208dd34438842e2db000005" - plan_code = "student" - @features = features:{versioning:true, collaborators:10} - @PlansLocator.findLocalPlanInSettings = sinon.stub().returns(@features) - @UserFeaturesUpdater.updateFeatures user_id, plan_code, (err, features)=> + @features = {versioning:true, collaborators:10} + @UserFeaturesUpdater.updateFeatures user_id, @features, (err, features)=> update = {"features.versioning":true, "features.collaborators":10} @User.update.calledWith({"_id":user_id}, update).should.equal true - features.should.deep.equal @features.features + features.should.deep.equal @features done() \ No newline at end of file diff --git a/services/web/test/unit/coffee/Subscription/V1SusbcriptionManagerTests.coffee b/services/web/test/unit/coffee/Subscription/V1SusbcriptionManagerTests.coffee new file mode 100644 index 0000000000..ae6237e627 --- /dev/null +++ b/services/web/test/unit/coffee/Subscription/V1SusbcriptionManagerTests.coffee @@ -0,0 +1,128 @@ +should = require('chai').should() +SandboxedModule = require('sandboxed-module') +assert = require('assert') +path = require('path') +modulePath = path.join __dirname, '../../../../app/js/Features/Subscription/V1SubscriptionManager' +sinon = require("sinon") +expect = require("chai").expect + + +describe 'V1SubscriptionManager', -> + beforeEach -> + @V1SubscriptionManager = SandboxedModule.require modulePath, requires: + "../User/UserGetter": @UserGetter = {} + "logger-sharelatex": + log: sinon.stub() + err: sinon.stub() + warn: sinon.stub() + "settings-sharelatex": + overleaf: + host: @host = "http://overleaf.example.com" + "request": @request = sinon.stub() + @V1SubscriptionManager._v1PlanRequest = sinon.stub() + @userId = 'abcd' + @v1UserId = 42 + @user = + _id: @userId + email: 'user@example.com' + overleaf: + id: @v1UserId + + describe 'getPlanCodeFromV1', -> + beforeEach -> + @responseBody = + id: 32, + plan_name: 'pro' + @UserGetter.getUser = sinon.stub() + .yields(null, @user) + @V1SubscriptionManager._v1PlanRequest = sinon.stub() + .yields(null, @responseBody) + @call = (cb) => + @V1SubscriptionManager.getPlanCodeFromV1 @userId, cb + + describe 'when all goes well', -> + + it 'should call getUser', (done) -> + @call (err, planCode) => + expect( + @UserGetter.getUser.callCount + ).to.equal 1 + expect( + @UserGetter.getUser.calledWith(@userId) + ).to.equal true + done() + + it 'should call _v1PlanRequest', (done) -> + @call (err, planCode) => + expect( + @V1SubscriptionManager._v1PlanRequest.callCount + ).to.equal 1 + expect( + @V1SubscriptionManager._v1PlanRequest.calledWith( + @v1UserId + ) + ).to.equal true + done() + + it 'should produce a plan-code without error', (done) -> + @call (err, planCode) => + expect(err).to.not.exist + expect(planCode).to.equal 'v1_pro' + done() + + describe 'when the plan_name from v1 is null', -> + beforeEach -> + @responseBody.plan_name = null + + it 'should produce a null plan-code without error', (done) -> + @call (err, planCode) => + expect(err).to.not.exist + expect(planCode).to.equal null + done() + + describe 'when getUser produces an error', -> + beforeEach -> + @UserGetter.getUser = sinon.stub() + .yields(new Error('woops')) + + it 'should not call _v1PlanRequest', (done) -> + @call (err, planCode) => + expect( + @V1SubscriptionManager._v1PlanRequest.callCount + ).to.equal 0 + done() + + it 'should produce an error', (done) -> + @call (err, planCode) => + expect(err).to.exist + expect(planCode).to.not.exist + done() + + describe 'when getUser does not find a user', -> + beforeEach -> + @UserGetter.getUser = sinon.stub() + .yields(null, null) + + it 'should not call _v1PlanRequest', (done) -> + @call (err, planCode) => + expect( + @V1SubscriptionManager._v1PlanRequest.callCount + ).to.equal 0 + done() + + it 'should produce a null plan-code, without error', (done) -> + @call (err, planCode) => + expect(err).to.not.exist + expect(planCode).to.not.exist + done() + + describe 'when the request to v1 fails', -> + beforeEach -> + @V1SubscriptionManager._v1PlanRequest = sinon.stub() + .yields(new Error('woops')) + + it 'should produce an error', (done) -> + @call (err, planCode) => + expect(err).to.exist + expect(planCode).to.not.exist + done() From 50bd60dd51fb483330d1ca52f0056e9e2b783166 Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 21 May 2018 15:06:01 +0100 Subject: [PATCH 75/87] Split FeaturesUpdater out of SubscriptionUpdater --- .../Subscription/FeaturesUpdater.coffee | 83 ++++++++ .../SubscriptionController.coffee | 4 +- .../Subscription/SubscriptionUpdater.coffee | 88 +-------- .../acceptance/config/settings.test.coffee | 6 - .../Subscription/FeaturesUpdaterTests.coffee | 173 ++++++++++++++++ .../SubscriptionControllerTests.coffee | 2 +- .../SubscriptionUpdaterTests.coffee | 184 ++---------------- 7 files changed, 284 insertions(+), 256 deletions(-) create mode 100644 services/web/app/coffee/Features/Subscription/FeaturesUpdater.coffee create mode 100644 services/web/test/unit/coffee/Subscription/FeaturesUpdaterTests.coffee diff --git a/services/web/app/coffee/Features/Subscription/FeaturesUpdater.coffee b/services/web/app/coffee/Features/Subscription/FeaturesUpdater.coffee new file mode 100644 index 0000000000..5c176c611f --- /dev/null +++ b/services/web/app/coffee/Features/Subscription/FeaturesUpdater.coffee @@ -0,0 +1,83 @@ +async = require("async") +PlansLocator = require("./PlansLocator") +_ = require("underscore") +SubscriptionLocator = require("./SubscriptionLocator") +UserFeaturesUpdater = require("./UserFeaturesUpdater") +Settings = require("settings-sharelatex") +logger = require("logger-sharelatex") +ReferalFeatures = require("../Referal/ReferalFeatures") +V1SubscriptionManager = require("./V1SubscriptionManager") + +oneMonthInSeconds = 60 * 60 * 24 * 30 + +module.exports = FeaturesUpdater = + refreshFeatures: (user_id, callback)-> + jobs = + individualFeatures: (cb) -> FeaturesUpdater._getIndividualFeatures user_id, cb + groupFeatureSets: (cb) -> FeaturesUpdater._getGroupFeatureSets user_id, cb + v1Features: (cb) -> FeaturesUpdater._getV1Features user_id, cb + bonusFeatures: (cb) -> ReferalFeatures.getBonusFeatures user_id, cb + async.series jobs, (err, results)-> + if err? + logger.err err:err, user_id:user_id, + "error getting subscription or group for refreshFeatures" + return callback(err) + + {individualFeatures, groupFeatureSets, v1Features, bonusFeatures} = results + logger.log {user_id, individualFeatures, groupFeatureSets, v1Features, bonusFeatures}, 'merging user features' + featureSets = groupFeatureSets.concat [individualFeatures, v1Features, bonusFeatures] + features = _.reduce(featureSets, FeaturesUpdater._mergeFeatures, Settings.defaultFeatures) + + logger.log {user_id, features}, 'updating user features' + UserFeaturesUpdater.updateFeatures user_id, features, callback + + _getIndividualFeatures: (user_id, callback = (error, features = {}) ->) -> + SubscriptionLocator.getUsersSubscription user_id, (err, sub)-> + callback err, FeaturesUpdater._subscriptionToFeatures(sub) + + _getGroupFeatureSets: (user_id, callback = (error, featureSets = []) ->) -> + SubscriptionLocator.getGroupSubscriptionsMemberOf user_id, (err, subs) -> + callback err, (subs or []).map FeaturesUpdater._subscriptionToFeatures + + _getV1Features: (user_id, callback = (error, features = {}) ->) -> + V1SubscriptionManager.getPlanCodeFromV1 user_id, (err, planCode) -> + callback err, FeaturesUpdater._planCodeToFeatures(planCode) + + _mergeFeatures: (featuresA, featuresB) -> + features = Object.assign({}, featuresA) + for key, value of featuresB + # Special merging logic for non-boolean features + if key == 'compileGroup' + if features['compileGroup'] == 'priority' or featuresB['compileGroup'] == 'priority' + features['compileGroup'] = 'priority' + else + features['compileGroup'] = 'standard' + else if key == 'collaborators' + if features['collaborators'] == -1 or featuresB['collaborators'] == -1 + features['collaborators'] = -1 + else + features['collaborators'] = Math.max( + features['collaborators'] or 0, + featuresB['collaborators'] or 0 + ) + else if key == 'compileTimeout' + features['compileTimeout'] = Math.max( + features['compileTimeout'] or 0, + featuresB['compileTimeout'] or 0 + ) + else + # Boolean keys, true is better + features[key] = features[key] or featuresB[key] + return features + + _subscriptionToFeatures: (subscription) -> + FeaturesUpdater._planCodeToFeatures(subscription?.planCode) + + _planCodeToFeatures: (planCode) -> + if !planCode? + return {} + plan = PlansLocator.findLocalPlanInSettings planCode + if !plan? + return {} + else + return plan.features \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee index f127f7ed35..32d2abf594 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee @@ -9,7 +9,7 @@ logger = require('logger-sharelatex') GeoIpLookup = require("../../infrastructure/GeoIpLookup") SubscriptionDomainHandler = require("./SubscriptionDomainHandler") UserGetter = require "../User/UserGetter" -SubscriptionUpdater = require './SubscriptionUpdater' +FeaturesUpdater = require './FeaturesUpdater' module.exports = SubscriptionController = @@ -241,6 +241,6 @@ module.exports = SubscriptionController = refreshUserFeatures: (req, res, next) -> {user_id} = req.params - SubscriptionUpdater.refreshFeatures user_id, (error) -> + FeaturesUpdater.refreshFeatures user_id, (error) -> return next(error) if error? res.sendStatus 200 \ No newline at end of file diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee index 8e583bd07b..cb5c39d122 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionUpdater.coffee @@ -2,27 +2,26 @@ async = require("async") _ = require("underscore") Subscription = require('../../models/Subscription').Subscription SubscriptionLocator = require("./SubscriptionLocator") -UserFeaturesUpdater = require("./UserFeaturesUpdater") PlansLocator = require("./PlansLocator") Settings = require("settings-sharelatex") logger = require("logger-sharelatex") -ObjectId = require('mongoose').Types.ObjectId -ReferalFeatures = require("../Referal/ReferalFeatures") -V1SubscriptionManager = require("./V1SubscriptionManager") +ObjectId = require('mongoose').Types.ObjectId +FeaturesUpdater = require('./FeaturesUpdater') oneMonthInSeconds = 60 * 60 * 24 * 30 module.exports = SubscriptionUpdater = - syncSubscription: (recurlySubscription, adminUser_id, callback) -> logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "syncSubscription, creating new if subscription does not exist" SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)-> + return callback(err) if err? if subscription? logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does exist" SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback else logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does not exist, creating a new one" SubscriptionUpdater._createNewSubscription adminUser_id, (err, subscription)-> + return callback(err) if err? SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback addUserToGroup: (adminUser_id, user_id, callback)-> @@ -35,7 +34,7 @@ module.exports = SubscriptionUpdater = if err? logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group" return callback(err) - UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback + FeaturesUpdater.refreshFeatures user_id, callback addEmailInviteToGroup: (adminUser_id, email, callback) -> logger.log {adminUser_id, email}, "adding email into mongo subscription" @@ -54,7 +53,7 @@ module.exports = SubscriptionUpdater = if err? logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from group" return callback(err) - SubscriptionUpdater.refreshFeatures user_id, callback + FeaturesUpdater.refreshFeatures user_id, callback removeEmailInviteFromGroup: (adminUser_id, email, callback)-> Subscription.update { @@ -70,7 +69,7 @@ module.exports = SubscriptionUpdater = logger.log {subscription_id, affected_user_ids}, "deleting subscription and downgrading users" Subscription.remove {_id: ObjectId(subscription_id)}, (err) -> return callback(err) if err? - async.mapSeries affected_user_ids, SubscriptionUpdater.refreshFeatures, callback + async.mapSeries affected_user_ids, FeaturesUpdater.refreshFeatures, callback _createNewSubscription: (adminUser_id, callback)-> logger.log adminUser_id:adminUser_id, "creating new subscription" @@ -98,76 +97,5 @@ module.exports = SubscriptionUpdater = allIds = _.union subscription.member_ids, [subscription.admin_id] jobs = allIds.map (user_id)-> return (cb)-> - SubscriptionUpdater.refreshFeatures user_id, cb + FeaturesUpdater.refreshFeatures user_id, cb async.series jobs, callback - - refreshFeatures: (user_id, callback)-> - jobs = - individualFeatures: (cb) -> SubscriptionUpdater._getIndividualFeatures user_id, cb - groupFeatureSets: (cb) -> SubscriptionUpdater._getGroupFeatureSets user_id, cb - v1Features: (cb) -> SubscriptionUpdater._getV1Features user_id, cb - bonusFeatures: (cb) -> ReferalFeatures.getBonusFeatures user_id, cb - async.series jobs, (err, results)-> - if err? - logger.err err:err, user_id:user_id, - "error getting subscription or group for refreshFeatures" - return callback(err) - - {individualFeatures, groupFeatureSets, v1Features, bonusFeatures} = results - logger.log {user_id, individualFeatures, groupFeatureSets, v1Features, bonusFeatures}, 'merging user features' - featureSets = groupFeatureSets.concat [individualFeatures, v1Features, bonusFeatures] - features = _.reduce(featureSets, SubscriptionUpdater._mergeFeatures, Settings.defaultFeatures) - - logger.log {user_id, features}, 'updating user features' - UserFeaturesUpdater.updateFeatures user_id, features, callback - - _getIndividualFeatures: (user_id, callback = (error, features = {}) ->) -> - SubscriptionLocator.getUsersSubscription user_id, (err, sub)-> - callback err, SubscriptionUpdater._subscriptionToFeatures(sub) - - _getGroupFeatureSets: (user_id, callback = (error, featureSets = []) ->) -> - SubscriptionLocator.getGroupSubscriptionsMemberOf user_id, (err, subs) -> - callback err, (subs or []).map SubscriptionUpdater._subscriptionToFeatures - - _getV1Features: (user_id, callback = (error, features = {}) ->) -> - V1SubscriptionManager.getPlanCodeFromV1 user_id, (err, planCode) -> - callback err, SubscriptionUpdater._planCodeToFeatures(planCode) - - _mergeFeatures: (featuresA, featuresB) -> - features = Object.assign({}, featuresA) - for key, value of featuresB - # Special merging logic for non-boolean features - if key == 'compileGroup' - if features['compileGroup'] == 'priority' or featuresB['compileGroup'] == 'priority' - features['compileGroup'] = 'priority' - else - features['compileGroup'] = 'standard' - else if key == 'collaborators' - if features['collaborators'] == -1 or featuresB['collaborators'] == -1 - features['collaborators'] = -1 - else - features['collaborators'] = Math.max( - features['collaborators'] or 0, - featuresB['collaborators'] or 0 - ) - else if key == 'compileTimeout' - features['compileTimeout'] = Math.max( - features['compileTimeout'] or 0, - featuresB['compileTimeout'] or 0 - ) - else - # Boolean keys, true is better - features[key] = features[key] or featuresB[key] - return features - - _subscriptionToFeatures: (subscription) -> - SubscriptionUpdater._planCodeToFeatures(subscription?.planCode) - - _planCodeToFeatures: (planCode) -> - if !planCode? - return {} - plan = PlansLocator.findLocalPlanInSettings planCode - if !plan? - return {} - else - return plan.features \ No newline at end of file diff --git a/services/web/test/acceptance/config/settings.test.coffee b/services/web/test/acceptance/config/settings.test.coffee index 1bcb7426ff..3d665f8a54 100644 --- a/services/web/test/acceptance/config/settings.test.coffee +++ b/services/web/test/acceptance/config/settings.test.coffee @@ -1,10 +1,4 @@ module.exports = - apis: - v1: - url: "http://localhost:5000" - user: 'overleaf' - pass: 'password' - enableSubscriptions: true features: features = diff --git a/services/web/test/unit/coffee/Subscription/FeaturesUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/FeaturesUpdaterTests.coffee new file mode 100644 index 0000000000..c8f77bfd40 --- /dev/null +++ b/services/web/test/unit/coffee/Subscription/FeaturesUpdaterTests.coffee @@ -0,0 +1,173 @@ +SandboxedModule = require('sandboxed-module') +should = require('chai').should() +expect = require('chai').expect +sinon = require 'sinon' +modulePath = "../../../../app/js/Features/Subscription/FeaturesUpdater" +assert = require("chai").assert +ObjectId = require('mongoose').Types.ObjectId + +describe "FeaturesUpdater", -> + + beforeEach -> + @user_id = ObjectId().toString() + + @FeaturesUpdater = SandboxedModule.require modulePath, requires: + './UserFeaturesUpdater': @UserFeaturesUpdater = {} + './SubscriptionLocator': @SubscriptionLocator = {} + './PlansLocator': @PlansLocator = {} + "logger-sharelatex": log:-> + 'settings-sharelatex': @Settings = {} + "../Referal/ReferalFeatures" : @ReferalFeatures = {} + "./V1SubscriptionManager": @V1SubscriptionManager = {} + + describe "refreshFeatures", -> + beforeEach -> + @UserFeaturesUpdater.updateFeatures = sinon.stub().yields() + @FeaturesUpdater._getIndividualFeatures = sinon.stub().yields(null, { 'individual': 'features' }) + @FeaturesUpdater._getGroupFeatureSets = sinon.stub().yields(null, [{ 'group': 'features' }, { 'group': 'features2' }]) + @FeaturesUpdater._getV1Features = sinon.stub().yields(null, { 'v1': 'features' }) + @ReferalFeatures.getBonusFeatures = sinon.stub().yields(null, { 'bonus': 'features' }) + @FeaturesUpdater._mergeFeatures = sinon.stub().returns({'merged': 'features'}) + @callback = sinon.stub() + @FeaturesUpdater.refreshFeatures @user_id, @callback + + it "should get the individual features", -> + @FeaturesUpdater._getIndividualFeatures + .calledWith(@user_id) + .should.equal true + + it "should get the group features", -> + @FeaturesUpdater._getGroupFeatureSets + .calledWith(@user_id) + .should.equal true + + it "should get the v1 features", -> + @FeaturesUpdater._getV1Features + .calledWith(@user_id) + .should.equal true + + it "should get the bonus features", -> + @ReferalFeatures.getBonusFeatures + .calledWith(@user_id) + .should.equal true + + it "should merge from the default features", -> + @FeaturesUpdater._mergeFeatures.calledWith(@Settings.defaultFeatures).should.equal true + + it "should merge the individual features", -> + @FeaturesUpdater._mergeFeatures.calledWith(sinon.match.any, { 'individual': 'features' }).should.equal true + + it "should merge the group features", -> + @FeaturesUpdater._mergeFeatures.calledWith(sinon.match.any, { 'group': 'features' }).should.equal true + @FeaturesUpdater._mergeFeatures.calledWith(sinon.match.any, { 'group': 'features2' }).should.equal true + + it "should merge the v1 features", -> + @FeaturesUpdater._mergeFeatures.calledWith(sinon.match.any, { 'v1': 'features' }).should.equal true + + it "should merge the bonus features", -> + @FeaturesUpdater._mergeFeatures.calledWith(sinon.match.any, { 'bonus': 'features' }).should.equal true + + it "should update the user with the merged features", -> + @UserFeaturesUpdater.updateFeatures + .calledWith(@user_id, {'merged': 'features'}) + .should.equal true + + describe "_mergeFeatures", -> + it "should prefer priority over standard for compileGroup", -> + expect(@FeaturesUpdater._mergeFeatures({ + compileGroup: 'priority' + }, { + compileGroup: 'standard' + })).to.deep.equal({ + compileGroup: 'priority' + }) + expect(@FeaturesUpdater._mergeFeatures({ + compileGroup: 'standard' + }, { + compileGroup: 'priority' + })).to.deep.equal({ + compileGroup: 'priority' + }) + expect(@FeaturesUpdater._mergeFeatures({ + compileGroup: 'priority' + }, { + compileGroup: 'priority' + })).to.deep.equal({ + compileGroup: 'priority' + }) + expect(@FeaturesUpdater._mergeFeatures({ + compileGroup: 'standard' + }, { + compileGroup: 'standard' + })).to.deep.equal({ + compileGroup: 'standard' + }) + + it "should prefer -1 over any other for collaborators", -> + expect(@FeaturesUpdater._mergeFeatures({ + collaborators: -1 + }, { + collaborators: 10 + })).to.deep.equal({ + collaborators: -1 + }) + expect(@FeaturesUpdater._mergeFeatures({ + collaborators: 10 + }, { + collaborators: -1 + })).to.deep.equal({ + collaborators: -1 + }) + expect(@FeaturesUpdater._mergeFeatures({ + collaborators: 4 + }, { + collaborators: 10 + })).to.deep.equal({ + collaborators: 10 + }) + + it "should prefer the higher of compileTimeout", -> + expect(@FeaturesUpdater._mergeFeatures({ + compileTimeout: 20 + }, { + compileTimeout: 10 + })).to.deep.equal({ + compileTimeout: 20 + }) + expect(@FeaturesUpdater._mergeFeatures({ + compileTimeout: 10 + }, { + compileTimeout: 20 + })).to.deep.equal({ + compileTimeout: 20 + }) + + it "should prefer the true over false for other keys", -> + expect(@FeaturesUpdater._mergeFeatures({ + github: true + }, { + github: false + })).to.deep.equal({ + github: true + }) + expect(@FeaturesUpdater._mergeFeatures({ + github: false + }, { + github: true + })).to.deep.equal({ + github: true + }) + expect(@FeaturesUpdater._mergeFeatures({ + github: true + }, { + github: true + })).to.deep.equal({ + github: true + }) + expect(@FeaturesUpdater._mergeFeatures({ + github: false + }, { + github: false + })).to.deep.equal({ + github: false + }) diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee index 47301ecf7c..04888e2dd7 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionControllerTests.coffee @@ -75,7 +75,7 @@ describe "SubscriptionController", -> "./SubscriptionDomainHandler":@SubscriptionDomainHandler "../User/UserGetter": @UserGetter "./RecurlyWrapper": @RecurlyWrapper = {} - "./SubscriptionUpdater": @SubscriptionUpdater = {} + "./FeaturesUpdater": @FeaturesUpdater = {} @res = new MockResponse() diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee index 71ae6346ce..dd2afad56b 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionUpdaterTests.coffee @@ -67,9 +67,7 @@ describe "SubscriptionUpdater", -> './PlansLocator': @PlansLocator "logger-sharelatex": log:-> 'settings-sharelatex': @Settings - "../Referal/ReferalFeatures" : @ReferalFeatures - '../../infrastructure/Modules': @Modules - "./V1SubscriptionManager": @V1SubscriptionManager = {} + "./FeaturesUpdater": @FeaturesUpdater = {} describe "syncSubscription", -> @@ -100,7 +98,7 @@ describe "SubscriptionUpdater", -> describe "_updateSubscriptionFromRecurly", -> beforeEach -> - @SubscriptionUpdater.refreshFeatures = sinon.stub().callsArgWith(1) + @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1) it "should update the subscription with token etc when not expired", (done)-> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> @@ -111,7 +109,7 @@ describe "SubscriptionUpdater", -> assert.equal(@subscription.freeTrial.expiresAt, undefined) assert.equal(@subscription.freeTrial.planCode, undefined) @subscription.save.called.should.equal true - @SubscriptionUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true done() it "should remove the recurlySubscription_id when expired", (done)-> @@ -120,15 +118,15 @@ describe "SubscriptionUpdater", -> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> assert.equal(@subscription.recurlySubscription_id, undefined) @subscription.save.called.should.equal true - @SubscriptionUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true done() it "should update all the users features", (done)-> @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=> - @SubscriptionUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true - @SubscriptionUpdater.refreshFeatures.calledWith(@allUserIds[0]).should.equal true - @SubscriptionUpdater.refreshFeatures.calledWith(@allUserIds[1]).should.equal true - @SubscriptionUpdater.refreshFeatures.calledWith(@allUserIds[2]).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@allUserIds[0]).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@allUserIds[1]).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@allUserIds[2]).should.equal true done() it "should set group to true and save how many members can be added to group", (done)-> @@ -155,6 +153,9 @@ describe "SubscriptionUpdater", -> done() describe "addUserToGroup", -> + beforeEach -> + @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1) + it "should add the users id to the group as a set", (done)-> @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, => searchOps = @@ -166,12 +167,12 @@ describe "SubscriptionUpdater", -> it "should update the users features", (done)-> @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, => - @UserFeaturesUpdater.updateFeatures.calledWith(@otherUserId, @subscription.planCode).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@otherUserId).should.equal true done() describe "removeUserFromGroup", -> beforeEach -> - @SubscriptionUpdater.refreshFeatures = sinon.stub().callsArgWith(1) + @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1) it "should pull the users id from the group", (done)-> @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, => @@ -184,160 +185,9 @@ describe "SubscriptionUpdater", -> it "should update the users features", (done)-> @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, => - @SubscriptionUpdater.refreshFeatures.calledWith(@otherUserId).should.equal true + @FeaturesUpdater.refreshFeatures.calledWith(@otherUserId).should.equal true done() - describe "refreshFeatures", -> - beforeEach -> - @SubscriptionUpdater._getIndividualFeatures = sinon.stub().yields(null, { 'individual': 'features' }) - @SubscriptionUpdater._getGroupFeatureSets = sinon.stub().yields(null, [{ 'group': 'features' }, { 'group': 'features2' }]) - @SubscriptionUpdater._getV1Features = sinon.stub().yields(null, { 'v1': 'features' }) - @ReferalFeatures.getBonusFeatures = sinon.stub().yields(null, { 'bonus': 'features' }) - @SubscriptionUpdater._mergeFeatures = sinon.stub().returns({'merged': 'features'}) - @callback = sinon.stub() - @SubscriptionUpdater.refreshFeatures @user_id, @callback - - it "should get the individual features", -> - @SubscriptionUpdater._getIndividualFeatures - .calledWith(@user_id) - .should.equal true - - it "should get the group features", -> - @SubscriptionUpdater._getGroupFeatureSets - .calledWith(@user_id) - .should.equal true - - it "should get the v1 features", -> - @SubscriptionUpdater._getV1Features - .calledWith(@user_id) - .should.equal true - - it "should get the bonus features", -> - @ReferalFeatures.getBonusFeatures - .calledWith(@user_id) - .should.equal true - - it "should merge from the default features", -> - @SubscriptionUpdater._mergeFeatures.calledWith(@Settings.defaultFeatures).should.equal true - - it "should merge the individual features", -> - @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'individual': 'features' }).should.equal true - - it "should merge the group features", -> - @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'group': 'features' }).should.equal true - @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'group': 'features2' }).should.equal true - - it "should merge the v1 features", -> - @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'v1': 'features' }).should.equal true - - it "should merge the bonus features", -> - @SubscriptionUpdater._mergeFeatures.calledWith(sinon.match.any, { 'bonus': 'features' }).should.equal true - - it "should update the user with the merged features", -> - @UserFeaturesUpdater.updateFeatures - .calledWith(@user_id, {'merged': 'features'}) - .should.equal true - - describe "_mergeFeatures", -> - it "should prefer priority over standard for compileGroup", -> - expect(@SubscriptionUpdater._mergeFeatures({ - compileGroup: 'priority' - }, { - compileGroup: 'standard' - })).to.deep.equal({ - compileGroup: 'priority' - }) - expect(@SubscriptionUpdater._mergeFeatures({ - compileGroup: 'standard' - }, { - compileGroup: 'priority' - })).to.deep.equal({ - compileGroup: 'priority' - }) - expect(@SubscriptionUpdater._mergeFeatures({ - compileGroup: 'priority' - }, { - compileGroup: 'priority' - })).to.deep.equal({ - compileGroup: 'priority' - }) - expect(@SubscriptionUpdater._mergeFeatures({ - compileGroup: 'standard' - }, { - compileGroup: 'standard' - })).to.deep.equal({ - compileGroup: 'standard' - }) - - it "should prefer -1 over any other for collaborators", -> - expect(@SubscriptionUpdater._mergeFeatures({ - collaborators: -1 - }, { - collaborators: 10 - })).to.deep.equal({ - collaborators: -1 - }) - expect(@SubscriptionUpdater._mergeFeatures({ - collaborators: 10 - }, { - collaborators: -1 - })).to.deep.equal({ - collaborators: -1 - }) - expect(@SubscriptionUpdater._mergeFeatures({ - collaborators: 4 - }, { - collaborators: 10 - })).to.deep.equal({ - collaborators: 10 - }) - - it "should prefer the higher of compileTimeout", -> - expect(@SubscriptionUpdater._mergeFeatures({ - compileTimeout: 20 - }, { - compileTimeout: 10 - })).to.deep.equal({ - compileTimeout: 20 - }) - expect(@SubscriptionUpdater._mergeFeatures({ - compileTimeout: 10 - }, { - compileTimeout: 20 - })).to.deep.equal({ - compileTimeout: 20 - }) - - it "should prefer the true over false for other keys", -> - expect(@SubscriptionUpdater._mergeFeatures({ - github: true - }, { - github: false - })).to.deep.equal({ - github: true - }) - expect(@SubscriptionUpdater._mergeFeatures({ - github: false - }, { - github: true - })).to.deep.equal({ - github: true - }) - expect(@SubscriptionUpdater._mergeFeatures({ - github: true - }, { - github: true - })).to.deep.equal({ - github: true - }) - expect(@SubscriptionUpdater._mergeFeatures({ - github: false - }, { - github: false - })).to.deep.equal({ - github: false - }) - describe "deleteSubscription", -> beforeEach (done) -> @subscription_id = ObjectId().toString() @@ -347,7 +197,7 @@ describe "SubscriptionUpdater", -> member_ids: [ ObjectId(), ObjectId(), ObjectId() ] } @SubscriptionLocator.getSubscription = sinon.stub().yields(null, @subscription) - @SubscriptionUpdater.refreshFeatures = sinon.stub().yields() + @FeaturesUpdater.refreshFeatures = sinon.stub().yields() @SubscriptionUpdater.deleteSubscription @subscription_id, done it "should look up the subscription", -> @@ -361,12 +211,12 @@ describe "SubscriptionUpdater", -> .should.equal true it "should downgrade the admin_id", -> - @SubscriptionUpdater.refreshFeatures + @FeaturesUpdater.refreshFeatures .calledWith(@subscription.admin_id) .should.equal true it "should downgrade all of the members", -> for user_id in @subscription.member_ids - @SubscriptionUpdater.refreshFeatures + @FeaturesUpdater.refreshFeatures .calledWith(user_id) .should.equal true From 1d0be569a6cd8db44a38047433ad8a60fd80686d Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 21 May 2018 17:50:49 +0100 Subject: [PATCH 76/87] Fix SubscriptionUpdater -> FeaturesUpdater miscall --- .../coffee/Features/Referal/ReferalAllocator.coffee | 4 ++-- .../unit/coffee/Referal/ReferalAllocatorTests.coffee | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee b/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee index 3344747968..53d3696807 100644 --- a/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee +++ b/services/web/app/coffee/Features/Referal/ReferalAllocator.coffee @@ -2,7 +2,7 @@ _ = require("underscore") logger = require('logger-sharelatex') User = require('../../models/User').User Settings = require "settings-sharelatex" -SubscriptionUpdater = require "../Subscription/SubscriptionUpdater" +FeaturesUpdater = require "../Subscription/FeaturesUpdater" module.exports = ReferalAllocator = allocate: (referal_id, new_user_id, referal_source, referal_medium, callback = ->)-> @@ -25,6 +25,6 @@ module.exports = ReferalAllocator = if err? logger.err err:err, referal_id:referal_id, new_user_id:new_user_id, "something went wrong allocating referal" return callback(err) - SubscriptionUpdater.refreshFeatures user._id, callback + FeaturesUpdater.refreshFeatures user._id, callback else callback() diff --git a/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee b/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee index ef0f0243c8..308c2ce80e 100644 --- a/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee +++ b/services/web/test/unit/coffee/Referal/ReferalAllocatorTests.coffee @@ -9,7 +9,7 @@ describe 'ReferalAllocator', -> beforeEach -> @ReferalAllocator = SandboxedModule.require modulePath, requires: '../../models/User': User: @User = {} - "../Subscription/SubscriptionUpdater": @SubscriptionUpdater = {} + "../Subscription/FeaturesUpdater": @FeaturesUpdater = {} "settings-sharelatex": @Settings = {} 'logger-sharelatex': log:-> @@ -26,7 +26,7 @@ describe 'ReferalAllocator', -> @referal_source = "bonus" @User.update = sinon.stub().callsArgWith 3, null @User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id } - @SubscriptionUpdater.refreshFeatures = sinon.stub().yields() + @FeaturesUpdater.refreshFeatures = sinon.stub().yields() @ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback it 'should update the referring user with the refered users id', -> @@ -45,7 +45,7 @@ describe 'ReferalAllocator', -> .should.equal true it "should refresh the user's subscription", -> - @SubscriptionUpdater.refreshFeatures + @FeaturesUpdater.refreshFeatures .calledWith(@user_id) .should.equal true @@ -57,7 +57,7 @@ describe 'ReferalAllocator', -> @referal_source = "public_share" @User.update = sinon.stub().callsArgWith 3, null @User.findOne = sinon.stub().callsArgWith 1, null, { _id: @user_id } - @SubscriptionUpdater.refreshFeatures = sinon.stub().yields() + @FeaturesUpdater.refreshFeatures = sinon.stub().yields() @ReferalAllocator.allocate @referal_id, @new_user_id, @referal_source, @referal_medium, @callback it 'should not update the referring user with the refered users id', -> @@ -69,7 +69,7 @@ describe 'ReferalAllocator', -> .should.equal true it "should not assign the user a bonus", -> - @SubscriptionUpdater.refreshFeatures.called.should.equal false + @FeaturesUpdater.refreshFeatures.called.should.equal false it "should call the callback", -> @callback.called.should.equal true From 701a803da73eb4c72382f72780ae1f603e2b267d Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 22 May 2018 10:19:47 +0100 Subject: [PATCH 77/87] Fix ProjectInvite tests since the user no longer had the features --- .../web/test/acceptance/coffee/ProjectInviteTests.coffee | 7 ++++--- services/web/test/acceptance/coffee/helpers/User.coffee | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/web/test/acceptance/coffee/ProjectInviteTests.coffee b/services/web/test/acceptance/coffee/ProjectInviteTests.coffee index b599578738..02598b320f 100644 --- a/services/web/test/acceptance/coffee/ProjectInviteTests.coffee +++ b/services/web/test/acceptance/coffee/ProjectInviteTests.coffee @@ -16,6 +16,7 @@ createInvite = (sendingUser, projectId, email, callback=(err, invite)->) -> privileges: 'readAndWrite' }, (err, response, body) -> return callback(err) if err + expect(response.statusCode).to.equal 200 callback(null, body.invite) createProject = (owner, projectName, callback=(err, projectId, project)->) -> @@ -207,9 +208,9 @@ describe "ProjectInviteTests", -> @email = 'smoketestuser@example.com' @projectName = 'sharing test' Async.series [ - (cb) => @user.login cb - (cb) => @user.logout cb + (cb) => @user.ensureUserExists cb (cb) => @sendingUser.login cb + (cb) => @sendingUser.setFeatures { collaborators: 10 }, cb ], done describe 'creating invites', -> @@ -266,7 +267,7 @@ describe "ProjectInviteTests", -> (cb) => expectInvitesInJoinProjectCount @sendingUser, @projectId, 0, cb ], done - it 'should allow the project owner to many invites at once', (done) -> + it 'should allow the project owner to create many invites at once', (done) -> @inviteOne = null @inviteTwo = null Async.series [ diff --git a/services/web/test/acceptance/coffee/helpers/User.coffee b/services/web/test/acceptance/coffee/helpers/User.coffee index 7d8e9086d4..a02ab5c42c 100644 --- a/services/web/test/acceptance/coffee/helpers/User.coffee +++ b/services/web/test/acceptance/coffee/helpers/User.coffee @@ -40,6 +40,12 @@ class User @referal_id = user?.referal_id callback(null, @password) + setFeatures: (features, callback = (error) ->) -> + update = {} + for key, value of features + update["features.#{key}"] = value + UserModel.update { _id: @id }, update, callback + logout: (callback = (error) ->) -> @getCsrfToken (error) => return callback(error) if error? From 2ff5ecb342a6d97771bf2b4cee462894e543faf5 Mon Sep 17 00:00:00 2001 From: James Allen Date: Tue, 22 May 2018 16:59:59 +0100 Subject: [PATCH 78/87] Use intelligent /user/trial v2 URL for v2 trials --- services/web/app/views/layout.pug | 3 ++- services/web/public/coffee/main/account-upgrade.coffee | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/services/web/app/views/layout.pug b/services/web/app/views/layout.pug index c8140d24b2..4dfdbc3ae7 100644 --- a/services/web/app/views/layout.pug +++ b/services/web/app/views/layout.pug @@ -98,7 +98,8 @@ html(itemscope, itemtype='http://schema.org/Product') - if (settings.overleaf && settings.overleaf.useOLFreeTrial) script. - window.redirectToOLFreeTrialUrl = '!{settings.overleaf.host}/users/trial' + window.useV2TrialUrl = true + body if(settings.recaptcha) diff --git a/services/web/public/coffee/main/account-upgrade.coffee b/services/web/public/coffee/main/account-upgrade.coffee index 638371e45e..f2f67ea13d 100644 --- a/services/web/public/coffee/main/account-upgrade.coffee +++ b/services/web/public/coffee/main/account-upgrade.coffee @@ -11,8 +11,8 @@ define [ w = window.open() go = () -> ga?('send', 'event', 'subscription-funnel', 'upgraded-free-trial', source) - if window.redirectToOLFreeTrialUrl? - url = window.redirectToOLFreeTrialUrl + if window.useV2TrialUrl + url = "/user/trial" else url = "/user/subscription/new?planCode=#{plan}&ssp=true" if couponCode? From a9f1989ecad4a9e8b63bdb75dbb3f25039c415a6 Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Wed, 23 May 2018 14:10:33 +0200 Subject: [PATCH 79/87] add test_unit_app task --- services/web/Makefile | 3 +++ services/web/bin/unit_test_app | 6 ++++++ services/web/package.json | 1 + 3 files changed, 10 insertions(+) create mode 100755 services/web/bin/unit_test_app diff --git a/services/web/Makefile b/services/web/Makefile index 720df034e8..469ab8e919 100644 --- a/services/web/Makefile +++ b/services/web/Makefile @@ -187,6 +187,9 @@ test: test_unit test_frontend test_acceptance test_unit: npm -q run test:unit -- ${MOCHA_ARGS} +test_unit_app: + npm -q run test:unit:app -- ${MOCHA_ARGS} + test_frontend: test_clean # stop service $(MAKE) compile docker-compose ${DOCKER_COMPOSE_FLAGS} up test_frontend diff --git a/services/web/bin/unit_test_app b/services/web/bin/unit_test_app new file mode 100755 index 0000000000..d0c3278618 --- /dev/null +++ b/services/web/bin/unit_test_app @@ -0,0 +1,6 @@ +#!/bin/bash +set -e; + +MOCHA="node_modules/.bin/mocha --exit --recursive --reporter spec" + +$MOCHA "$@" test/unit/js diff --git a/services/web/package.json b/services/web/package.json index 168aaf2066..ab9613e525 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -15,6 +15,7 @@ "test:acceptance:dir": "npm -q run test:acceptance:wait_for_app && npm -q run test:acceptance:run -- $@", "test:acceptance": "npm -q run test:acceptance:dir -- $@ test/acceptance/js", "test:unit": "npm -q run compile && bin/unit_test $@", + "test:unit:app": "npm -q run compile && bin/unit_test_app $@", "test:frontend": "karma start", "compile": "make compile", "start": "npm -q run compile && node $NODE_APP_OPTIONS app.js", From 0918e7e694e82ab6e14ecb2fe9d752d58fea11da Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 22 May 2018 14:42:05 +0100 Subject: [PATCH 80/87] Fix CodeMirror not scrolling correctly CM has a hard-coded 300px height in it's stylesheet. Because of the way we absolutely position the editor (to work with the dividers) we need to work a bit to set the CM height to 100% --- .../web/public/stylesheets/app/editor.less | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/services/web/public/stylesheets/app/editor.less b/services/web/public/stylesheets/app/editor.less index 1fcbde35d6..fc52bfb156 100644 --- a/services/web/public/stylesheets/app/editor.less +++ b/services/web/public/stylesheets/app/editor.less @@ -201,13 +201,9 @@ } } -.cm-editor-wrapper { - height: 100%; - - .CodeMirror { - height: 100%; - } -} +/************************************** +Ace +***************************************/ // The internal components of the aceEditor directive .ace-editor-wrapper { @@ -282,6 +278,23 @@ } } +/************************************** +CodeMirror +***************************************/ +.cm-editor-wrapper { + position: relative; + height: 100%; +} + +.cm-editor-body { + height: 100%; +} + +// CM (for some reason) has height set to 300px in it's stylesheet +.CodeMirror { + height: 100%; +} + .ui-layout-resizer when (@is-overleaf = false) { width: 6px; background-color: @editor-resizer-bg-color; From 5ecb02bd66398b075cef982d517c5e8186cb2e65 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Tue, 22 May 2018 17:57:44 +0100 Subject: [PATCH 81/87] Set size of RT when review panel is expanded --- .../web/public/stylesheets/app/editor/review-panel.less | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index 5e846be008..1ed723c3b4 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -775,6 +775,12 @@ } } +#editor-rich-text { + .rp-size-expanded & { + right: @review-panel-width; + } +} + .rp-toggle { display: inline-block; vertical-align: middle; From 7bcd285bb1ce1c240d58a62254737f28db0f3438 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 24 May 2018 09:51:29 +0100 Subject: [PATCH 82/87] Add Dropbox test for Front widget too --- .../web/app/coffee/Features/Project/ProjectController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index f2c92efcb3..4ca886fed0 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -194,7 +194,7 @@ module.exports = ProjectController = else viewModel.showUserDetailsArea = false - paidUser = user.features?.github # use a heuristic for paid account + paidUser = user.features?.github and user.features?.dropbox # use a heuristic for paid account freeUserProportion = 0.10 sampleFreeUser = parseInt(user._id.toString().slice(-2), 16) < freeUserProportion * 255 showFrontWidget = paidUser or sampleFreeUser From 81fdca91c13961bcd25462915c458b3fb73f06e5 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 24 May 2018 10:27:36 +0100 Subject: [PATCH 83/87] Fix failing test --- .../web/test/unit/coffee/Project/ProjectControllerTests.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee b/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee index ccae21ba70..ec7246754c 100644 --- a/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectControllerTests.coffee @@ -308,6 +308,7 @@ describe "ProjectController", -> it 'should show for paid users', (done) -> @user.features.github = true + @user.features.dropbox = true @res.render = (pageName, opts)=> opts.frontChatWidgetRoomId.should.equal @settings.overleaf.front_chat_widget_room_id done() From 868083676f63b84f529f51457df86163435f5312 Mon Sep 17 00:00:00 2001 From: Jessica Lawshe Date: Wed, 23 May 2018 16:02:02 -0500 Subject: [PATCH 84/87] Move contact form --- .../app/coffee/infrastructure/Modules.coffee | 3 +- services/web/app/views/contact-us-modal.pug | 67 ----------------- services/web/app/views/layout.pug | 2 +- .../web/public/coffee/main/contact-us.coffee | 72 ------------------- .../coffee/services/algolia-search.coffee | 4 +- 5 files changed, 5 insertions(+), 143 deletions(-) delete mode 100644 services/web/app/views/contact-us-modal.pug diff --git a/services/web/app/coffee/infrastructure/Modules.coffee b/services/web/app/coffee/infrastructure/Modules.coffee index 769182ad94..e1b2e11520 100644 --- a/services/web/app/coffee/infrastructure/Modules.coffee +++ b/services/web/app/coffee/infrastructure/Modules.coffee @@ -30,7 +30,8 @@ module.exports = Modules = for module in @modules for view, partial of module.viewIncludes or {} @viewIncludes[view] ||= [] - @viewIncludes[view].push pug.compile(fs.readFileSync(Path.join(MODULE_BASE_PATH, module.name, "app/views", partial + ".pug")), doctype: "html") + filePath = Path.join(MODULE_BASE_PATH, module.name, "app/views", partial + ".pug") + @viewIncludes[view].push pug.compileFile(filePath, doctype: "html") moduleIncludes: (view, locals) -> compiledPartials = Modules.viewIncludes[view] or [] diff --git a/services/web/app/views/contact-us-modal.pug b/services/web/app/views/contact-us-modal.pug deleted file mode 100644 index eacfd10533..0000000000 --- a/services/web/app/views/contact-us-modal.pug +++ /dev/null @@ -1,67 +0,0 @@ -script(type='text/ng-template', id='supportModalTemplate') - .modal-header - button.close( - type="button" - data-dismiss="modal" - ng-click="close()" - ) × - h3 #{translate("contact_us")} - .modal-body.contact-us-modal - form(name="contactForm") - span(ng-show="sent == false") - .alert.alert-danger(ng-show="error") Something went wrong sending your request :( - label - | #{translate("subject")} - .form-group - input.field.text.medium.span8.form-control( - name="subject", - required - ng-model="form.subject", - ng-model-options="{ updateOn: 'default blur', debounce: {'default': 350, 'blur': 0} }" - maxlength='255', - tabindex='1', - onkeyup='') - .contact-suggestions(ng-show="suggestions.length") - p.contact-suggestion-label !{translate("kb_suggestions_enquiry", { kbLink: "" + translate("knowledge_base") + "" })} - ul.contact-suggestion-list - li(ng-repeat="suggestion in suggestions") - a.contact-suggestion-list-item(ng-href="{{ suggestion.url }}", ng-click="clickSuggestionLink(suggestion.url);" target="_blank") - span(ng-bind-html="suggestion.name") - i.fa.fa-angle-right - label.desc(ng-show="'"+getUserEmail()+"'.length < 1") - | #{translate("email")} - .form-group(ng-show="'"+getUserEmail()+"'.length < 1") - input.field.text.medium.span8.form-control( - name="email", - required - ng-model="form.email", - ng-init="form.email = '"+getUserEmail()+"'", - type='email', spellcheck='false', - value='', - maxlength='255', - tabindex='2') - label#title12.desc - | #{translate("project_url")} (#{translate("optional")}) - .form-group - input.field.text.medium.span8.form-control(ng-model="form.project_url", tabindex='3', onkeyup='') - label.desc - | #{translate("contact_message_label")} - .form-group - textarea.field.text.medium.span8.form-control( - name="body", - required - ng-model="form.message", - type='text', - value='', - tabindex='4', - onkeyup='' - ) - .form-group.text-center - input.btn-success.btn.btn-lg( - type='submit', - ng-disabled="contactForm.$invalid || sending", - ng-click="contactUs()" - value=translate("contact_us") - ) - span(ng-show="sent") - p #{translate("request_sent_thank_you")} diff --git a/services/web/app/views/layout.pug b/services/web/app/views/layout.pug index 4dfdbc3ae7..687f5e1880 100644 --- a/services/web/app/views/layout.pug +++ b/services/web/app/views/layout.pug @@ -147,7 +147,7 @@ html(itemscope, itemtype='http://schema.org/Product') src=buildJsPath('libs/require.js', {hashedPath:true}) ) - include contact-us-modal + != moduleIncludes("contactModal", locals) include v1-tooltip include sentry diff --git a/services/web/public/coffee/main/contact-us.coffee b/services/web/public/coffee/main/contact-us.coffee index 2d1dee6d34..6d3e441c49 100644 --- a/services/web/public/coffee/main/contact-us.coffee +++ b/services/web/public/coffee/main/contact-us.coffee @@ -1,79 +1,7 @@ define [ "base" "libs/platform" - "services/algolia-search" ], (App, platform) -> - App.controller 'ContactModal', ($scope, $modal) -> - $scope.contactUsModal = () -> - modalInstance = $modal.open( - templateUrl: "supportModalTemplate" - controller: "SupportModalController" - ) - - App.controller 'SupportModalController', ($scope, $modalInstance, algoliaSearch, event_tracking) -> - $scope.form = {} - $scope.sent = false - $scope.sending = false - $scope.suggestions = []; - - _handleSearchResults = (success, results) -> - suggestions = for hit in results.hits - page_underscored = hit.pageName.replace(/\s/g,'_') - - suggestion = - url :"/learn/kb/#{page_underscored}" - name : hit._highlightResult.pageName.value - - event_tracking.sendMB "contact-form-suggestions-shown" if results.hits.length - - $scope.$applyAsync () -> - $scope.suggestions = suggestions - - $scope.contactUs = -> - if !$scope.form.email? or $scope.form.email == "" - console.log "email not set" - return - $scope.sending = true - ticketNumber = Math.floor((1 + Math.random()) * 0x10000).toString(32) - message = $scope.form.message - if $scope.form.project_url? - message = "#{message}\n\n project_url = #{$scope.form.project_url}" - params = - email: $scope.form.email - message: message or "" - subject: $scope.form.subject + " - [#{ticketNumber}]" - labels: "support" - about: "
browser: #{platform?.name} #{platform?.version}
-
os: #{platform?.os?.family} #{platform?.os?.version}
" - - Groove.createTicket params, (response)-> - $scope.sending = false - if response.responseText == "" # Blocked request or similar - $scope.error = true - else - data = JSON.parse(response.responseText) - if data.errors? - $scope.error = true - else - $scope.sent = true - $scope.$apply() - - $scope.$watch "form.subject", (newVal, oldVal) -> - if newVal and newVal != oldVal and newVal.length > 3 - algoliaSearch.searchKB newVal, _handleSearchResults, { - hitsPerPage: 3 - typoTolerance: 'strict' - } - else - $scope.suggestions = []; - - $scope.clickSuggestionLink = (url) -> - event_tracking.sendMB "contact-form-suggestions-clicked", { url } - - $scope.close = () -> - $modalInstance.close() - - App.controller 'UniverstiesContactController', ($scope, $modal, $http) -> $scope.form = {} diff --git a/services/web/public/coffee/services/algolia-search.coffee b/services/web/public/coffee/services/algolia-search.coffee index d62bc6389d..9ae5eae077 100644 --- a/services/web/public/coffee/services/algolia-search.coffee +++ b/services/web/public/coffee/services/algolia-search.coffee @@ -8,7 +8,7 @@ define [ kbIdx = client.initIndex(window.sharelatex.algolia?.indexes?.kb) service = - searchWiki: wikiIdx.search.bind(wikiIdx) - searchKB: kbIdx.search.bind(kbIdx) + searchWiki: if wikiIdx then wikiIdx.search.bind(wikiIdx) else null + searchKB: if kbIdx then kbIdx.search.bind(kbIdx) else null return service \ No newline at end of file From 5a590aa021ad02617d9ddbef72ba086d6ace76c4 Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Wed, 23 May 2018 12:08:56 +0200 Subject: [PATCH 85/87] remove getUserOrCreateHoldingAccount function The function is deprecated --- .../coffee/Features/User/UserCreator.coffee | 9 --------- .../SubscriptionGroupHandlerTests.coffee | 3 --- .../unit/coffee/User/UserCreatorTests.coffee | 18 ------------------ 3 files changed, 30 deletions(-) diff --git a/services/web/app/coffee/Features/User/UserCreator.coffee b/services/web/app/coffee/Features/User/UserCreator.coffee index d08b953559..0a0cc8641e 100644 --- a/services/web/app/coffee/Features/User/UserCreator.coffee +++ b/services/web/app/coffee/Features/User/UserCreator.coffee @@ -1,19 +1,10 @@ User = require("../../models/User").User -UserLocator = require("./UserLocator") logger = require("logger-sharelatex") metrics = require('metrics-sharelatex') module.exports = UserCreator = - getUserOrCreateHoldingAccount: (email, callback = (err, user)->)-> - self = @ - UserLocator.findByEmail email, (err, user)-> - if user? - callback(err, user) - else - self.createNewUser email:email, holdingAccount:true, callback - createNewUser: (opts, callback)-> logger.log opts:opts, "creating new user" user = new User() diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee index 1daf43bbd7..88b4366a30 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee @@ -24,9 +24,6 @@ describe "SubscriptionGroupHandler", -> getSubscriptionByMemberIdAndId: sinon.stub() getSubscription: sinon.stub() - @UserCreator = - getUserOrCreateHoldingAccount: sinon.stub().callsArgWith(1, null, @user) - @SubscriptionUpdater = addUserToGroup: sinon.stub().callsArgWith(2) removeUserFromGroup: sinon.stub().callsArgWith(2) diff --git a/services/web/test/unit/coffee/User/UserCreatorTests.coffee b/services/web/test/unit/coffee/User/UserCreatorTests.coffee index 8470e5621f..01d13bba10 100644 --- a/services/web/test/unit/coffee/User/UserCreatorTests.coffee +++ b/services/web/test/unit/coffee/User/UserCreatorTests.coffee @@ -25,24 +25,6 @@ describe "UserCreator", -> @email = "bob.oswald@gmail.com" - - describe "getUserOrCreateHoldingAccount", -> - - it "should immediately return the user if found", (done)-> - @UserLocator.findByEmail.callsArgWith(1, null, @user) - @UserCreator.getUserOrCreateHoldingAccount @email, (err, returnedUser)=> - assert.deepEqual returnedUser, @user - done() - - it "should create new holding account if the user is not found", (done)-> - @UserLocator.findByEmail.callsArgWith(1) - @UserCreator.createNewUser = sinon.stub().callsArgWith(1, null, @user) - @UserCreator.getUserOrCreateHoldingAccount @email, (err, returnedUser)=> - @UserCreator.createNewUser.calledWith(email:@email, holdingAccount:true).should.equal true - assert.deepEqual returnedUser, @user - done() - - describe "createNewUser", -> it "should take the opts and put them in the model", (done)-> From bbaca91e572d0feb231d749de649782776e7b60f Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Wed, 23 May 2018 16:12:23 +0200 Subject: [PATCH 86/87] add UserGetter#getUserByMainEmail Use only that method to find users by email. --- .../CollaboratorsInviteController.coffee | 2 +- .../CollaboratorsInviteHandler.coffee | 2 +- .../PasswordReset/PasswordResetHandler.coffee | 2 +- .../SubscriptionGroupHandler.coffee | 3 +- .../coffee/Features/User/UserGetter.coffee | 10 ++++ .../coffee/Features/User/UserLocator.coffee | 6 -- .../User/UserRegistrationHandler.coffee | 3 +- .../coffee/Features/User/UserUpdater.coffee | 4 +- .../CollaboratorsInviteControllerTests.coffee | 15 +++-- .../CollaboratorsInviteHandlerTests.coffee | 18 +++--- .../PasswordResetHandlerTests.coffee | 8 +-- .../SubscriptionGroupHandlerTests.coffee | 11 ++-- .../unit/coffee/User/UserCreatorTests.coffee | 6 +- .../unit/coffee/User/UserGetterTests.coffee | 58 +++++++++++++++++++ .../unit/coffee/User/UserLocatorTests.coffee | 36 +++++------- .../User/UserRegistrationHandlerTests.coffee | 10 ++-- .../unit/coffee/User/UserUpdaterTests.coffee | 10 ++-- 17 files changed, 134 insertions(+), 70 deletions(-) create mode 100644 services/web/test/unit/coffee/User/UserGetterTests.coffee diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee index 898abe52bb..f74a144bac 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee @@ -27,7 +27,7 @@ module.exports = CollaboratorsInviteController = _checkShouldInviteEmail: (email, callback=(err, shouldAllowInvite)->) -> if Settings.restrictInvitesToExistingAccounts == true logger.log {email}, "checking if user exists with this email" - UserGetter.getUser {email: email}, {_id: 1}, (err, user) -> + UserGetter.getUserByMainEmail email, {_id: 1}, (err, user) -> return callback(err) if err? userExists = user? and user?._id? callback(null, userExists) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee index ecca8ab86f..b511f56e53 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee @@ -32,7 +32,7 @@ module.exports = CollaboratorsInviteHandler = _trySendInviteNotification: (projectId, sendingUser, invite, callback=(err)->) -> email = invite.email - UserGetter.getUser {email: email}, {_id: 1}, (err, existingUser) -> + UserGetter.getUserByMainEmail email, {_id: 1}, (err, existingUser) -> if err? logger.err {projectId, email}, "error checking if user exists" return callback(err) diff --git a/services/web/app/coffee/Features/PasswordReset/PasswordResetHandler.coffee b/services/web/app/coffee/Features/PasswordReset/PasswordResetHandler.coffee index 4e67e9f1f4..3947b63004 100644 --- a/services/web/app/coffee/Features/PasswordReset/PasswordResetHandler.coffee +++ b/services/web/app/coffee/Features/PasswordReset/PasswordResetHandler.coffee @@ -9,7 +9,7 @@ logger = require("logger-sharelatex") module.exports = generateAndEmailResetToken:(email, callback = (error, exists) ->)-> - UserGetter.getUser email:email, (err, user)-> + UserGetter.getUserByMainEmail email, (err, user)-> if err then return callback(err) if !user? or user.holdingAccount logger.err email:email, "user could not be found for password reset" diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee index 5b7c2e0740..74e1fb4098 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee @@ -3,6 +3,7 @@ _ = require("underscore") SubscriptionUpdater = require("./SubscriptionUpdater") SubscriptionLocator = require("./SubscriptionLocator") UserLocator = require("../User/UserLocator") +UserGetter = require("../User/UserGetter") LimitationsManager = require("./LimitationsManager") logger = require("logger-sharelatex") OneTimeTokenHandler = require("../Security/OneTimeTokenHandler") @@ -21,7 +22,7 @@ module.exports = SubscriptionGroupHandler = if limitReached logger.err adminUserId:adminUserId, newEmail:newEmail, "group subscription limit reached not adding user to group" return callback(limitReached:limitReached) - UserLocator.findByEmail newEmail, (err, user)-> + UserGetter.getUserByMainEmail newEmail, (err, user)-> return callback(err) if err? if user? SubscriptionUpdater.addUserToGroup adminUserId, user._id, (err)-> diff --git a/services/web/app/coffee/Features/User/UserGetter.coffee b/services/web/app/coffee/Features/User/UserGetter.coffee index 306fbc7a10..201981625e 100644 --- a/services/web/app/coffee/Features/User/UserGetter.coffee +++ b/services/web/app/coffee/Features/User/UserGetter.coffee @@ -6,6 +6,8 @@ ObjectId = mongojs.ObjectId module.exports = UserGetter = getUser: (query, projection, callback = (error, user) ->) -> + if query?.email? + return callback(new Error("Don't use getUser to find user by email"), null) if arguments.length == 2 callback = projection projection = {} @@ -19,6 +21,13 @@ module.exports = UserGetter = db.users.findOne query, projection, callback + getUserByMainEmail: (email, projection, callback = (error, user) ->) -> + email = email.trim() + if arguments.length == 2 + callback = projection + projection = {} + db.users.findOne email: email, projection, callback + getUsers: (user_ids, projection, callback = (error, users) ->) -> try user_ids = user_ids.map (u) -> ObjectId(u.toString()) @@ -39,6 +48,7 @@ module.exports = UserGetter = [ 'getUser', + 'getUserByMainEmail', 'getUsers', 'getUserOrUserStubById' ].map (method) -> diff --git a/services/web/app/coffee/Features/User/UserLocator.coffee b/services/web/app/coffee/Features/User/UserLocator.coffee index 9be32c76b0..732865bed1 100644 --- a/services/web/app/coffee/Features/User/UserLocator.coffee +++ b/services/web/app/coffee/Features/User/UserLocator.coffee @@ -6,16 +6,10 @@ logger = require('logger-sharelatex') module.exports = UserLocator = - findByEmail: (email, callback)-> - email = email.trim() - db.users.findOne email:email, (err, user)-> - callback(err, user) - findById: (_id, callback)-> db.users.findOne _id:ObjectId(_id+""), callback [ 'findById', - 'findByEmail' ].map (method) -> metrics.timeAsyncMethod UserLocator, method, 'mongo.UserLocator', logger diff --git a/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee b/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee index f5db2e54a1..fab438ffa6 100644 --- a/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee +++ b/services/web/app/coffee/Features/User/UserRegistrationHandler.coffee @@ -1,6 +1,7 @@ sanitize = require('sanitizer') User = require("../../models/User").User UserCreator = require("./UserCreator") +UserGetter = require("./UserGetter") AuthenticationManager = require("../Authentication/AuthenticationManager") NewsLetterManager = require("../Newsletter/NewsletterManager") async = require("async") @@ -47,7 +48,7 @@ module.exports = UserRegistrationHandler = if !requestIsValid return callback(new Error("request is not valid")) userDetails.email = userDetails.email?.trim()?.toLowerCase() - User.findOne email:userDetails.email, (err, user)-> + UserGetter.getUserByMainEmail userDetails.email, (err, user) => if err? return callback err if user?.holdingAccount == false diff --git a/services/web/app/coffee/Features/User/UserUpdater.coffee b/services/web/app/coffee/Features/User/UserUpdater.coffee index 530d81063d..174d37bc38 100644 --- a/services/web/app/coffee/Features/User/UserUpdater.coffee +++ b/services/web/app/coffee/Features/User/UserUpdater.coffee @@ -3,7 +3,7 @@ mongojs = require("../../infrastructure/mongojs") metrics = require("metrics-sharelatex") db = mongojs.db ObjectId = mongojs.ObjectId -UserLocator = require("./UserLocator") +UserGetter = require("./UserGetter") module.exports = UserUpdater = updateUser: (query, update, callback = (error) ->) -> @@ -18,7 +18,7 @@ module.exports = UserUpdater = changeEmailAddress: (user_id, newEmail, callback)-> self = @ logger.log user_id:user_id, newEmail:newEmail, "updaing email address of user" - UserLocator.findByEmail newEmail, (error, user) -> + UserGetter.getUserByMainEmail newEmail, (error, user) -> if user? return callback({message:"alread_exists"}) self.updateUser user_id.toString(), { diff --git a/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee b/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee index cdfff78249..4b57ff3697 100644 --- a/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee +++ b/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteControllerTests.coffee @@ -24,11 +24,14 @@ describe "CollaboratorsInviteController", -> addCount: sinon.stub @LimitationsManager = {} + @UserGetter = + getUserByMainEmail: sinon.stub() + getUser: sinon.stub() @CollaboratorsInviteController = SandboxedModule.require modulePath, requires: "../Project/ProjectGetter": @ProjectGetter = {} '../Subscription/LimitationsManager' : @LimitationsManager - '../User/UserGetter': @UserGetter = {getUser: sinon.stub()} + '../User/UserGetter': @UserGetter "./CollaboratorsHandler": @CollaboratorsHandler = {} "./CollaboratorsInviteHandler": @CollaboratorsInviteHandler = {} 'logger-sharelatex': @logger = {err: sinon.stub(), error: sinon.stub(), log: sinon.stub()} @@ -713,7 +716,7 @@ describe "CollaboratorsInviteController", -> beforeEach -> @user = {_id: ObjectId().toString()} - @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user) + @UserGetter.getUserByMainEmail = sinon.stub().callsArgWith(2, null, @user) it 'should callback with `true`', (done) -> @call (err, shouldAllow) => @@ -725,7 +728,7 @@ describe "CollaboratorsInviteController", -> beforeEach -> @user = null - @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user) + @UserGetter.getUserByMainEmail = sinon.stub().callsArgWith(2, null, @user) it 'should callback with `false`', (done) -> @call (err, shouldAllow) => @@ -735,15 +738,15 @@ describe "CollaboratorsInviteController", -> it 'should have called getUser', (done) -> @call (err, shouldAllow) => - @UserGetter.getUser.callCount.should.equal 1 - @UserGetter.getUser.calledWith({email: @email}, {_id: 1}).should.equal true + @UserGetter.getUserByMainEmail.callCount.should.equal 1 + @UserGetter.getUserByMainEmail.calledWith(@email, {_id: 1}).should.equal true done() describe 'when getUser produces an error', -> beforeEach -> @user = null - @UserGetter.getUser = sinon.stub().callsArgWith(2, new Error('woops')) + @UserGetter.getUserByMainEmail = sinon.stub().callsArgWith(2, new Error('woops')) it 'should callback with an error', (done) -> @call (err, shouldAllow) => diff --git a/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee b/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee index 177c42d4ba..58b373f61f 100644 --- a/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee +++ b/services/web/test/unit/coffee/Collaborators/CollaboratorsInviteHandlerTests.coffee @@ -605,7 +605,7 @@ describe "CollaboratorsInviteHandler", -> _id: ObjectId() first_name: "jim" @existingUser = {_id: ObjectId()} - @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @existingUser) + @UserGetter.getUserByMainEmail = sinon.stub().callsArgWith(2, null, @existingUser) @fakeProject = _id: @project_id name: "some project" @@ -626,8 +626,8 @@ describe "CollaboratorsInviteHandler", -> it 'should call getUser', (done) -> @call (err) => - @UserGetter.getUser.callCount.should.equal 1 - @UserGetter.getUser.calledWith({email: @invite.email}).should.equal true + @UserGetter.getUserByMainEmail.callCount.should.equal 1 + @UserGetter.getUserByMainEmail.calledWith(@invite.email).should.equal true done() it 'should call getProject', (done) -> @@ -671,7 +671,7 @@ describe "CollaboratorsInviteHandler", -> describe 'when the user does not exist', -> beforeEach -> - @UserGetter.getUser = sinon.stub().callsArgWith(2, null, null) + @UserGetter.getUserByMainEmail = sinon.stub().callsArgWith(2, null, null) it 'should not produce an error', (done) -> @call (err) => @@ -680,8 +680,8 @@ describe "CollaboratorsInviteHandler", -> it 'should call getUser', (done) -> @call (err) => - @UserGetter.getUser.callCount.should.equal 1 - @UserGetter.getUser.calledWith({email: @invite.email}).should.equal true + @UserGetter.getUserByMainEmail.callCount.should.equal 1 + @UserGetter.getUserByMainEmail.calledWith(@invite.email).should.equal true done() it 'should not call getProject', (done) -> @@ -698,7 +698,7 @@ describe "CollaboratorsInviteHandler", -> describe 'when the getUser produces an error', -> beforeEach -> - @UserGetter.getUser = sinon.stub().callsArgWith(2, new Error('woops')) + @UserGetter.getUserByMainEmail = sinon.stub().callsArgWith(2, new Error('woops')) it 'should produce an error', (done) -> @call (err) => @@ -707,8 +707,8 @@ describe "CollaboratorsInviteHandler", -> it 'should call getUser', (done) -> @call (err) => - @UserGetter.getUser.callCount.should.equal 1 - @UserGetter.getUser.calledWith({email: @invite.email}).should.equal true + @UserGetter.getUserByMainEmail.callCount.should.equal 1 + @UserGetter.getUserByMainEmail.calledWith(@invite.email).should.equal true done() it 'should not call getProject', (done) -> diff --git a/services/web/test/unit/coffee/PasswordReset/PasswordResetHandlerTests.coffee b/services/web/test/unit/coffee/PasswordReset/PasswordResetHandlerTests.coffee index b29839246a..261f5582dd 100644 --- a/services/web/test/unit/coffee/PasswordReset/PasswordResetHandlerTests.coffee +++ b/services/web/test/unit/coffee/PasswordReset/PasswordResetHandlerTests.coffee @@ -16,7 +16,7 @@ describe "PasswordResetHandler", -> getNewToken:sinon.stub() getValueFromTokenAndExpire:sinon.stub() @UserGetter = - getUser:sinon.stub() + getUserByMainEmail:sinon.stub() @EmailHandler = sendEmail:sinon.stub() @AuthenticationManager = @@ -40,7 +40,7 @@ describe "PasswordResetHandler", -> describe "generateAndEmailResetToken", -> it "should check the user exists", (done)-> - @UserGetter.getUser.callsArgWith(1) + @UserGetter.getUserByMainEmail.callsArgWith(1) @OneTimeTokenHandler.getNewToken.callsArgWith(1) @PasswordResetHandler.generateAndEmailResetToken @user.email, (err, exists)=> exists.should.equal false @@ -49,7 +49,7 @@ describe "PasswordResetHandler", -> it "should send the email with the token", (done)-> - @UserGetter.getUser.callsArgWith(1, null, @user) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, @user) @OneTimeTokenHandler.getNewToken.callsArgWith(1, null, @token) @EmailHandler.sendEmail.callsArgWith(2) @PasswordResetHandler.generateAndEmailResetToken @user.email, (err, exists)=> @@ -62,7 +62,7 @@ describe "PasswordResetHandler", -> it "should return exists = false for a holdingAccount", (done) -> @user.holdingAccount = true - @UserGetter.getUser.callsArgWith(1, null, @user) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, @user) @OneTimeTokenHandler.getNewToken.callsArgWith(1) @PasswordResetHandler.generateAndEmailResetToken @user.email, (err, exists)=> exists.should.equal false diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee index 88b4366a30..d5db1314d9 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee @@ -32,7 +32,9 @@ describe "SubscriptionGroupHandler", -> @UserLocator = findById: sinon.stub() - findByEmail: sinon.stub() + + @UserGetter = + getUserByMainEmail: sinon.stub() @LimitationsManager = hasGroupMembersLimitReached: sinon.stub() @@ -57,6 +59,7 @@ describe "SubscriptionGroupHandler", -> "./SubscriptionUpdater": @SubscriptionUpdater "./SubscriptionLocator": @SubscriptionLocator "../User/UserLocator": @UserLocator + "../User/UserGetter": @UserGetter "./LimitationsManager": @LimitationsManager "../Security/OneTimeTokenHandler":@OneTimeTokenHandler "../Email/EmailHandler":@EmailHandler @@ -71,11 +74,11 @@ describe "SubscriptionGroupHandler", -> describe "addUserToGroup", -> beforeEach -> @LimitationsManager.hasGroupMembersLimitReached.callsArgWith(1, null, false, @subscription) - @UserLocator.findByEmail.callsArgWith(1, null, @user) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, @user) it "should find the user", (done)-> @Handler.addUserToGroup @adminUser_id, @newEmail, (err)=> - @UserLocator.findByEmail.calledWith(@newEmail).should.equal true + @UserGetter.getUserByMainEmail.calledWith(@newEmail).should.equal true done() it "should add the user to the group", (done)-> @@ -102,7 +105,7 @@ describe "SubscriptionGroupHandler", -> done() it "should add an email invite if no user is found", (done) -> - @UserLocator.findByEmail.callsArgWith(1, null, null) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, null) @Handler.addUserToGroup @adminUser_id, @newEmail, (err)=> @SubscriptionUpdater.addEmailInviteToGroup.calledWith(@adminUser_id, @newEmail).should.equal true done() diff --git a/services/web/test/unit/coffee/User/UserCreatorTests.coffee b/services/web/test/unit/coffee/User/UserCreatorTests.coffee index 01d13bba10..cc2b1ec150 100644 --- a/services/web/test/unit/coffee/User/UserCreatorTests.coffee +++ b/services/web/test/unit/coffee/User/UserCreatorTests.coffee @@ -15,11 +15,11 @@ describe "UserCreator", -> constructor: -> return self.user - @UserLocator = - findByEmail: sinon.stub() + @UserGetter = + getUserByMainEmail: sinon.stub() @UserCreator = SandboxedModule.require modulePath, requires: "../../models/User": User:@UserModel - "./UserLocator":@UserLocator + "./UserGetter":@UserGetter "logger-sharelatex":{log:->} 'metrics-sharelatex': {timeAsyncMethod: ()->} diff --git a/services/web/test/unit/coffee/User/UserGetterTests.coffee b/services/web/test/unit/coffee/User/UserGetterTests.coffee new file mode 100644 index 0000000000..2c32bd8250 --- /dev/null +++ b/services/web/test/unit/coffee/User/UserGetterTests.coffee @@ -0,0 +1,58 @@ +should = require('chai').should() +SandboxedModule = require('sandboxed-module') +assert = require('assert') +path = require('path') +sinon = require('sinon') +modulePath = path.join __dirname, "../../../../app/js/Features/User/UserGetter" +expect = require("chai").expect + +describe "UserGetter", -> + + beforeEach -> + @fakeUser = {_id:"12390i"} + @findOne = sinon.stub().callsArgWith(2, null, @fakeUser) + @Mongo = + db: users: findOne: @findOne + ObjectId: (id) -> return id + + @UserGetter = SandboxedModule.require modulePath, requires: + "logger-sharelatex": log:-> + "../../infrastructure/mongojs": @Mongo + "metrics-sharelatex": timeAsyncMethod: sinon.stub() + + describe "getUser", -> + it "should get user", (done)-> + query = _id: 'foo' + projection = email: 1 + @UserGetter.getUser query, projection, (error, user) => + @findOne.called.should.equal true + @findOne.calledWith(query, projection).should.equal true + user.should.deep.equal @fakeUser + done() + + it "should not allow email in query", (done)-> + @UserGetter.getUser email: 'foo@bar.com', {}, (error, user) => + error.should.exist + done() + + describe "getUserbyMainEmail", -> + it "query user by main email", (done)-> + email = 'hello@world.com' + projection = emails: 1 + @UserGetter.getUserByMainEmail email, projection, (error, user) => + @findOne.called.should.equal true + @findOne.calledWith(email: email, projection).should.equal true + done() + + it "return user if found", (done)-> + email = 'hello@world.com' + @UserGetter.getUserByMainEmail email, (error, user) => + user.should.deep.equal @fakeUser + done() + + it "trim email", (done)-> + email = 'hello@world.com' + @UserGetter.getUserByMainEmail " #{email} ", (error, user) => + @findOne.called.should.equal true + @findOne.calledWith(email: email).should.equal true + done() diff --git a/services/web/test/unit/coffee/User/UserLocatorTests.coffee b/services/web/test/unit/coffee/User/UserLocatorTests.coffee index dc3fc84dfa..0093dc7d61 100644 --- a/services/web/test/unit/coffee/User/UserLocatorTests.coffee +++ b/services/web/test/unit/coffee/User/UserLocatorTests.coffee @@ -7,33 +7,25 @@ SandboxedModule = require('sandboxed-module') describe "UserLocator", -> beforeEach -> - @user = {_id:"12390i"} + @fakeUser = {_id:"12390i"} + @findOne = sinon.stub().callsArgWith(1, null, @fakeUser) + @Mongo = + db: users: findOne: @findOne + ObjectId: (id) -> return id + @UserLocator = SandboxedModule.require modulePath, requires: - "../../infrastructure/mongojs": db: @db = { users: {} } + "../../infrastructure/mongojs": @Mongo "metrics-sharelatex": timeAsyncMethod: sinon.stub() 'logger-sharelatex' : { log: sinon.stub() } - @db.users = - findOne : sinon.stub().callsArgWith(1, null, @user) - @email = "bob.oswald@gmail.com" - - - describe "findByEmail", -> - - it "should try and find a user with that email address", (done)-> - @UserLocator.findByEmail @email, (err, user)=> - @db.users.findOne.calledWith(email:@email).should.equal true - done() - - it "should trim white space", (done)-> - @UserLocator.findByEmail "#{@email} ", (err, user)=> - @db.users.findOne.calledWith(email:@email).should.equal true + describe "findById", -> + it "should try and find a user with that id", (done)-> + _id = '123e' + @UserLocator.findById _id, (err, user)=> + @findOne.calledWith(_id: _id).should.equal true done() it "should return the user if found", (done)-> - @UserLocator.findByEmail @email, (err, user)=> - user.should.deep.equal @user + @UserLocator.findById '123e', (err, user)=> + user.should.deep.equal @fakeUser done() - - - diff --git a/services/web/test/unit/coffee/User/UserRegistrationHandlerTests.coffee b/services/web/test/unit/coffee/User/UserRegistrationHandlerTests.coffee index d0b96da2de..9411059022 100644 --- a/services/web/test/unit/coffee/User/UserRegistrationHandlerTests.coffee +++ b/services/web/test/unit/coffee/User/UserRegistrationHandlerTests.coffee @@ -12,8 +12,9 @@ describe "UserRegistrationHandler", -> @user = _id: @user_id = "31j2lk21kjl" @User = - findOne:sinon.stub() update: sinon.stub().callsArgWith(2) + @UserGetter = + getUserByMainEmail: sinon.stub() @UserCreator = createNewUser:sinon.stub().callsArgWith(1, null, @user) @AuthenticationManager = @@ -26,6 +27,7 @@ describe "UserRegistrationHandler", -> getNewToken: sinon.stub() @handler = SandboxedModule.require modulePath, requires: "../../models/User": {User:@User} + "./UserGetter": @UserGetter "./UserCreator": @UserCreator "../Authentication/AuthenticationManager":@AuthenticationManager "../Newsletter/NewsletterManager":@NewsLetterManager @@ -70,7 +72,7 @@ describe "UserRegistrationHandler", -> beforeEach -> @user.holdingAccount = true @handler._registrationRequestIsValid = sinon.stub().returns true - @User.findOne.callsArgWith(1, null, @user) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, @user) it "should not create a new user if there is a holding account there", (done)-> @handler.registerNewUser @passingRequest, (err)=> @@ -94,7 +96,7 @@ describe "UserRegistrationHandler", -> done() it "should return email registered in the error if there is a non holdingAccount there", (done)-> - @User.findOne.callsArgWith(1, null, @user = {holdingAccount:false}) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, @user = {holdingAccount:false}) @handler.registerNewUser @passingRequest, (err, user)=> err.should.deep.equal new Error("EmailAlreadyRegistered") user.should.deep.equal @user @@ -103,7 +105,7 @@ describe "UserRegistrationHandler", -> describe "validRequest", -> beforeEach -> @handler._registrationRequestIsValid = sinon.stub().returns true - @User.findOne.callsArgWith 1 + @UserGetter.getUserByMainEmail.callsArgWith 1 it "should create a new user", (done)-> @handler.registerNewUser @passingRequest, (err)=> diff --git a/services/web/test/unit/coffee/User/UserUpdaterTests.coffee b/services/web/test/unit/coffee/User/UserUpdaterTests.coffee index a6239e2e65..202a4f3f1a 100644 --- a/services/web/test/unit/coffee/User/UserUpdaterTests.coffee +++ b/services/web/test/unit/coffee/User/UserUpdaterTests.coffee @@ -14,12 +14,12 @@ describe "UserUpdater", -> @mongojs = db:{} ObjectId:(id)-> return id - @UserLocator = - findByEmail:sinon.stub() + @UserGetter = + getUserByMainEmail: sinon.stub() @UserUpdater = SandboxedModule.require modulePath, requires: "settings-sharelatex":@settings "logger-sharelatex": log:-> - "./UserLocator":@UserLocator + "./UserGetter": @UserGetter "../../infrastructure/mongojs":@mongojs "metrics-sharelatex": timeAsyncMethod: sinon.stub() @@ -34,7 +34,7 @@ describe "UserUpdater", -> @UserUpdater.updateUser = sinon.stub().callsArgWith(2) it "should check if the new email already has an account", (done)-> - @UserLocator.findByEmail.callsArgWith(1, null, @stubbedUser) + @UserGetter.getUserByMainEmail.callsArgWith(1, null, @stubbedUser) @UserUpdater.changeEmailAddress @user_id, @stubbedUser.email, (err)=> @UserUpdater.updateUser.called.should.equal false should.exist(err) @@ -42,7 +42,7 @@ describe "UserUpdater", -> it "should set the users password", (done)-> - @UserLocator.findByEmail.callsArgWith(1, null) + @UserGetter.getUserByMainEmail.callsArgWith(1, null) @UserUpdater.changeEmailAddress @user_id, @newEmail, (err)=> @UserUpdater.updateUser.calledWith(@user_id, $set: { "email": @newEmail}).should.equal true done() From 5fbe5c5537cbebacbaf9129bb779d5ee916987d5 Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Thu, 24 May 2018 15:55:12 +0200 Subject: [PATCH 87/87] remove UserLocator Use UserGetter instead --- .../BetaProgram/BetaProgramController.coffee | 4 +-- .../SubscriptionGroupHandler.coffee | 3 +- .../Features/User/UserController.coffee | 4 +-- .../coffee/Features/User/UserLocator.coffee | 15 --------- .../Features/User/UserPagesController.coffee | 3 +- .../BetaProgramControllerTests.coffee | 10 +++--- .../SubscriptionGroupHandlerTests.coffee | 19 +++++------- .../coffee/User/UserControllerTests.coffee | 6 ++-- .../unit/coffee/User/UserLocatorTests.coffee | 31 ------------------- .../User/UserPagesControllerTests.coffee | 9 +++--- 10 files changed, 26 insertions(+), 78 deletions(-) delete mode 100644 services/web/app/coffee/Features/User/UserLocator.coffee delete mode 100644 services/web/test/unit/coffee/User/UserLocatorTests.coffee diff --git a/services/web/app/coffee/Features/BetaProgram/BetaProgramController.coffee b/services/web/app/coffee/Features/BetaProgram/BetaProgramController.coffee index 4e96ce113c..1e0577cfc1 100644 --- a/services/web/app/coffee/Features/BetaProgram/BetaProgramController.coffee +++ b/services/web/app/coffee/Features/BetaProgram/BetaProgramController.coffee @@ -1,5 +1,5 @@ BetaProgramHandler = require './BetaProgramHandler' -UserLocator = require "../User/UserLocator" +UserGetter = require "../User/UserGetter" Settings = require "settings-sharelatex" logger = require 'logger-sharelatex' AuthenticationController = require '../Authentication/AuthenticationController' @@ -30,7 +30,7 @@ module.exports = BetaProgramController = optInPage: (req, res, next)-> user_id = AuthenticationController.getLoggedInUserId(req) logger.log {user_id}, "showing beta participation page for user" - UserLocator.findById user_id, (err, user)-> + UserGetter.getUser user_id, (err, user)-> if err logger.err {err, user_id}, "error fetching user" return next(err) diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee index 74e1fb4098..d6ce0dde59 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionGroupHandler.coffee @@ -2,7 +2,6 @@ async = require("async") _ = require("underscore") SubscriptionUpdater = require("./SubscriptionUpdater") SubscriptionLocator = require("./SubscriptionLocator") -UserLocator = require("../User/UserLocator") UserGetter = require("../User/UserGetter") LimitationsManager = require("./LimitationsManager") logger = require("logger-sharelatex") @@ -51,7 +50,7 @@ module.exports = SubscriptionGroupHandler = users.push buildEmailInviteViewModel(email) jobs = _.map subscription.member_ids, (user_id)-> return (cb)-> - UserLocator.findById user_id, (err, user)-> + UserGetter.getUser user_id, (err, user)-> if err? or !user? users.push _id:user_id return cb() diff --git a/services/web/app/coffee/Features/User/UserController.coffee b/services/web/app/coffee/Features/User/UserController.coffee index ccbd0a86f1..cf7e6be33f 100644 --- a/services/web/app/coffee/Features/User/UserController.coffee +++ b/services/web/app/coffee/Features/User/UserController.coffee @@ -1,6 +1,6 @@ UserHandler = require("./UserHandler") UserDeleter = require("./UserDeleter") -UserLocator = require("./UserLocator") +UserGetter = require("./UserGetter") User = require("../../models/User").User newsLetterManager = require('../Newsletter/NewsletterManager') UserRegistrationHandler = require("./UserRegistrationHandler") @@ -45,7 +45,7 @@ module.exports = UserController = unsubscribe: (req, res)-> user_id = AuthenticationController.getLoggedInUserId(req) - UserLocator.findById user_id, (err, user)-> + UserGetter.getUser user_id, (err, user)-> newsLetterManager.unsubscribe user, -> res.send() diff --git a/services/web/app/coffee/Features/User/UserLocator.coffee b/services/web/app/coffee/Features/User/UserLocator.coffee deleted file mode 100644 index 732865bed1..0000000000 --- a/services/web/app/coffee/Features/User/UserLocator.coffee +++ /dev/null @@ -1,15 +0,0 @@ -mongojs = require("../../infrastructure/mongojs") -metrics = require("metrics-sharelatex") -db = mongojs.db -ObjectId = mongojs.ObjectId -logger = require('logger-sharelatex') - -module.exports = UserLocator = - - findById: (_id, callback)-> - db.users.findOne _id:ObjectId(_id+""), callback - -[ - 'findById', -].map (method) -> - metrics.timeAsyncMethod UserLocator, method, 'mongo.UserLocator', logger diff --git a/services/web/app/coffee/Features/User/UserPagesController.coffee b/services/web/app/coffee/Features/User/UserPagesController.coffee index 25825c35e6..5e6ea7d62b 100644 --- a/services/web/app/coffee/Features/User/UserPagesController.coffee +++ b/services/web/app/coffee/Features/User/UserPagesController.coffee @@ -1,4 +1,3 @@ -UserLocator = require("./UserLocator") UserGetter = require("./UserGetter") UserSessionsManager = require("./UserSessionsManager") ErrorController = require("../Errors/ErrorController") @@ -61,7 +60,7 @@ module.exports = user_id = AuthenticationController.getLoggedInUserId(req) logger.log user: user_id, "loading settings page" shouldAllowEditingDetails = !(Settings?.ldap?.updateUserDetailsOnLogin) and !(Settings?.saml?.updateUserDetailsOnLogin) - UserLocator.findById user_id, (err, user)-> + UserGetter.getUser user_id, (err, user)-> return next(err) if err? res.render 'user/settings', title:'account_settings' diff --git a/services/web/test/unit/coffee/BetaProgram/BetaProgramControllerTests.coffee b/services/web/test/unit/coffee/BetaProgram/BetaProgramControllerTests.coffee index ab1f1b0567..713179b056 100644 --- a/services/web/test/unit/coffee/BetaProgram/BetaProgramControllerTests.coffee +++ b/services/web/test/unit/coffee/BetaProgram/BetaProgramControllerTests.coffee @@ -23,8 +23,8 @@ describe "BetaProgramController", -> optIn: sinon.stub() optOut: sinon.stub() }, - "../User/UserLocator": @UserLocator = { - findById: sinon.stub() + "../User/UserGetter": @UserGetter = { + getUser: sinon.stub() }, "settings-sharelatex": @settings = { languages: {} @@ -119,7 +119,7 @@ describe "BetaProgramController", -> describe "optInPage", -> beforeEach -> - @UserLocator.findById.callsArgWith(1, null, @user) + @UserGetter.getUser.callsArgWith(1, null, @user) it "should render the opt-in page", () -> @BetaProgramController.optInPage @req, @res, @next @@ -128,10 +128,10 @@ describe "BetaProgramController", -> args[0].should.equal 'beta_program/opt_in' - describe "when UserLocator.findById produces an error", -> + describe "when UserGetter.getUser produces an error", -> beforeEach -> - @UserLocator.findById.callsArgWith(1, new Error('woops')) + @UserGetter.getUser.callsArgWith(1, new Error('woops')) it "should not render the opt-in page", () -> @BetaProgramController.optInPage @req, @res, @next diff --git a/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee b/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee index d5db1314d9..bca9ac7600 100644 --- a/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee +++ b/services/web/test/unit/coffee/Subscription/SubscriptionGroupHandlerTests.coffee @@ -30,10 +30,8 @@ describe "SubscriptionGroupHandler", -> addEmailInviteToGroup: sinon.stub().callsArgWith(2) removeEmailInviteFromGroup: sinon.stub().callsArgWith(2) - @UserLocator = - findById: sinon.stub() - @UserGetter = + getUser: sinon.stub() getUserByMainEmail: sinon.stub() @LimitationsManager = @@ -58,7 +56,6 @@ describe "SubscriptionGroupHandler", -> "../User/UserCreator": @UserCreator "./SubscriptionUpdater": @SubscriptionUpdater "./SubscriptionLocator": @SubscriptionLocator - "../User/UserLocator": @UserLocator "../User/UserGetter": @UserGetter "./LimitationsManager": @LimitationsManager "../Security/OneTimeTokenHandler":@OneTimeTokenHandler @@ -122,26 +119,26 @@ describe "SubscriptionGroupHandler", -> beforeEach -> @subscription = {} @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription) - @UserLocator.findById.callsArgWith(1, null, {_id:"31232"}) + @UserGetter.getUser.callsArgWith(1, null, {_id:"31232"}) it "should locate the subscription", (done)-> - @UserLocator.findById.callsArgWith(1, null, {_id:"31232"}) + @UserGetter.getUser.callsArgWith(1, null, {_id:"31232"}) @Handler.getPopulatedListOfMembers @adminUser_id, (err, users)=> @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser_id).should.equal true done() it "should get the users by id", (done)-> - @UserLocator.findById.callsArgWith(1, null, {_id:"31232"}) + @UserGetter.getUser.callsArgWith(1, null, {_id:"31232"}) @subscription.member_ids = ["1234", "342432", "312312"] @Handler.getPopulatedListOfMembers @adminUser_id, (err, users)=> - @UserLocator.findById.calledWith(@subscription.member_ids[0]).should.equal true - @UserLocator.findById.calledWith(@subscription.member_ids[1]).should.equal true - @UserLocator.findById.calledWith(@subscription.member_ids[2]).should.equal true + @UserGetter.getUser.calledWith(@subscription.member_ids[0]).should.equal true + @UserGetter.getUser.calledWith(@subscription.member_ids[1]).should.equal true + @UserGetter.getUser.calledWith(@subscription.member_ids[2]).should.equal true users.length.should.equal @subscription.member_ids.length done() it "should just return the id if the user can not be found as they may have deleted their account", (done)-> - @UserLocator.findById.callsArgWith(1) + @UserGetter.getUser.callsArgWith(1) @subscription.member_ids = ["1234", "342432", "312312"] @Handler.getPopulatedListOfMembers @adminUser_id, (err, users)=> assert.deepEqual users[0], {_id:@subscription.member_ids[0]} diff --git a/services/web/test/unit/coffee/User/UserControllerTests.coffee b/services/web/test/unit/coffee/User/UserControllerTests.coffee index c358f35b22..e815d8d701 100644 --- a/services/web/test/unit/coffee/User/UserControllerTests.coffee +++ b/services/web/test/unit/coffee/User/UserControllerTests.coffee @@ -30,8 +30,8 @@ describe "UserController", -> @UserDeleter = deleteUser: sinon.stub().callsArgWith(1) - @UserLocator = - findById: sinon.stub().callsArgWith(1, null, @user) + @UserGetter = + getUser: sinon.stub().callsArgWith(1, null, @user) @User = findById: sinon.stub().callsArgWith(1, null, @user) @NewsLetterManager = @@ -63,7 +63,7 @@ describe "UserController", -> @SudoModeHandler = clearSudoMode: sinon.stub() @UserController = SandboxedModule.require modulePath, requires: - "./UserLocator": @UserLocator + "./UserGetter": @UserGetter "./UserDeleter": @UserDeleter "./UserUpdater":@UserUpdater "../../models/User": User:@User diff --git a/services/web/test/unit/coffee/User/UserLocatorTests.coffee b/services/web/test/unit/coffee/User/UserLocatorTests.coffee deleted file mode 100644 index 0093dc7d61..0000000000 --- a/services/web/test/unit/coffee/User/UserLocatorTests.coffee +++ /dev/null @@ -1,31 +0,0 @@ -sinon = require('sinon') -chai = require('chai') -should = chai.should() -modulePath = "../../../../app/js/Features/User/UserLocator.js" -SandboxedModule = require('sandboxed-module') - -describe "UserLocator", -> - - beforeEach -> - @fakeUser = {_id:"12390i"} - @findOne = sinon.stub().callsArgWith(1, null, @fakeUser) - @Mongo = - db: users: findOne: @findOne - ObjectId: (id) -> return id - - @UserLocator = SandboxedModule.require modulePath, requires: - "../../infrastructure/mongojs": @Mongo - "metrics-sharelatex": timeAsyncMethod: sinon.stub() - 'logger-sharelatex' : { log: sinon.stub() } - - describe "findById", -> - it "should try and find a user with that id", (done)-> - _id = '123e' - @UserLocator.findById _id, (err, user)=> - @findOne.calledWith(_id: _id).should.equal true - done() - - it "should return the user if found", (done)-> - @UserLocator.findById '123e', (err, user)=> - user.should.deep.equal @fakeUser - done() diff --git a/services/web/test/unit/coffee/User/UserPagesControllerTests.coffee b/services/web/test/unit/coffee/User/UserPagesControllerTests.coffee index 529f5b1be6..a0f155846f 100644 --- a/services/web/test/unit/coffee/User/UserPagesControllerTests.coffee +++ b/services/web/test/unit/coffee/User/UserPagesControllerTests.coffee @@ -16,10 +16,7 @@ describe "UserPagesController", -> features:{} email: "joe@example.com" - @UserLocator = - findById: sinon.stub().callsArgWith(1, null, @user) - @UserGetter = - getUser: sinon.stub().callsArgWith(2, null, @user) + @UserGetter = getUser: sinon.stub() @UserSessionsManager = getAllUserSessions: sinon.stub() @dropboxStatus = {} @@ -37,7 +34,6 @@ describe "UserPagesController", -> "logger-sharelatex": log:-> err:-> - "./UserLocator": @UserLocator "./UserGetter": @UserGetter "./UserSessionsManager": @UserSessionsManager "../Errors/ErrorController": @ErrorController @@ -136,6 +132,8 @@ describe "UserPagesController", -> @UserPagesController.sessionsPage @req, @res, @next describe "settingsPage", -> + beforeEach -> + @UserGetter.getUser = sinon.stub().callsArgWith(1, null, @user) it "should render user/settings", (done)-> @res.render = (page)-> @@ -185,6 +183,7 @@ describe "UserPagesController", -> describe "activateAccountPage", -> beforeEach -> + @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @user) @req.query.user_id = @user_id @req.query.token = @token = "mock-token-123"