diff --git a/Makefile b/Makefile index 5a9a4595a08..197ef74b6a4 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,9 @@ load_initial_data: ## Load initial development fixtures. logs: ## Print and actively tail the docker compose logs. @docker-compose logs -f +cypress: ## Open cypress testing UI + @npx cypress open + pytest: ## Run pytest (Backend) @docker-compose exec -e DJANGO_SETTINGS_MODULE="app.settings" web pytest -p no:ethereum diff --git a/app/app/urls.py b/app/app/urls.py index 109a322be37..bebcb746c5f 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -159,6 +159,11 @@ name='funder_payout_reminder_modal' ), + # Rating + path('modal/rating///', dashboard.views.rating_modal, name='rating_modal'), + path('modal/rating_capture/', dashboard.views.rating_capture, name='rating_capture'), + url(r'^api/v0.1/unrated_bounties/', dashboard.views.unrated_bounties, name='unrated_bounties'), + # Notify Funder Modal Submission path( 'actions/bounty///notify/funder_payout_reminder/', @@ -383,6 +388,11 @@ path('_administration/email/quarterly_roundup', retail.emails.quarterly_roundup, name='quarterly_roundup'), path('_administration/email/new_work_submission', retail.emails.new_work_submission, name='new_work_submission'), path('_administration/email/weekly_founder_recap', retail.emails.weekly_recap, name='weekly_founder_recap'), + path( + '_administration/email/weekly_unread_notifications_email', + retail.emails.unread_notification_email_weekly_roundup, + name='unread_notifications_email_weekly_roundup' + ), path('_administration/email/new_bounty_rejection', retail.emails.new_bounty_rejection, name='new_bounty_rejection'), path( '_administration/email/new_bounty_acceptance', diff --git a/app/assets/v2/css/base.css b/app/assets/v2/css/base.css index b426380ecc4..1b63c60c8b8 100644 --- a/app/assets/v2/css/base.css +++ b/app/assets/v2/css/base.css @@ -1013,49 +1013,6 @@ input.is-invalid { width: auto; } -.rating { - width:160px; -} -.rating span { float:right; position:relative; } -.rating span input { - position:absolute; - top:0px; - left:0px; - opacity:0; -} -.rating span label { - display:inline-block; - width:30px; - height:30px; - text-align:center; - color:#FFF; - font-size:25px; - margin-right:2px; - line-height:30px; - border-radius:50%; - -webkit-border-radius:50%; -} -.rating span label i { - color:#ccc; -} - -.rating span:hover ~ span label i, -.rating span:hover label i { - opacity: 0.5; -} -.rating span.checked label i, -.rating span.checked ~ span label i -{ - opacity: 1; -} - -.rating span:hover ~ span label i, -.rating span:hover label i, -.rating span.checked label i, -.rating span.checked ~ span label i { - color: rgb(18,199,113); -} - .bounty_box { border: 5px solid white; width: 100%; diff --git a/app/assets/v2/css/forms/select.css b/app/assets/v2/css/forms/select.css index 2438daed591..12616ec4286 100644 --- a/app/assets/v2/css/forms/select.css +++ b/app/assets/v2/css/forms/select.css @@ -75,7 +75,8 @@ } /* Multi-select */ -.g-multiselect .select2-container--default .select2-selection--multiple .select2-selection__rendered li:not(.select2-search){ +.g-multiselect .select2-container--default .select2-selection--multiple .select2-selection__rendered li:not(.select2-search), +li.select2-available__choice{ align-items: center; border: 1px solid #3E00FF; background-color: #3E00FF; @@ -86,6 +87,13 @@ border-radius: 3px; } +li.select2-available__choice { + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; + cursor: pointer; +} + .g-multiselect .select2 { font-size: 12px; } @@ -154,7 +162,8 @@ display: none; } -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove, +.select2-available__choice__remove { color: #ffffff; margin-right: 10px; } diff --git a/app/assets/v2/css/gitcoin.css b/app/assets/v2/css/gitcoin.css index d1b2f51e525..495d7726a59 100644 --- a/app/assets/v2/css/gitcoin.css +++ b/app/assets/v2/css/gitcoin.css @@ -110,6 +110,18 @@ h4, color: #ffffff; } +.text-black-60 { + color: rgba(0, 0, 0, 0.6)!important; +} + +.text-black-70 { + color: rgba(0, 0, 0, 0.7)!important; +} + +.text-current { + color: currentColor !important; +} + .underline { text-decoration: underline; } diff --git a/app/assets/v2/css/leaderboard.css b/app/assets/v2/css/leaderboard.css index 40dda971655..e285ae13fcb 100644 --- a/app/assets/v2/css/leaderboard.css +++ b/app/assets/v2/css/leaderboard.css @@ -1,37 +1,4 @@ -#leaderboard .leaderboard_entry { - padding: 10px 0px; - color: black; - text-decoration: none; -} - -#leaderboard .leaderboard_entry img { - max-height: 100px; - border-radius: 50%; -} - -#leaderboard .leaderboard_entry a { - color: #8b8b8b; -} - -#leaderboard .leaderboard_entry .item-amount { - font-size: 1.5em; - font-weight: bold; - color: #86eec4; -} - -#leaderboard .leaderboard_entry .item-position { - color: #8b8b8b; -} - -#leaderboard .table-striped tbody tr:nth-of-type(2n+1) { - background-color: #f8f8f8; -} - -#leaderboard .progress_container { - padding-top: 2.5em; -} - -#leaderboard .key { +.leaderboard .key { right: 0px; display: block; position: absolute; @@ -39,170 +6,162 @@ margin-top: 5px; } -#leaderboard .podium { +.leaderboard .podium { border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; - background: #f5136e; - /* For browsers that do not support gradients */ - background: -webkit-gradient(linear, center top, center bottom, from(#f5136e), to(#0f023c)); - background: -webkit-linear-gradient(#f5136e, #0f023c); - background: -moz-linear-gradient(#f5136e, #0f023c); - background: -o-linear-gradient(#f5136e, #0f023c); - background: -ms-linear-gradient(#f5136e, #0f023c); - background: linear-gradient(#f5136e, #0f023c); + background: #150069; + justify-content: space-around; } -#leaderboard .winner { +.leaderboard .winner { position: relative; padding: 0px; - min-height: 23em; text-align: center; } -#leaderboard .winner-content { - top: 40%; - left: 30%; - position: absolute; - max-width: 45%; +.interior .body { + background-color: #140069; } -#leaderboard .winner-content .winner-position { - width: 100%; - min-height: 100px; - background-position: center; - background-repeat: no-repeat; - background-size: contain; +.leaderboard .clickable-row { + cursor: pointer; } -#leaderboard .winner-content .winner-position-first { - background-image: url('/static/v2/images/leaderboard-1.png'); +.leaderboard .winner img { + max-height: 50px; + display: flex; } -#leaderboard .winner-content .winner-position-second { - background-image: url('/static/v2/images/leaderboard-2.png'); +.leaderboard .winner h6 { + font-size: 8px; + color: #2B75D2; } -#leaderboard .winner-content .winner-position-third { - background-image: url('/static/v2/images/leaderboard-3.png'); +.leaderboard .leaderboard_entry img { + max-height: 50px; + border-radius: 50%; } -#leaderboard .winner img { - opacity: 0.5; - min-height: 23em; +thead { + color: #CECFD1; } -#leaderboard .winner img:hover { - opacity: 0.55; +tbody { + color: #5C5D5F; + font-size: 0.8rem; } -#leaderboard .winner a { - color: white; +tbody, a { + color: #5C5D5F } -#leaderboard .clickable-row { - cursor: pointer; +.leaderboard .winner a { + color: #2B75D2; } -@media (max-width: 1300px) { - #leaderboard .winner img { - min-height: 20em; - } +.leaderboard .leaderboard_entry { + padding: 10px 0px; + text-decoration: none; } -@media (max-width: 1025px) { - #leaderboard .winner-content { - left: 10%; - max-width: 70%; - } - - #leaderboard .leaderboard_entry div { - width: 30%; - } +.item-count-bounties { + display: none; +} - #leaderboard .leaderboard_entry div:nth-child(2) { - width: 30%; - } +.leaderboard h3 { + font-size: .85rem; +} - #leaderboard .leaderboard_entry div.progress { - width: 100%; - } +.tableheaders { + font-size: 0.7rem; +} - #leaderboard .winner img { - min-height: 18em; - } +.hidemobile { + visibility: hidden; } -@media (max-width: 700px) { +.leaderboard .winner img:hover { + opacity: 0.55; +} +@media (min-width: 700px) { .item-count-bounties { - display: none !important; - } - .clickable-row.d-flex .col-5{ - flex: 0 0 16.666667%; - max-width: 16.66666%; + display: block } - #leaderboard .select { - display: none; + + .podium { + justify-content: space-between; } - #leaderboard h3 { - font-size: 1.3rem; + .leaderboard .select { + display: block ; } - #leaderboard .leaderboard_entry h4 { - font-size: 22px; + .leaderboard .leaderboard_entry div { + width: 100%; } - #leaderboard .winner h2 { - font-size: 22px; + .leaderboard .leaderboard_entry div:nth-child(2) { + width: 30%; } - #leaderboard .winner h5 { - font-size: 18px; + .leaderboard .leaderboard_entry div.progress { + width: 100%; } - #leaderboard .winner-content { - top: 20%; + .leaderboard .winner h6 { + font-size: 0.5rem; } - #leaderboard .winner img { - min-height: 12em; + tbody { + font-size: 1rem ; } - #leaderboard .col-6 { - flex: 0 0 25%; - max-width: 25%; + .leaderboard h3 { + font-size: 1.2rem ; } - #leaderboard .col-2 { - flex: 0 0 30%; - max-width: 30%; - overflow-x: hidden; + .tableheaders { + font-size: 0.9rem; } - #leaderboard .progress_container { - padding-top: 1.5em; + .hidemobile{ + visibility: visible; + } + .leaderboard .winner img { + max-height: 120px; } } -@media (max-width: 481px) { - #leaderboard .leaderboard_entry h4 { - font-size: 18px; +@media (min-width: 1000px) { + .leaderboard .leaderboard_entry { + padding: 10px 0px; + text-decoration: none; + } + + .leaderboard .leaderboard_entry img { + max-height: 70px; + border-radius: 50%; } - #leaderboard .winner h2 { - font-size: 18px; + .leaderboard .winner img { + max-height: 150px; } - #leaderboard .winner h5 { - font-size: 16px; + .leaderboard .winner h6 { + font-size: 1rem ; } - #leaderboard .winner-content { - top: 20%; + tbody { + font-size: 1.5rem ; } - #leaderboard .winner img { - min-height: 6em; + .leaderboard h3 { + font-size: 1.75rem ; } + + .tableheaders { + font-size: 1rem; + } + } diff --git a/app/assets/v2/css/rating.css b/app/assets/v2/css/rating.css new file mode 100644 index 00000000000..e81c4fe0bec --- /dev/null +++ b/app/assets/v2/css/rating.css @@ -0,0 +1,88 @@ +/* stylelint-disable no-descending-specificity */ +.card-rating { + color: #0d003c; + background-color: #fff; + border-radius: 4px; + position: relative; + margin: 1rem 0.6rem; + scroll-snap-align: none start; + transition: .45s all ease-in-out; + flex-wrap: nowrap; + flex-direction: row; + flex: 0 0 24.2%; + max-width: 24.2%; + align-items: center; + font-size: 12px; + min-width: 230px; + box-shadow: 0 2px 2px 1px rgba(0, 0, 0, 0.1); +} +.card-rating .tag { + font-weight: 700; +} +.card-rating__title { + color: #000; + font-weight: 600; + font-size: 0.9rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + text-overflow: ellipsis; + overflow: hidden; + margin-bottom: 6px; +} + +.card-rating__avatar { + flex-shrink: 0; +} + +.card-rating__header { + display: flex; + background-color: #F8F9FA; + padding: 1rem .5em; + border-radius: 4px 4px 0 0; +} + +.rating { + direction: rtl; +} + +.rating--small .rating-star { + font-size: 0.6rem; +} + +.rating > input { display: none; } +.rating > .rating-star:before { + margin: 1px; + font-size: 2.35em; + font-family: 'Font Awesome\ 5 Free', sans-serif; + display: inline-block; + content: "\f005"; +} + +.rating > .half:before { + content: "\f089"; + position: absolute; +} + +.rating > .rating-star { + color: #ddd; + margin-bottom: 0; +} + +.rating > input:checked ~ .rating-star, +fieldset:not(:disabled) .rating:not(:checked) > .rating-star:hover, +fieldset:not(:disabled) .rating:not(:checked) > .rating-star:hover ~ .rating-star { + color: #25E899; + font-weight: 800; +} + +fieldset:not(:disabled) .rating > input:checked + .rating-star:hover, +fieldset:not(:disabled) .rating > input:checked ~ .rating-star:hover, +fieldset:not(:disabled) .rating > .rating-star:hover ~ input:checked ~ .rating-star, +fieldset:not(:disabled) .rating > input:checked ~ .rating-star:hover ~ .rating-star { + color: rgb(11, 253, 156); +} + +fieldset:disabled .rating { + filter: grayscale(1); +} diff --git a/app/assets/v2/css/submit_bounty.css b/app/assets/v2/css/submit_bounty.css index 7a256cadd87..947954ca79d 100644 --- a/app/assets/v2/css/submit_bounty.css +++ b/app/assets/v2/css/submit_bounty.css @@ -54,6 +54,16 @@ textarea:read-only { font-size: 13px; } +#keyword-suggestion-container { + display: flex; + align-items: center; +} + +#keyword-suggestions { + display: flex; + margin-left: 15px; +} + .revisions input { width: 35%; height: 35px; diff --git a/app/assets/v2/images/avatar/Accessories/Extras-fire.svg b/app/assets/v2/images/avatar/Accessories/Extras-fire.svg new file mode 100644 index 00000000000..77add64a242 --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/Extras-fire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Extras-necklace2.svg b/app/assets/v2/images/avatar/Accessories/Extras-necklace2.svg index f7e47dd0e49..7a9bed29c02 100644 --- a/app/assets/v2/images/avatar/Accessories/Extras-necklace2.svg +++ b/app/assets/v2/images/avatar/Accessories/Extras-necklace2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Extras-necklace3.svg b/app/assets/v2/images/avatar/Accessories/Extras-necklace3.svg index c0fa176471e..f66d88d388a 100644 --- a/app/assets/v2/images/avatar/Accessories/Extras-necklace3.svg +++ b/app/assets/v2/images/avatar/Accessories/Extras-necklace3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Glasses-monocle.svg b/app/assets/v2/images/avatar/Accessories/Glasses-monocle.svg new file mode 100644 index 00000000000..db982dfa80f --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/Glasses-monocle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/HatShort-devil.svg b/app/assets/v2/images/avatar/Accessories/HatShort-devil.svg index 779ffa39781..2423f440e31 100644 --- a/app/assets/v2/images/avatar/Accessories/HatShort-devil.svg +++ b/app/assets/v2/images/avatar/Accessories/HatShort-devil.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/HatShort-fez.svg b/app/assets/v2/images/avatar/Accessories/HatShort-fez.svg new file mode 100644 index 00000000000..0950069c8b8 --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/HatShort-fez.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/HatShort-mexican.svg b/app/assets/v2/images/avatar/Accessories/HatShort-mexican.svg new file mode 100644 index 00000000000..5d3ac01f09c --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/HatShort-mexican.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/HatShort-police.svg b/app/assets/v2/images/avatar/Accessories/HatShort-police.svg new file mode 100644 index 00000000000..f90f05f5aa5 --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/HatShort-police.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/HatShort-sleepy.svg b/app/assets/v2/images/avatar/Accessories/HatShort-sleepy.svg index 31f46dd0fb8..d37324bb8d4 100644 --- a/app/assets/v2/images/avatar/Accessories/HatShort-sleepy.svg +++ b/app/assets/v2/images/avatar/Accessories/HatShort-sleepy.svg @@ -1,111 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Masks-gitcoinbot.svg b/app/assets/v2/images/avatar/Accessories/Masks-gitcoinbot.svg index 8a5ed7ea6e0..9e6ef424228 100644 --- a/app/assets/v2/images/avatar/Accessories/Masks-gitcoinbot.svg +++ b/app/assets/v2/images/avatar/Accessories/Masks-gitcoinbot.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Masks-hockey.svg b/app/assets/v2/images/avatar/Accessories/Masks-hockey.svg new file mode 100644 index 00000000000..c09f4f7303d --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/Masks-hockey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Masks-power.svg b/app/assets/v2/images/avatar/Accessories/Masks-power.svg index b9f5da9f536..dd8d1615beb 100644 --- a/app/assets/v2/images/avatar/Accessories/Masks-power.svg +++ b/app/assets/v2/images/avatar/Accessories/Masks-power.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Accessories/Masks-snorkel.svg b/app/assets/v2/images/avatar/Accessories/Masks-snorkel.svg new file mode 100644 index 00000000000..4616a980af4 --- /dev/null +++ b/app/assets/v2/images/avatar/Accessories/Masks-snorkel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Clothing/shirtsweater-4242F4.svg b/app/assets/v2/images/avatar/Clothing/shirtsweater-4242F4.svg index 50ad55267c8..ad3feac7a9d 100644 --- a/app/assets/v2/images/avatar/Clothing/shirtsweater-4242F4.svg +++ b/app/assets/v2/images/avatar/Clothing/shirtsweater-4242F4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Clothing/shirtsweater-43B9F9.svg b/app/assets/v2/images/avatar/Clothing/shirtsweater-43B9F9.svg index 5334396e7a7..2190ab2c87f 100644 --- a/app/assets/v2/images/avatar/Clothing/shirtsweater-43B9F9.svg +++ b/app/assets/v2/images/avatar/Clothing/shirtsweater-43B9F9.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Clothing/shirtsweater-684A23.svg b/app/assets/v2/images/avatar/Clothing/shirtsweater-684A23.svg index 8a0f50430da..9591868808a 100644 --- a/app/assets/v2/images/avatar/Clothing/shirtsweater-684A23.svg +++ b/app/assets/v2/images/avatar/Clothing/shirtsweater-684A23.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Clothing/shirtsweater-CCCCCC.svg b/app/assets/v2/images/avatar/Clothing/shirtsweater-CCCCCC.svg index f09b1d69395..83dc2899a38 100644 --- a/app/assets/v2/images/avatar/Clothing/shirtsweater-CCCCCC.svg +++ b/app/assets/v2/images/avatar/Clothing/shirtsweater-CCCCCC.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Clothing/shirtsweater-F48914.svg b/app/assets/v2/images/avatar/Clothing/shirtsweater-F48914.svg index 1382852cbcc..ee4836a6f22 100644 --- a/app/assets/v2/images/avatar/Clothing/shirtsweater-F48914.svg +++ b/app/assets/v2/images/avatar/Clothing/shirtsweater-F48914.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/avatar/Clothing/shirtsweater-FFCC3B.svg b/app/assets/v2/images/avatar/Clothing/shirtsweater-FFCC3B.svg index 2e0add47355..41b955b8b59 100644 --- a/app/assets/v2/images/avatar/Clothing/shirtsweater-FFCC3B.svg +++ b/app/assets/v2/images/avatar/Clothing/shirtsweater-FFCC3B.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/assets/v2/images/emails/email-notification-bell.png b/app/assets/v2/images/emails/email-notification-bell.png new file mode 100644 index 00000000000..db9538131bd Binary files /dev/null and b/app/assets/v2/images/emails/email-notification-bell.png differ diff --git a/app/assets/v2/images/emails/rate-capture.png b/app/assets/v2/images/emails/rate-capture.png new file mode 100644 index 00000000000..2c4bc206cc8 Binary files /dev/null and b/app/assets/v2/images/emails/rate-capture.png differ diff --git a/app/assets/v2/images/rate-capture.svg b/app/assets/v2/images/rate-capture.svg new file mode 100644 index 00000000000..db45b4eb10e --- /dev/null +++ b/app/assets/v2/images/rate-capture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/v2/js/capture-rating.js b/app/assets/v2/js/capture-rating.js new file mode 100644 index 00000000000..0c8d78ff99d --- /dev/null +++ b/app/assets/v2/js/capture-rating.js @@ -0,0 +1,56 @@ +const checkUnrated = () => { + let today = new Date(); + let lastPromp = new Date(localStorage.getItem('rateCapture')) || 0; + let numDays = 7; + + if (!daysBetween(lastPromp, today, numDays)) { + return; + } + + let requestUnrated = fetchData ('/api/v0.1/unrated_bounties/', 'GET'); + + $.when(requestUnrated).then((response, status, statusCode) => { + if (statusCode.status != 200) { + return _alert(response.msg, 'error'); + } + + if (response.unrated > 0) { + ratingCaptureModal(); + localStorage.setItem('rateCapture', new Date()); + } + + }); +}; + +const daysBetween = (d1, d2, numDays) => { + let diff = Math.abs(d1.getTime() - d2.getTime()); + + diff = diff / (1000 * 60 * 60 * 24); + + if (diff >= numDays) { + return true; + } + return false; + +}; + +const ratingCaptureModal = () => { + let modalUrl = '/modal/rating_capture'; + + $.ajax({ + url: modalUrl, + type: 'GET', + cache: false + }).done(function(result) { + $('body').append(result); + $('#modalRating').bootstrapModal('show'); + + }); + + $(document, '#modalRating').on('hidden.bs.modal', function(e) { + $('#modalRating').remove(); + $('#modalRating').bootstrapModal('dispose'); + }); +}; + +checkUnrated(); diff --git a/app/assets/v2/js/pages/bounty_details.js b/app/assets/v2/js/pages/bounty_details.js index eef81b02df9..b34da67c92d 100644 --- a/app/assets/v2/js/pages/bounty_details.js +++ b/app/assets/v2/js/pages/bounty_details.js @@ -642,8 +642,6 @@ var show_interest_modal = function() { modals.on('show.bs.modal', function() { modalBody.load(modalUrl, ()=> { if (document.result['repo_type'] === 'private') { - $('#nda-upload').show(); - $('#issueNDA').prop('required', true); document.result.unsigned_nda ? $('.nda-download-link').attr('href', document.result.unsigned_nda.doc) : $('#nda-upload').hide(); } @@ -656,18 +654,21 @@ var show_interest_modal = function() { event.preventDefault(); let msg = issueMessage.val().trim(); - let issueNDA = $('#issueNDA')[0].files; if (!msg || msg.length < 30) { _alert({message: gettext('Please provide an action plan for this ticket. (min 30 chars)')}, 'error'); return false; } - if (typeof issueNDA[0] !== 'undefined') { + const issueNDA = document.result['repo_type'] === 'private' ? $('#issueNDA')[0].files : undefined; + + if (issueNDA && typeof issueNDA[0] !== 'undefined') { + const formData = new FormData(); formData.append('docs', issueNDA[0]); formData.append('doc_type', 'signed_nda'); + const ndaSend = { url: '/api/v0.1/bountydocument', method: 'POST', @@ -764,9 +765,8 @@ const repoInstructions = () => { var set_extended_time_html = function(extendedDuration, currentExpires) { currentExpires.setTime(currentExpires.getTime() + (extendedDuration * 1000)); $('input[name=updatedExpires]').val(currentExpires.getTime()); - var date = getFormattedDate(currentExpires); - var days = timeDifference(now, currentExpires).split(' '); - var time = getTimeFromDate(currentExpires); + const date = getFormattedDate(currentExpires); + let days = timeDifference(now, currentExpires).split(' '); days.shift(); days = days.join(' '); diff --git a/app/assets/v2/js/pages/bulk_payout.js b/app/assets/v2/js/pages/bulk_payout.js index 80f3f79904b..90286d59e8f 100644 --- a/app/assets/v2/js/pages/bulk_payout.js +++ b/app/assets/v2/js/pages/bulk_payout.js @@ -2,6 +2,13 @@ const round = function(num, decimals) { return Math.round(num * 10 ** decimals) / 10 ** decimals; }; + +const rateUser = (elem) => { + let userSelected = $(elem).select2('data')[0].text; + + $(elem).parents('.new-user').next().find('[data-open-rating]').data('openUsername', userSelected.trim()); +}; + const normalizeUsername = function(username) { if (username.indexOf('@') != 0) { return '@' + username; @@ -36,7 +43,8 @@ $(document).ready(function($) { $(document).on('click', '.remove', function(event) { event.preventDefault(); - $(this).parents('tr').remove(); + $(this).parents('.new-user').next('tr').remove(); + $(this).parents('.new-user').remove(); $(this).focus(); update_registry(); }); @@ -156,25 +164,52 @@ $(document).ready(function($) { }; var add_row = function() { - var num_rows = $('#payout_table tbody').find('tr').length; + let bountyId = $('#bountyId').val(); + var num_rows = $('#payout_table tbody').find('tr.new-user').length; var percent = num_rows <= 1 ? 100 : ''; var denomination = $('#token_name').text(); var amount = get_amount(percent); + let username = ''; var html = ` - +
-
` + percent + `
-
` + amount + ' ' + denomination + `
+
${percent}
+
${amount} ${denomination}
+ + + +
+ +
+ + + + + + + + + + +
+
+ `; $('#payout_table tbody').append(html); userSearch('.username-search:last', true); + $('body .username-search').each(function() { + $(this).on('select2:select', event => { + rateUser($(this)); + }); + }); + $(this).focus(); }; @@ -185,11 +220,12 @@ $(document).ready(function($) { $('.add_another').on('click', function() { add_row(); }); + }); }); var get_total_cost = function() { - var rows = $('#payout_table tbody tr'); + var rows = $('#payout_table tbody tr.new-user'); var total = 0; for (i = 0; i < rows.length; i += 1) { @@ -213,8 +249,8 @@ var update_registry = function(coinbase) { }); return; } - - var num_rows = $('#payout_table tbody').find('tr').length; + + var num_rows = $('#payout_table tbody').find('tr.new-user').length; var tc = round(get_total_cost(), 2); var denomination = $('#token_name').text(); var original_amount = $('#original_amount').val(); @@ -222,11 +258,11 @@ var update_registry = function(coinbase) { var over = round((original_amount - get_total_cost()) * -1, 4); var addr = coinbase.substring(38); var pay_with_bounty = $('#pay_with_bounty').is(':checked'); - + $('#total_cost').html(tc + ' ' + denomination); let transactions = []; - + first_transaction = { 'id': 0, 'type': 'cancel', @@ -269,7 +305,7 @@ var update_registry = function(coinbase) { for (let j = 1; j <= num_rows; j++) { - var $row = $('#payout_table tbody').find('tr:nth-child(' + j + ')'); + var $row = $('#payout_table tbody').find('.new-user:nth-child(' + j + ')'); var amount = parseFloat($row.find('.amount').text()); var username = $row.find('.username-search').text(); diff --git a/app/assets/v2/js/pages/dashboard.js b/app/assets/v2/js/pages/dashboard.js index 7f49f2b432d..d997a80aad8 100644 --- a/app/assets/v2/js/pages/dashboard.js +++ b/app/assets/v2/js/pages/dashboard.js @@ -74,9 +74,7 @@ function debounce(func, wait, immediate) { }; } -var scrub = function(v) { - return v.replace(/[\W]+/g, ''); -}; +const scrub = value => value.replace(/[\W]+/g, ''); /** * Fetches all filters options from the URI diff --git a/app/assets/v2/js/pages/fulfill_bounty.js b/app/assets/v2/js/pages/fulfill_bounty.js index bdc93c7c28b..edf49c1589b 100644 --- a/app/assets/v2/js/pages/fulfill_bounty.js +++ b/app/assets/v2/js/pages/fulfill_bounty.js @@ -117,7 +117,6 @@ window.onload = function() { txid: result }); - var submitCommentUrl = '/postcomment/'; var finishedComment = function() { dataLayer.push({ event: 'claimissue' }); _alert({ message: gettext('Fulfillment submitted to web3.') }, 'info'); @@ -125,20 +124,8 @@ window.onload = function() { document.location.href = '/funding/details?url=' + issueURL; }, 1000); }; - var ratVal = $('input:radio[name=rating]:checked').val(); - var revVal = $('#review').val(); - - $.post(submitCommentUrl, { - 'github_url': issueURL, - 'network': $('input[name=network]').val(), - 'standard_bounties_id': $('input[name=standard_bounties_id]').val(), - 'review': { - 'rating': ratVal ? ratVal : -1, - 'comment': revVal ? revVal : 'No comment given.', - 'reviewType': 'worker', - 'receiver': '' - } - }, finishedComment, 'json'); + + finishedComment(); }; if (error) { diff --git a/app/assets/v2/js/pages/process_bounty.js b/app/assets/v2/js/pages/process_bounty.js index b995e7a9cb1..173ec96f8d5 100644 --- a/app/assets/v2/js/pages/process_bounty.js +++ b/app/assets/v2/js/pages/process_bounty.js @@ -1,6 +1,17 @@ /* eslint-disable no-console */ window.onload = function() { + const rateUser = () => { + let userSelected = $('#bountyFulfillment').select2('data')[0].text; + + $('[data-open-rating]').data('openUsername', userSelected.trim()); + }; + + + $('#bountyFulfillment').on('select2:select', event => { + rateUser(); + }); + // Check Radio-box $('.rating input:radio').attr('checked', false); @@ -222,28 +233,14 @@ window.onload = function() { _alert({ message: gettext('Submitted transaction to web3, saving comment(s)...') }, 'info'); - var submitCommentUrl = '/postcomment/'; var finishedComment = function() { _alert({ message: gettext('Submitted transaction to web3.') }, 'info'); setTimeout(() => { document.location.href = '/funding/details?url=' + issueURL; }, 1000); }; - var ratVal = $('input:radio[name=rating]:checked').val(); - var revVal = $('#review').val(); - - $.post(submitCommentUrl, { - 'github_url': issueURL, - 'network': $('input[name=network]').val(), - 'standard_bounties_id': $('input[name=standard_bounties_id]').val(), - 'review': { - 'rating': ratVal ? ratVal : -1, - 'comment': revVal ? revVal : 'No comment given.', - 'reviewType': 'approver', - 'receiver': getSelectedFulfillment().getAttribute('username') - } - }, finishedComment, 'json'); + finishedComment(); }; if (error) { @@ -315,6 +312,7 @@ window.onload = function() { } } ); + rateUser(); }, 100); }; diff --git a/app/assets/v2/js/rating.js b/app/assets/v2/js/rating.js new file mode 100644 index 00000000000..f7c53687e81 --- /dev/null +++ b/app/assets/v2/js/rating.js @@ -0,0 +1,42 @@ +$('body').on('click', '[data-open-rating] input', function(e) { + ratingModal($(this).parent().data('openRating'), $(this).parent().data('openUsername'), $(this)); +}); + +const ratingModal = (bountyId, receiver, elem) => { + let modalUrl = `/modal/rating/${bountyId}/${receiver}`; + + $.ajax({ + url: modalUrl, + type: 'GET', + cache: false + }).done(function(result) { + $('body').append(result); + $('#modalRating').bootstrapModal('show'); + $('[data-toggle="tooltip"]').runTooltip(); + $('input[name="review[rating]"]').filter('[value="' + elem.val() + '"]').prop('checked', true); + + $('#ratingForm').on('submit', function(e) { + e.preventDefault(); + let data = $(this).serializeArray(); + let sendRating = fetchData ('/postcomment/', 'POST', data); + + $.when(sendRating).then(response => { + if (!response.success) { + return _alert(response.msg, 'error'); + } + elem.closest('fieldset').attr('disabled', true); + + $('#modalRating').bootstrapModal('hide'); + return _alert({message: gettext('Thanks for your feedback.')}, 'info'); + }); + }); + }); + + $(document, '#modalRating').on('hidden.bs.modal', function(e) { + let value = $('input[name="review[rating]"]:checked').val(); + + elem.siblings('input').filter('[value="' + value + '"]').prop('checked', true); + $('#modalRating').remove(); + $('#modalRating').bootstrapModal('dispose'); + }); +}; diff --git a/app/assets/v2/js/shared.js b/app/assets/v2/js/shared.js index bebea749ab2..502b79d35bc 100644 --- a/app/assets/v2/js/shared.js +++ b/app/assets/v2/js/shared.js @@ -639,6 +639,24 @@ var updateAmountUI = function(target_ele, usd_amount) { target_ele.html('Approx: ' + usd_amount + ' USD'); }; +const showChoices = (choice_id, selector_id, choices) => { + let html = ''; + let selected_choices = []; + + for (let i = 0; i < choices.length; i++) { + html += '
  • \ + ×\ + ' + choices[i] + '\ +
  • '; + } + $(choice_id).html(html); + $('.select2-available__choice').on('click', function() { + selected_choices.push($(this).find('.text').text()); + $(selector_id).val(selected_choices).trigger('change'); + $(this).remove(); + }); +}; + var retrieveIssueDetails = function() { var ele = $('input[name=issueURL]'); var target_eles = { @@ -663,7 +681,7 @@ var retrieveIssueDetails = function() { if (result['keywords']) { var keywords = result['keywords']; - $('#keywords').val(keywords); + showChoices('#keyword-suggestions', '#keywords', keywords); $('#keywords').select2({ placeholder: 'Select tags', data: keywords, diff --git a/app/avatar/templates/accessories/extras/fire.txt b/app/avatar/templates/accessories/extras/fire.txt new file mode 100644 index 00000000000..77add64a242 --- /dev/null +++ b/app/avatar/templates/accessories/extras/fire.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/accessories/extras/necklace2.txt b/app/avatar/templates/accessories/extras/necklace2.txt index 8d6d1215ed7..7a9bed29c02 100644 --- a/app/avatar/templates/accessories/extras/necklace2.txt +++ b/app/avatar/templates/accessories/extras/necklace2.txt @@ -1,131 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/avatar/templates/accessories/extras/necklace3.txt b/app/avatar/templates/accessories/extras/necklace3.txt index 007b484e1a9..f66d88d388a 100644 --- a/app/avatar/templates/accessories/extras/necklace3.txt +++ b/app/avatar/templates/accessories/extras/necklace3.txt @@ -1,159 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/avatar/templates/accessories/glasses/monocle.txt b/app/avatar/templates/accessories/glasses/monocle.txt new file mode 100644 index 00000000000..db982dfa80f --- /dev/null +++ b/app/avatar/templates/accessories/glasses/monocle.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/accessories/hat/devil.txt b/app/avatar/templates/accessories/hat/devil.txt index fb657f80ccb..2423f440e31 100644 --- a/app/avatar/templates/accessories/hat/devil.txt +++ b/app/avatar/templates/accessories/hat/devil.txt @@ -1,75 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/avatar/templates/accessories/hat/fez.txt b/app/avatar/templates/accessories/hat/fez.txt new file mode 100644 index 00000000000..0950069c8b8 --- /dev/null +++ b/app/avatar/templates/accessories/hat/fez.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/accessories/hat/mexican.txt b/app/avatar/templates/accessories/hat/mexican.txt new file mode 100644 index 00000000000..5d3ac01f09c --- /dev/null +++ b/app/avatar/templates/accessories/hat/mexican.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/accessories/hat/police.txt b/app/avatar/templates/accessories/hat/police.txt new file mode 100644 index 00000000000..f90f05f5aa5 --- /dev/null +++ b/app/avatar/templates/accessories/hat/police.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/accessories/hat/sleepy.txt b/app/avatar/templates/accessories/hat/sleepy.txt index 31f46dd0fb8..d37324bb8d4 100644 --- a/app/avatar/templates/accessories/hat/sleepy.txt +++ b/app/avatar/templates/accessories/hat/sleepy.txt @@ -1,111 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/avatar/templates/accessories/masks/gitcoinbot.txt b/app/avatar/templates/accessories/masks/gitcoinbot.txt index aaa7632ff84..9e6ef424228 100644 --- a/app/avatar/templates/accessories/masks/gitcoinbot.txt +++ b/app/avatar/templates/accessories/masks/gitcoinbot.txt @@ -1,34 +1 @@ - - - - Artboard - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/avatar/templates/accessories/masks/hockey.txt b/app/avatar/templates/accessories/masks/hockey.txt new file mode 100644 index 00000000000..c09f4f7303d --- /dev/null +++ b/app/avatar/templates/accessories/masks/hockey.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/accessories/masks/power.txt b/app/avatar/templates/accessories/masks/power.txt index c8bcd32d003..dd8d1615beb 100644 --- a/app/avatar/templates/accessories/masks/power.txt +++ b/app/avatar/templates/accessories/masks/power.txt @@ -1,91 +1 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/avatar/templates/accessories/masks/snorkel.txt b/app/avatar/templates/accessories/masks/snorkel.txt new file mode 100644 index 00000000000..4616a980af4 --- /dev/null +++ b/app/avatar/templates/accessories/masks/snorkel.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/avatar/templates/clothing/shirtsweater.txt b/app/avatar/templates/clothing/shirtsweater.txt index f45cd25ae41..83dc2899a38 100644 --- a/app/avatar/templates/clothing/shirtsweater.txt +++ b/app/avatar/templates/clothing/shirtsweater.txt @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/avatar/utils.py b/app/avatar/utils.py index 0e5ee63d614..a1d2f3d3e38 100644 --- a/app/avatar/utils.py +++ b/app/avatar/utils.py @@ -232,7 +232,9 @@ def get_avatar_context(): ['HatShort-captain'], ['HatShort-beanie'], ['Masks-egypt'], ['HatShort-nefertiti'], ['Masks-frankenstein'], ['Masks-diving'], ['HatShort-1'], ['HatShort-artist'], ['HatShort-pirate'], ['HatShort-grad'], ['HatShort-antlers'], ['Extras-sword'], - ['Masks-pirate'], ['Extras-bird'], + ['Masks-pirate'], ['Extras-bird'], ['Extras-fire'], ['Masks-hockey'], + ['Masks-snorkel'], ['Glasses-monocle'], ['HatShort-police'], ['HatShort-mexican'], + ['HatShort-fez'], ), 'paid_options': { 'Extras-Parrot': 0.01, diff --git a/app/dashboard/migrations/0027_auto_20190401_1349.py b/app/dashboard/migrations/0027_auto_20190401_1349.py new file mode 100644 index 00000000000..1d50670ffeb --- /dev/null +++ b/app/dashboard/migrations/0027_auto_20190401_1349.py @@ -0,0 +1,38 @@ +# Generated by Django 2.1.7 on 2019-04-01 13:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dashboard', '0026_auto_20190328_1314'), + ] + + operations = [ + migrations.AddField( + model_name='feedbackentry', + name='code_quality_rating', + field=models.SmallIntegerField(blank=True, default=0), + ), + migrations.AddField( + model_name='feedbackentry', + name='communication_rating', + field=models.SmallIntegerField(blank=True, default=0), + ), + migrations.AddField( + model_name='feedbackentry', + name='recommendation_rating', + field=models.SmallIntegerField(blank=True, default=0), + ), + migrations.AddField( + model_name='feedbackentry', + name='satisfaction_rating', + field=models.SmallIntegerField(blank=True, default=0), + ), + migrations.AddField( + model_name='feedbackentry', + name='speed_rating', + field=models.SmallIntegerField(blank=True, default=0), + ), + ] diff --git a/app/dashboard/models.py b/app/dashboard/models.py index 1e02e7b04b0..cb2f8a2983a 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -1922,6 +1922,29 @@ def get_sent_kudos(self): return kudos_transfers + + @property + def get_average_star_rating(self): + """Returns the average star ratings (overall and individual topic) + for a particular user""" + + feedbacks = FeedbackEntry.objects.filter(receiver_profile=self).all() + average_rating = {} + average_rating['overall'] = sum([feedback.rating for feedback in feedbacks]) \ + / feedbacks.count() if feedbacks.count() != 0 else 0 + average_rating['code_quality_rating'] = sum([feedback.code_quality_rating for feedback in feedbacks]) \ + / feedbacks.count() if feedbacks.count() != 0 else 0 + average_rating['communication_rating'] = sum([feedback.communication_rating for feedback in feedbacks]) \ + / feedbacks.count() if feedbacks.count() != 0 else 0 + average_rating['recommendation_rating'] = sum([feedback.recommendation_rating for feedback in feedbacks]) \ + / feedbacks.count() if feedbacks.count() != 0 else 0 + average_rating['satisfaction_rating'] = sum([feedback.satisfaction_rating for feedback in feedbacks]) \ + / feedbacks.count() if feedbacks.count() != 0 else 0 + average_rating['speed_rating'] = sum([feedback.speed_rating for feedback in feedbacks]) \ + / feedbacks.count() if feedbacks.count() != 0 else 0 + return average_rating + + @property def get_my_verified_check(self): verification = UserVerificationModel.objects.filter(user=self.user).first() @@ -3027,6 +3050,11 @@ class FeedbackEntry(SuperModel): null=True ) rating = models.SmallIntegerField(blank=True, default=0) + satisfaction_rating = models.SmallIntegerField(blank=True, default=0) + communication_rating = models.SmallIntegerField(blank=True, default=0) + speed_rating = models.SmallIntegerField(blank=True, default=0) + code_quality_rating = models.SmallIntegerField(blank=True, default=0) + recommendation_rating = models.SmallIntegerField(blank=True, default=0) comment = models.TextField(default='', blank=True) feedbackType = models.TextField(default='', blank=True, max_length=20) diff --git a/app/dashboard/templates/addinterest.html b/app/dashboard/templates/addinterest.html index f229e468623..70ca4f2a9f1 100644 --- a/app/dashboard/templates/addinterest.html +++ b/app/dashboard/templates/addinterest.html @@ -26,18 +26,20 @@
    {% trans "Submit a Plan" %}
    {% if user_logged_in %}
    -
    diff --git a/app/dashboard/templates/bulk_payout_bounty.html b/app/dashboard/templates/bulk_payout_bounty.html index a72879fc46e..4e2da999c80 100644 --- a/app/dashboard/templates/bulk_payout_bounty.html +++ b/app/dashboard/templates/bulk_payout_bounty.html @@ -23,6 +23,7 @@ {% include 'shared/current_profile.html' %} + @@ -67,6 +68,7 @@

    {% trans "Advanced Payout" %}

    +
    @@ -146,7 +148,7 @@
    {% trans 'Payout Preview' %}
    {% trans "Payout Bounty" %}
    -
    +
    {% trans "Where is my Eth Going?" %}
    @@ -176,6 +178,19 @@
    {% trans 'Payout Preview' %}
    + + + + + diff --git a/app/dashboard/templates/dashboard/index.html b/app/dashboard/templates/dashboard/index.html index a446b26103d..9e30522ccf3 100644 --- a/app/dashboard/templates/dashboard/index.html +++ b/app/dashboard/templates/dashboard/index.html @@ -105,7 +105,7 @@

    {% trans "No results found." %}

    {% include 'shared/footer.html' %} {% include 'shared/messages.html' %} - + + - + + + + + diff --git a/app/dashboard/templates/profiles/profile.html b/app/dashboard/templates/profiles/profile.html index a8b197ceb6a..cc72fb75054 100644 --- a/app/dashboard/templates/profiles/profile.html +++ b/app/dashboard/templates/profiles/profile.html @@ -12,6 +12,8 @@ + + {% include 'shared/tag_manager_2.html' %} @@ -117,9 +119,9 @@

    {% if scoreboard_position_contributor %} - #{{ scoreboard_position_contributor }} + #{{ scoreboard_position_contributor }} {% else %} -   +   {% endif %} {% trans "Contributor" %}
    @@ -153,9 +155,9 @@

    {% if scoreboard_position_funder %} - #{{ scoreboard_position_funder }} + #{{ scoreboard_position_funder }} {% else %} -   +   {% endif %} {% trans "Funder" %}
    @@ -195,9 +197,9 @@

    {% endif %} + {% include "shared/rate_bounties.html" %}

    -
    {% if hidden %} {% include 'profiles/hidden.html' %} @@ -288,15 +290,19 @@

    - + + - + \ No newline at end of file + diff --git a/app/grants/templates/grants/index.html b/app/grants/templates/grants/index.html index d01b3400907..780e3e93fd5 100644 --- a/app/grants/templates/grants/index.html +++ b/app/grants/templates/grants/index.html @@ -214,7 +214,7 @@

    {% trans "This is not t - + + {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' %} diff --git a/app/inbox/templates/inbox.html b/app/inbox/templates/inbox.html index f26027bfe7e..d003d1cd0ab 100644 --- a/app/inbox/templates/inbox.html +++ b/app/inbox/templates/inbox.html @@ -88,7 +88,7 @@ {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' with slim=1 %} - + diff --git a/app/kudos/templates/kudos_about.html b/app/kudos/templates/kudos_about.html index ccb3eb867bb..6e44dc7a99d 100644 --- a/app/kudos/templates/kudos_about.html +++ b/app/kudos/templates/kudos_about.html @@ -420,7 +420,7 @@

    I have another question and it's not listed here.
    {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' with slim=1 %} - + - + diff --git a/app/kudos/templates/kudos_marketplace.html b/app/kudos/templates/kudos_marketplace.html index 3e124ef2030..2cf9d4e636f 100644 --- a/app/kudos/templates/kudos_marketplace.html +++ b/app/kudos/templates/kudos_marketplace.html @@ -53,7 +53,7 @@

    UH-OH!

    // UUDDLRLRBA const KONAMI_CODE = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]; document.addEventListener('keydown', (e) => { - cursor = (e.keyCode == KONAMI_CODE[cursor]) ? cursor + 1 : 0; + cursor = (e.keyCode == KONAMI_CODE[cursor]) ? cursor + 1 : 0; if (cursor == KONAMI_CODE.length) activate(window.location.search); }); @@ -76,7 +76,7 @@

    UH-OH!

    } } - +
    {% for listing in listings %}
    @@ -105,7 +105,7 @@

    UH-OH!

    {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' with slim=1 %} - + - + - \ No newline at end of file + diff --git a/app/retail/templates/leaderboard.html b/app/retail/templates/leaderboard.html index 36ebc8ae796..bffd055deeb 100644 --- a/app/retail/templates/leaderboard.html +++ b/app/retail/templates/leaderboard.html @@ -17,140 +17,149 @@ {% include 'shared/nav.html' %}
    -
    -
    -
    -
    - {% for podium_item in podium_items %} -
    - {% if not is_linked_to_profile %} - - {% endif %} -
    -
    +
    +
    + + +
    +
    + {% for podium_item in podium_items %} +
    + {% if not is_linked_to_profile %} + + + + {% endif %} + +
    {% if forloop.counter == 1 %} -
    - {% else %} - {% if forloop.counter == 2 %} -
    + + {% endif %} + {% if not is_linked_to_profile %} + + {{ podium_item.at_ify_username }} + {% else %} - {% if forloop.counter == 3 %} -
    - {% endif %}{% endif %}{% endif %} + {{ podium_item.at_ify_username }} + {% endif %} +
    -
    -
    - {% if not is_linked_to_profile %} - - {{podium_item.at_ify_username}} - - {% else %} - {{podium_item.at_ify_username}} - {% endif %} -
    -

    ${{podium_item.amount|floatformat:0}}

    -
    -
    -
    - {% endfor %} + {% endfor %}
    -
    -
    -

    {{title}} Alpha

    -
    -
    -
    - {% if technologies|length > 0%} - - {%endif%} +
    + + + +
    + +
    +
    +
    + + + +
    +

    {{ title }}

    +
    +
    +
    + {% if technologies|length > 0 %} + + {%endif%} +
    +
    + + + +
    +
    + +
    +
    -
    -
    -
    - -
    -
    -
    + + + {% endif %} - {% if items|length == 0 %} -
    - {% trans "None found." %}
    - {% endif %} - - - - {% for item in items %} - - - - - - - - - {% endfor %} - -
    #{{forloop.counter}} - {% if not is_linked_to_profile %} - - {% endif %} - - {% if not is_linked_to_profile %} - - {{item.at_ify_username}} - - {% else %} - {{item.at_ify_username}} - {% endif %} - -
    - {% with forloop.counter0 as index %} -
    -
    - {% endwith %} -
    -
    - {{item.count}} tx - - ${{item.amount|floatformat:2|intcomma}} -
    +
    +
    - + {% include 'shared/bottom_notification.html' %} {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' %} {% include 'shared/footer.html' %} {% include 'shared/messages.html' %} - + - + - + - + diff --git a/app/retail/templates/shared/nav.html b/app/retail/templates/shared/nav.html index 94d5d42051b..4d171962f0b 100644 --- a/app/retail/templates/shared/nav.html +++ b/app/retail/templates/shared/nav.html @@ -62,6 +62,7 @@
    {% trans "Issue Explorer" %} + {% trans "Leaderboard" %} {% if not user.is_authenticated %} Slack ({{num_slack}}) diff --git a/cypress.json b/cypress.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/cypress.json @@ -0,0 +1 @@ +{} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 00000000000..da18d9352a1 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/cypress/integration/test_visit.js b/cypress/integration/test_visit.js new file mode 100644 index 00000000000..922affb19aa --- /dev/null +++ b/cypress/integration/test_visit.js @@ -0,0 +1,51 @@ +// TODO: commented out tests require github login support + +describe('Visit Tests', function() { + it('Visits the Explorer', function() { + cy.visit('http://localhost:8000/explorer'); + }); + it('Visits the Grants Page', function() { + cy.visit('http://localhost:8000/grants'); + }); + it('Visits the Landing Page', function() { + cy.visit('http://localhost:8000/'); + }); + it('Visits the Kudos Page', function() { + cy.visit('http://localhost:8000/kudos'); + }); + it('Visits the Kudos Marketplace', function() { + cy.visit('http://localhost:8000/kudos/marketplace'); + }); + /* + it('Visits the Kudos Sender', function() { + cy.visit('http://localhost:8000/kudos/send'); + cy.url().should('contain', 'github.com'); + }); + */ + it('Visits the Labs Page', function() { + cy.visit('http://localhost:8000/explorer'); + }); + it('Visits the About Page', function() { + cy.visit('http://localhost:8000/about'); + }); + it('Visits the Mission Page', function() { + cy.visit('http://localhost:8000/mission'); + }); + /* + it('Visits the Results Page', function() { + cy.visit('http://localhost:8000/results'); + }); + */ + it('Visits the Activity Page', function() { + cy.visit('http://localhost:8000/activity'); + }); + it('Visits the Help Page', function() { + cy.visit('http://localhost:8000/help'); + }); + it('Visits the Terms of Service Page', function() { + cy.visit('http://localhost:8000/legal/terms'); + }); + it('Visits the Privacy Page', function() { + cy.visit('http://localhost:8000/legal/privacy'); + }); +}); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 00000000000..dffed2532f2 --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,17 @@ +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +}; diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 00000000000..c1f5a772e2b --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add("login", (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This is will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 00000000000..5f0dcb89f79 --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,26 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; + +// Alternatively you can use CommonJS syntax: +// require('./commands') + +Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false; +}); diff --git a/docs/RUNNING_LOCALLY_DOCKER.md b/docs/RUNNING_LOCALLY_DOCKER.md index 34e635d4277..5d1033b22ff 100644 --- a/docs/RUNNING_LOCALLY_DOCKER.md +++ b/docs/RUNNING_LOCALLY_DOCKER.md @@ -94,6 +94,12 @@ make tests # docker-compose exec -e DJANGO_SETTINGS_MODULE=app.settings web pyte The above make command will run `eslint` and `pytest`. +You can also run the Cypress regression tests by opening the Cypress UI by running: + +```shell +make cypress +``` + #### Fresh rebuild `Q: My environment is erroring out due to missing modules/packages or postgresql errors. How can I fix it?` diff --git a/package-lock.json b/package-lock.json index b16bd3ab881..24d1ca6654a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,6 +160,116 @@ "to-fast-properties": "^2.0.0" } }, + "@cypress/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -337,6 +447,21 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -349,6 +474,21 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.4.0.tgz", + "integrity": "sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE=", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -369,6 +509,18 @@ "postcss-value-parser": "^3.3.1" } }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, "bail": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", @@ -436,6 +588,21 @@ } } }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -486,6 +653,18 @@ "node-releases": "^1.1.11" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -503,6 +682,15 @@ "unset-value": "^1.0.0" } }, + "cachedir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz", + "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -564,6 +752,12 @@ "integrity": "sha512-eRhP+nQ6YUkIcNQ6hnvdhMkdc7n3zadog0KXNRxAZTT2kHjUb1yGn71OrPhSn8MOvlX97g5CR97kGVj8fMsXWg==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "ccount": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", @@ -611,6 +805,18 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -643,6 +849,65 @@ "restore-cursor": "^2.0.0" } }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -659,6 +924,12 @@ "is-supported-regexp-flag": "^1.0.0" } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "collapse-white-space": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", @@ -690,6 +961,27 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -702,6 +994,44 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -717,6 +1047,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "cosmiconfig": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", @@ -770,6 +1106,82 @@ "array-find-index": "^1.0.1" } }, + "cypress": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.2.0.tgz", + "integrity": "sha512-PN0wz6x634QyNL56/voTzJoeScDfwtecvSfFTHfv5MkHuECVSR4VQcEZTvYtKWln3CMBMUkWbBKPIwwu2+a/kw==", + "dev": true, + "requires": { + "@cypress/listr-verbose-renderer": "0.4.1", + "@cypress/xvfb": "1.2.4", + "bluebird": "3.5.0", + "cachedir": "1.3.0", + "chalk": "2.4.2", + "check-more-types": "2.24.0", + "commander": "2.15.1", + "common-tags": "1.8.0", + "debug": "3.1.0", + "execa": "0.10.0", + "executable": "4.1.1", + "extract-zip": "1.6.7", + "fs-extra": "4.0.1", + "getos": "3.1.0", + "glob": "7.1.3", + "is-ci": "1.2.1", + "is-installed-globally": "0.1.0", + "lazy-ass": "1.6.0", + "listr": "0.12.0", + "lodash": "4.17.11", + "log-symbols": "2.2.0", + "minimist": "1.2.0", + "moment": "2.24.0", + "ramda": "0.24.1", + "request": "2.88.0", + "request-progress": "0.4.0", + "supports-color": "5.5.0", + "tmp": "0.0.33", + "url": "0.11.0", + "yauzl": "2.10.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -856,6 +1268,12 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", @@ -918,12 +1336,28 @@ "is-obj": "^1.0.0" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "electron-to-chromium": { "version": "1.3.118", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.118.tgz", "integrity": "sha512-/1FpHvmKmKo2Z6CCza2HfkrKvKhU7Rq4nvyX1FOherdTrdTufhVrJbCrcrIqgqUCI+BG6JC2rlY4z5QA1G0NOw==", "dev": true }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -1064,6 +1498,21 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "execall": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", @@ -1073,6 +1522,29 @@ "clone-regexp": "^1.0.0" } }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -1226,6 +1698,50 @@ } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -1258,6 +1774,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -1331,6 +1856,23 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -1340,6 +1882,17 @@ "map-cache": "^0.2.2" } }, + "fs-extra": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", + "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1358,12 +1911,36 @@ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getos": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.0.tgz", + "integrity": "sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q==", + "dev": true, + "requires": { + "async": "2.4.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -1405,6 +1982,15 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -1476,6 +2062,39 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1540,6 +2159,17 @@ "readable-stream": "^3.1.1" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1703,6 +2333,15 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -1766,6 +2405,15 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -1787,6 +2435,16 @@ "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", "dev": true }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -1813,6 +2471,15 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -1840,12 +2507,24 @@ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, "is-supported-regexp-flag": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", "dev": true }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-whitespace-character": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", @@ -1882,6 +2561,12 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1898,6 +2583,12 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -1910,6 +2601,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1922,51 +2619,359 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "known-css-properties": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", + "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", + "dev": true + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "listr": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", + "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.2.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.0.0-beta.11", + "stream-to-observable": "^0.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", + "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "minimist": "^1.2.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "known-css-properties": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", - "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", - "dev": true - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -2009,6 +3014,12 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -2018,6 +3029,49 @@ "chalk": "^2.0.1" } }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, "longest-streak": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", @@ -2126,6 +3180,21 @@ "to-regex": "^3.0.2" } }, + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true + }, + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, + "requires": { + "mime-db": "~1.38.0" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -2135,7 +3204,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -2187,6 +3256,12 @@ "minimist": "0.0.8" } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -2230,6 +3305,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-eta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/node-eta/-/node-eta-0.1.1.tgz", + "integrity": "sha1-QGYQmzk3HHYccrfr2pqeoKXeEh8=", + "dev": true + }, "node-releases": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.11.tgz", @@ -2263,12 +3344,39 @@ "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", "dev": true }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -2350,12 +3458,103 @@ "wordwrap": "~1.0.0" } }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -2374,6 +3573,12 @@ "p-limit": "^1.1.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -2472,6 +3677,18 @@ } } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -2624,24 +3841,54 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "dev": true + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -2768,12 +4015,59 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-progress": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.4.0.tgz", + "integrity": "sha1-wZVOOQhqqFJpxWYLzuAUKmpw1+c=", + "dev": true, + "requires": { + "node-eta": "^0.1.1", + "throttleit": "^0.0.2" + } + }, "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", @@ -3132,6 +4426,23 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "state-toggle": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", @@ -3159,10 +4470,16 @@ } } }, + "stream-to-observable": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", + "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -3205,6 +4522,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -3351,6 +4674,12 @@ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", "dev": true }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "table": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", @@ -3397,9 +4726,15 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -3460,6 +4795,24 @@ "repeat-string": "^1.6.1" } }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -3496,6 +4849,21 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -3505,6 +4873,12 @@ "prelude-ls": "~1.1.2" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "unherit": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", @@ -3620,6 +4994,12 @@ "unist-util-is": "^2.1.2" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -3675,6 +5055,24 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -3687,6 +5085,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -3697,6 +5101,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", @@ -3782,6 +5197,27 @@ "requires": { "camelcase": "^4.1.0" } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + }, + "dependencies": { + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + } + } } } } diff --git a/package.json b/package.json index 8d455935999..a2e733e7dcc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Gitcoin is the easiest way to monetize or incentivize work in Open Source Software", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "eslint": "./node_modules/eslint/bin/eslint.js --quiet --config .eslintrc ./app/assets/v2/js/*.js ./app/assets/v2/js/**/*.js ./app/assets/onepager/js/*.js ./app/assets/ens/*.js", + "eslint": "./node_modules/eslint/bin/eslint.js --quiet --config .eslintrc ./app/assets/v2/js/*.js ./app/assets/v2/js/**/*.js ./app/assets/onepager/js/*.js ./app/assets/ens/*.js ./cypress/**/*.js", "eslint:fix": "./node_modules/eslint/bin/eslint.js --quiet --fix --config .eslintrc ./app/assets/v2/js/*.js ./app/assets/v2/js/**/*.js ./app/assets/onepager/js/*.js ./app/assets/ens/*.js", "stylelint": "stylelint ./app/assets/**/**/*.css", "stylelint:fix": "stylelint --fix ./app/assets/**/**/*.css", @@ -21,6 +21,7 @@ }, "homepage": "https://github.com/gitcoinco/web#readme", "devDependencies": { + "cypress": "^3.2.0", "eslint": "^5.15.3", "stylelint": "^9.10.1", "stylelint-config-recommended": "^2.1.0" diff --git a/scripts/crontab b/scripts/crontab index 7ccf9816ef0..83235efef09 100644 --- a/scripts/crontab +++ b/scripts/crontab @@ -54,6 +54,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/us 15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash funder_stale_email 30 >> /var/log/gitcoin/funder_stale_email.log 2>&1 15 11 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash new_bounties_email >> /var/log/gitcoin/new_bounties_email.log 2>&1 15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash campaign_email >> /var/log/gitcoin/campaign_email.log 2>&1 +15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash send_unread_notification_emails_roundup >> /var/log/gitcoin/send_unread_notification_emails_roundup.log 2>&1 15 12 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash bounty_requests_email >> /var/log/gitcoin/bounty_requests_email.log 2>&1 15 * * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash pending_start_work_actions >> /var/log/gitcoin/pending_start_work_actions.log 2>&1 0 0 1 */3 * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash send_quarterly_stats --live >> /var/log/gitcoin/send_quarterly_stats.log 2>&1