From cd8d2c9c5df9cfb5eec9012dc7cf29a4a0d1e2f7 Mon Sep 17 00:00:00 2001 From: code-master5 Date: Mon, 11 Feb 2019 22:07:29 +0530 Subject: [PATCH 001/159] Add db statistics module --- critiquebrainz/db/statistics.py | 172 ++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 critiquebrainz/db/statistics.py diff --git a/critiquebrainz/db/statistics.py b/critiquebrainz/db/statistics.py new file mode 100644 index 000000000..deab8849c --- /dev/null +++ b/critiquebrainz/db/statistics.py @@ -0,0 +1,172 @@ +# critiquebrainz - Repository for Creative Commons licensed reviews +# +# Copyright (C) 2019 Bimalkant Lauhny. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from datetime import date +import sqlalchemy +from brainzutils import cache +from critiquebrainz import db +import critiquebrainz.db.exceptions as db_exceptions + +_CACHE_NAMESPACE = "cb_statistics" +_DEFAULT_CACHE_EXPIRATION = 1 * 60 * 60 # seconds (1 hour) + + +def get_top_users(from_date=date(1970, 1, 1), to_date=date.today(), review_weight=1, + comment_weight=1, vote_weight=1, limit=10): + """ Gets list of top contributors based on number of reviews, votes and comments + along with their final scores. + score = (reviews * review_weight + comments * comment_weight + votes * vote_weight) + Results are sorted in ascending order by score and max number of results are + defined by 'limit'. + + Args: + from_date(datetime): Date from which contributions by users are to be considered. + to_date(datetime): Date upto which contributions by users are to be considered. + review_weight(int): Weight for each review of a user to add to their final score + comment_weight(int): Weight for each comment of a user to add to their final score + vote_weight(int): Weight for each vote of a user to add to their final score + + Returns: + List of dictionaries where each dictionary has the following structure: + { + "id": (uuid), + "display_name": (str), + "review_count": (int), + "comment_count": (int), + "vote_count": (int), + "score": (int), + } + """ + with db.engine.connect() as connection: + result = connection.execute(sqlalchemy.text(""" + WITH score_table AS ( + SELECT id, + display_name, + COALESCE(rc, 0) AS review_count, + COALESCE(cc, 0) AS comment_count, + COALESCE(vc, 0) AS vote_count, + ( + COALESCE(rc, 0)*:review_weight + + COALESCE(cc, 0)*:comment_weight + + COALESCE(vc, 0)*:vote_weight + ) AS score + FROM "user" + LEFT JOIN ( + SELECT user_id, + count(*) AS rc + FROM review + LEFT JOIN ( + SELECT review_id, + min(timestamp) AS reviewed_at + FROM revision + GROUP BY review_id + ) AS review_create + ON review.id = review_create.review_id + WHERE reviewed_at >= :from_date AND reviewed_at <= :to_date + AND review.is_draft = 'f' + AND review.is_hidden = 'f' + GROUP BY user_id + ) AS num_review + ON "user".id = num_review.user_id + LEFT JOIN ( + SELECT user_id, + count(*) AS cc + FROM comment + LEFT JOIN ( + SELECT comment_id, + min(timestamp) AS commented_at + FROM comment_revision + GROUP BY comment_id + ) AS comment_create + ON comment.id = comment_create.comment_id + WHERE commented_at >= :from_date AND commented_at <= :to_date + AND comment.is_draft = 'f' + AND comment.is_hidden = 'f' + GROUP BY user_id + ) AS num_comment + ON "user".id = num_comment.user_id + LEFT JOIN ( + SELECT user_id, + count(*) AS vc + FROM ( + SELECT user_id + FROM vote + WHERE rated_at >= :from_date AND rated_at <= :to_date + ) AS vote_before + GROUP BY user_id + ) AS num_vote + ON "user".id = num_vote.user_id + ) SELECT * FROM score_table + WHERE score != 0 + ORDER BY score DESC + LIMIT :limit + """), { + "from_date": from_date, + "to_date": to_date, + "review_weight": review_weight, + "comment_weight": comment_weight, + "vote_weight": vote_weight, + "limit": limit, + }) + + top_scorers = result.fetchall() + if not top_scorers: + raise db_exceptions.NoDataFoundException("Can't get top users!") + rows = [dict(row) for row in top_scorers] + return rows + + +def get_top_users_overall(): + """ Gets top contributors since the beginning + + Returns: + Returns: + List of dictionaries where each dictionary has the following structure: + { + "id": (str), + "display_name": (str), + "review_count": (int), + "comment_count": (int), + "vote_count": (int), + "score": (int), + } + """ + key = cache.gen_key("top_users_overall", _CACHE_NAMESPACE) + top_users = cache.get(key, _CACHE_NAMESPACE) + + # if could not fetch results from cache, or fetched results have to be updated + if not top_users: + + try: + results = get_top_users( + review_weight=5, + comment_weight=2, + vote_weight=1, + ) + + for user in results: + user["id"] = str(user["id"]) + + top_users = { + "users": results, + } + + cache.set(key=key, val=top_users, namespace=_CACHE_NAMESPACE, time=_DEFAULT_CACHE_EXPIRATION) + except db_exceptions.NoDataFoundException: + return None + return top_users["users"] From 644cc701444ec0918bbc6c2acfb20c6e14b644af Mon Sep 17 00:00:00 2001 From: code-master5 Date: Mon, 11 Feb 2019 23:34:12 +0530 Subject: [PATCH 002/159] Add tests for db statistics --- critiquebrainz/db/statistics.py | 4 +- critiquebrainz/db/statistics_test.py | 124 +++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 critiquebrainz/db/statistics_test.py diff --git a/critiquebrainz/db/statistics.py b/critiquebrainz/db/statistics.py index deab8849c..4be8a9795 100644 --- a/critiquebrainz/db/statistics.py +++ b/critiquebrainz/db/statistics.py @@ -16,7 +16,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -from datetime import date +from datetime import date, timedelta import sqlalchemy from brainzutils import cache from critiquebrainz import db @@ -26,7 +26,7 @@ _DEFAULT_CACHE_EXPIRATION = 1 * 60 * 60 # seconds (1 hour) -def get_top_users(from_date=date(1970, 1, 1), to_date=date.today(), review_weight=1, +def get_top_users(from_date=date(1970, 1, 1), to_date=date.today()+timedelta(1), review_weight=1, comment_weight=1, vote_weight=1, limit=10): """ Gets list of top contributors based on number of reviews, votes and comments along with their final scores. diff --git a/critiquebrainz/db/statistics_test.py b/critiquebrainz/db/statistics_test.py new file mode 100644 index 000000000..a3a95985f --- /dev/null +++ b/critiquebrainz/db/statistics_test.py @@ -0,0 +1,124 @@ +# critiquebrainz - Repository for Creative Commons licensed reviews +# +# Copyright (C) 2019 Bimalkant Lauhny. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from unittest.mock import MagicMock +from brainzutils import cache +from critiquebrainz.data.testing import DataTestCase +import critiquebrainz.db.users as db_users +from critiquebrainz.db.user import User +import critiquebrainz.db.review as db_review +import critiquebrainz.db.vote as db_vote +import critiquebrainz.db.comment as db_comment +import critiquebrainz.db.exceptions as db_exceptions +import critiquebrainz.db.license as db_license +import critiquebrainz.db.statistics as db_statistics + + +class StatisticsTestCase(DataTestCase): + + def setUp(self): + super(StatisticsTestCase, self).setUp() + + self.user_1 = User(db_users.get_or_create(1, "Tester 1", new_user_data={ + "display_name": "test user 1", + })) + self.user_2 = User(db_users.get_or_create(2, "Tester 2", new_user_data={ + "display_name": "test user 2", + })) + + self.license = db_license.create( + id=u'Test', + full_name=u"Test License", + ) + + # totally disable cache get or set + cache.gen_key = MagicMock(return_value=None) + cache.get = MagicMock(return_value=None) + cache.set = MagicMock(return_value=None) + + def create_dummy_review(self, user_id): + return db_review.create( + entity_id="e7aad618-fa86-3983-9e77-405e21796eca", + entity_type="release_group", + text=u"Test review", + rating=5, + user_id=user_id, + is_draft=False, + license_id=self.license["id"], + ) + + def test_get_top_users(self): + + with self.assertRaises(db_exceptions.NoDataFoundException): + db_statistics.get_top_users() + + # user_1 added a review + review_1 = self.create_dummy_review(user_id=self.user_1.id) + + # get list of top users + top_users = db_statistics.get_top_users() + self.assertEqual(len(top_users), 1) + self.assertEqual(str(top_users[0]["id"]), str(self.user_1.id)) + self.assertEqual(top_users[0]["score"], 1) + + # user_2 added a review + self.create_dummy_review(user_id=self.user_2.id) + + # user_2 commented on review by user_1 + db_comment.create( + user_id=self.user_2.id, + review_id=review_1["id"], + text="Test comment", + ) + + # get list of top users + top_users = db_statistics.get_top_users() + self.assertEqual(len(top_users), 2) + self.assertEqual(str(top_users[0]["id"]), str(self.user_2.id)) + self.assertEqual(top_users[0]["score"], 2) + self.assertEqual(str(top_users[1]["id"]), str(self.user_1.id)) + self.assertEqual(top_users[1]["score"], 1) + + def test_get_top_users_overall(self): + # user_1 added a review + review_1 = self.create_dummy_review(user_id=self.user_1.id) + + # user_2 added a review + review_2 = self.create_dummy_review(user_id=self.user_2.id) + + # user_2 commented on review by user_1 + db_comment.create( + user_id=self.user_2.id, + review_id=review_1["id"], + text="Test comment", + ) + + # user_1 upvoted review by user_2 + db_vote.submit( + user_id=self.user_1.id, + revision_id=review_2["last_revision"]["id"], + vote=True, + ) + + # get list of top users + top_users = db_statistics.get_top_users_overall() + self.assertEqual(len(top_users), 2) + self.assertEqual(str(top_users[0]["id"]), str(self.user_2.id)) + self.assertEqual(top_users[0]["score"], 7) + self.assertEqual(str(top_users[1]["id"]), str(self.user_1.id)) + self.assertEqual(top_users[1]["score"], 6) From 7786499e39791e69f8e9959932bd8eb08f16448c Mon Sep 17 00:00:00 2001 From: code-master5 Date: Fri, 15 Feb 2019 21:54:56 +0530 Subject: [PATCH 003/159] Add statistics view and template --- critiquebrainz/frontend/__init__.py | 2 + .../frontend/templates/statistics/stats.html | 50 +++++++++++++++++++ critiquebrainz/frontend/views/statistics.py | 31 ++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 critiquebrainz/frontend/templates/statistics/stats.html create mode 100644 critiquebrainz/frontend/views/statistics.py diff --git a/critiquebrainz/frontend/__init__.py b/critiquebrainz/frontend/__init__.py index 314dd4881..15ce2dc3b 100644 --- a/critiquebrainz/frontend/__init__.py +++ b/critiquebrainz/frontend/__init__.py @@ -146,6 +146,7 @@ def create_app(debug=None, config_path=None): from critiquebrainz.frontend.views.log import log_bp from critiquebrainz.frontend.views.comment import comment_bp from critiquebrainz.frontend.views.rate import rate_bp + from critiquebrainz.frontend.views.statistics import statistics_bp app.register_blueprint(frontend_bp) app.register_blueprint(review_bp, url_prefix='/review') @@ -166,6 +167,7 @@ def create_app(debug=None, config_path=None): app.register_blueprint(moderators_bp, url_prefix='/moderators') app.register_blueprint(comment_bp, url_prefix='/comments') app.register_blueprint(rate_bp, url_prefix='/rate') + app.register_blueprint(statistics_bp, url_prefix='/statistics') return app diff --git a/critiquebrainz/frontend/templates/statistics/stats.html b/critiquebrainz/frontend/templates/statistics/stats.html new file mode 100644 index 000000000..e73671d31 --- /dev/null +++ b/critiquebrainz/frontend/templates/statistics/stats.html @@ -0,0 +1,50 @@ +{% extends 'base.html' %} + +{% block content %} + + +
+ +
+
+

{{ _('Top 10 Contributors Overall') }}

+
+ + {% if top_users_overall %} + + + + + + + + + + + + {% for user in top_users_overall %} + + + + + + + + + + + {% endfor %} + {% else %} +

Could not fetch results! Please try again.

+ {% endif %} +
# {{ _('User') }}{{ _('Reviews') }}{{ _('Comments') }}{{ _('Votes') }}{{ _('Total Score') }}
{{ loop.index }} + {{ user["display_name"] }} + {{ user["review_count"] }}{{ user["comment_count"] }}{{ user["vote_count"] }}{{ user["score"] }}
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/critiquebrainz/frontend/views/statistics.py b/critiquebrainz/frontend/views/statistics.py new file mode 100644 index 000000000..b3236abf3 --- /dev/null +++ b/critiquebrainz/frontend/views/statistics.py @@ -0,0 +1,31 @@ +# critiquebrainz - Repository for Creative Commons licensed reviews +# +# Copyright (C) 2019 Bimalkant Lauhny. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from flask import Blueprint, render_template +import critiquebrainz.db.statistics as db_statistics + +statistics_bp = Blueprint('statistics', __name__) + + +@statistics_bp.route('/') +def statistics(): + top_users_overall = db_statistics.get_top_users_overall() + return render_template( + 'statistics/stats.html', + top_users_overall=top_users_overall, + ) From a7fafc5a7f9fccccddb7498bc1bbba89568c53ea Mon Sep 17 00:00:00 2001 From: code-master5 Date: Sat, 16 Feb 2019 23:10:28 +0530 Subject: [PATCH 004/159] Add statistics view tests --- .../frontend/views/test/test_statistics.py | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 critiquebrainz/frontend/views/test/test_statistics.py diff --git a/critiquebrainz/frontend/views/test/test_statistics.py b/critiquebrainz/frontend/views/test/test_statistics.py new file mode 100644 index 000000000..f6c5de306 --- /dev/null +++ b/critiquebrainz/frontend/views/test/test_statistics.py @@ -0,0 +1,64 @@ +# critiquebrainz - Repository for Creative Commons licensed reviews +# +# Copyright (C) 2019 Bimalkant Lauhny. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from unittest.mock import MagicMock +from brainzutils import cache +from critiquebrainz.frontend.testing import FrontendTestCase +import critiquebrainz.db.users as db_users +import critiquebrainz.db.review as db_review +import critiquebrainz.db.license as db_license +from critiquebrainz.db.user import User + + +class StatisticsViewsTestCase(FrontendTestCase): + + def setUp(self): + super(StatisticsViewsTestCase, self).setUp() + self.user = User(db_users.get_or_create(1, "aef06569-098f-4218-a577-b413944d9493", new_user_data={ + "display_name": u"Tester", + })) + self.license = db_license.create( + id="CC BY-SA 3.0", + full_name="Test License.", + ) + + # totally disable cache get or set + cache.gen_key = MagicMock(return_value=None) + cache.get = MagicMock(return_value=None) + cache.set = MagicMock(return_value=None) + + def test_statistics(self): + # test when there is no user + response = self.client.get("statistics/") + self.assert200(response) + self.assertIn("Could not fetch results! Please try again.", str(response.data)) + + # creating a review + db_review.create( + entity_id="e7aad618-fa86-3983-9e77-405e21796eca", + entity_type="release_group", + text="Test review", + user_id=self.user.id, + is_draft=False, + license_id=self.license["id"], + ) + + # test user's name in statistics page after user added review + response = self.client.get("statistics/") + self.assert200(response) + self.assertIn(self.user.display_name, str(response.data)) From 811a6fefd5526cbea47220d6f37e2e526074fd22 Mon Sep 17 00:00:00 2001 From: code-master5 Date: Mon, 18 Feb 2019 23:49:17 +0530 Subject: [PATCH 005/159] Add statistics link to navbar --- .../frontend/static/styles/main.less | 11 ++++- critiquebrainz/frontend/templates/navbar.html | 49 ++++++++++++++++--- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/critiquebrainz/frontend/static/styles/main.less b/critiquebrainz/frontend/static/styles/main.less index a82bd3df2..221eac346 100644 --- a/critiquebrainz/frontend/static/styles/main.less +++ b/critiquebrainz/frontend/static/styles/main.less @@ -52,6 +52,8 @@ body { .footer { font-size: 13px; line-height: 20px; + border-top: 2px solid #36b5b2; + padding-top: 20px; .title { font-weight: bold; margin-bottom: 6px; @@ -150,9 +152,9 @@ ul.sharing { margin-bottom: 20px; } #stats { - margin-top: 10px; + margin-top: 30px; @media (min-width: @grid-float-breakpoint) { - margin-top: 60px; + margin-top: 10px; margin-bottom: 0px; } } @@ -540,6 +542,11 @@ a#edit-review { margin-top: 20px; } } } +nav { + .glyphicon { + padding-right: 5px; + } +} // Rating star icons .glyphicon-star, .glyphicon-star-empty { diff --git a/critiquebrainz/frontend/templates/navbar.html b/critiquebrainz/frontend/templates/navbar.html index a1938c187..af77f033a 100644 --- a/critiquebrainz/frontend/templates/navbar.html +++ b/critiquebrainz/frontend/templates/navbar.html @@ -18,33 +18,66 @@
@@ -85,6 +88,26 @@

{{ _('Place selection') }}

+
+

{{ _('Work selection') }}

+
+
+ +
+ +
+
+
+
+ +
+
+ + +
+
+ @@ -93,6 +116,7 @@

{{ _('Place selection') }}

or request.args.get('release_group', default=False) or request.args.get('event', default=False) or request.args.get('place', default=False) + or request.args.get('work', default=False) %}
{% if not results %} @@ -122,6 +146,13 @@

{{ _('Place selection') }}

{{ _('Location') }} + {% elif type=="work" %} + + {{ _('Title') }} + {{ _('Artists') }} + {{ _('Type') }} + {{ _('Language') }} + {% endif %} {% include 'search/selector_results.html' %} diff --git a/critiquebrainz/frontend/templates/search/selector_results.html b/critiquebrainz/frontend/templates/search/selector_results.html index 65cab676a..7ecac02e3 100644 --- a/critiquebrainz/frontend/templates/search/selector_results.html +++ b/critiquebrainz/frontend/templates/search/selector_results.html @@ -64,5 +64,32 @@ +{% elif type=="work" %} + + + {# {{ result['name'] }} #} + + + {% if result['artist-relation-list'] %} + {{ result['artist-relation-list'][0]['artist']['name'] or '-' }} + {% set count = result['artist-relation-list'] | length %} + {% if count > 1 %} + + {{ count - 1 }} {{ _("more") }} + {% endif %} + {% else %} + - + {% endif %} + + + {{ result['type'] or '-' }} + + + {{ result['language'] or '-' }} + + + + + + {% endif %} {% endfor %} diff --git a/critiquebrainz/frontend/templates/work/entity.html b/critiquebrainz/frontend/templates/work/entity.html new file mode 100644 index 000000000..21f5da261 --- /dev/null +++ b/critiquebrainz/frontend/templates/work/entity.html @@ -0,0 +1 @@ +{% extends 'base.html' %} diff --git a/critiquebrainz/frontend/views/search.py b/critiquebrainz/frontend/views/search.py index 33b8249b3..76e538406 100644 --- a/critiquebrainz/frontend/views/search.py +++ b/critiquebrainz/frontend/views/search.py @@ -16,6 +16,8 @@ def search_wrapper(query, type, offset=None): count, results = musicbrainz.search_places(query, limit=RESULTS_LIMIT, offset=offset) elif type == "release-group": count, results = musicbrainz.search_release_groups(query, limit=RESULTS_LIMIT, offset=offset) + elif type == "work": + count, results = musicbrainz.search_works(query, limit=RESULTS_LIMIT, offset=offset) else: count, results = 0, [] else: @@ -44,10 +46,10 @@ def more(): @search_bp.route('/selector') def selector(): - artist = request.args.get('artist') release_group = request.args.get('release_group') event = request.args.get('event') place = request.args.get('place') + work = request.args.get('work') type = request.args.get('type') next = request.args.get('next') if not next: @@ -55,6 +57,8 @@ def selector(): if artist or release_group: count, results = musicbrainz.search_release_groups(artist=artist, release_group=release_group, limit=RESULTS_LIMIT) + elif work: + count, results = musicbrainz.search_works(work, limit=RESULTS_LIMIT) elif event: count, results = musicbrainz.search_events(event, limit=RESULTS_LIMIT) elif place: @@ -64,7 +68,7 @@ def selector(): return render_template('search/selector.html', next=next, type=type, results=results, count=count, limit=RESULTS_LIMIT, artist=artist, release_group=release_group, event=event, - place=place) + recording=recording, work=work, place=place) @search_bp.route('/selector/more') @@ -73,12 +77,15 @@ def selector_more(): release_group = request.args.get('release_group') event = request.args.get('event') place = request.args.get('place') + work = request.args.get('work') type = request.args.get('type') page = int(request.args.get('page', default=0)) offset = page * RESULTS_LIMIT if type == 'release-group': count, results = musicbrainz.search_release_groups(artist=artist, release_group=release_group, limit=RESULTS_LIMIT, offset=offset) + elif type == 'work': + count, results = musicbrainz.search_works(work, limit=RESULTS_LIMIT, offset=offset) elif type == 'event': count, results = musicbrainz.search_events(event, limit=RESULTS_LIMIT, offset=offset) elif type == 'place': diff --git a/critiquebrainz/frontend/views/work.py b/critiquebrainz/frontend/views/work.py new file mode 100644 index 000000000..dffd4ec93 --- /dev/null +++ b/critiquebrainz/frontend/views/work.py @@ -0,0 +1,41 @@ +# critiquebrainz - Repository for Creative Commons licensed reviews +# +# Copyright (C) 2018 MetaBrainz Foundation Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from flask import Blueprint, render_template, request +from flask_login import current_user +from flask_babel import gettext +from werkzeug.exceptions import NotFound +import critiquebrainz.frontend.external.musicbrainz_db.work as mb_work +import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +import critiquebrainz.db.review as db_review +from critiquebrainz.frontend.forms.rate import RatingEditForm +from critiquebrainz.frontend.views import get_avg_rating + + +work_bp = Blueprint('work', __name__) + + +@work_bp.route('/') +def entity(id): + id = str(id) + try: + work = mb_work.get_work_by_id(id) + except mb_exceptions.NoDataFoundException: + raise NotFound(gettext("Sorry, we couldn't find a release group with that MusicBrainz ID.")) + + return render_template('work/entity.html', id=work['id'], work=work) From 15d16e6a58f16926ab1f8b06b908b7499ce67e8d Mon Sep 17 00:00:00 2001 From: spellew Date: Sun, 16 Jun 2019 14:07:34 -0400 Subject: [PATCH 046/159] Implemented the reviewal of works --- critiquebrainz/db/review.py | 1 + .../frontend/static/styles/main.less | 15 +++++++--- .../frontend/templates/entity_review.html | 2 ++ critiquebrainz/frontend/templates/macros.html | 7 +++++ .../frontend/templates/review/browse.html | 2 ++ .../templates/review/entity/work.html | 24 ++++++++++++++++ .../templates/review/modify/work.html | 28 +++++++++++++++++++ .../frontend/templates/search/selector.html | 1 + .../frontend/templates/work/entity.html | 22 +++++++++++++++ 9 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 critiquebrainz/frontend/templates/review/entity/work.html create mode 100644 critiquebrainz/frontend/templates/review/modify/work.html diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index afc05f4dc..1c5c3d4ec 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -19,6 +19,7 @@ "event", "place", "release_group", + "work", ] diff --git a/critiquebrainz/frontend/static/styles/main.less b/critiquebrainz/frontend/static/styles/main.less index a82bd3df2..bcffc7f13 100644 --- a/critiquebrainz/frontend/static/styles/main.less +++ b/critiquebrainz/frontend/static/styles/main.less @@ -12,6 +12,7 @@ @rg-color: @blue; @event-color: @green; @place-color: @yellow; +@work-color: @blue; body { padding-bottom: 25px; @@ -122,11 +123,14 @@ ul.sharing { &.release-group { background-color: fade(@rg-color, 70%); } + &.place { + background-color: fade(@place-color, 70%); + } &.event { background-color: fade(@event-color, 70%); } - &.place { - background-color: fade(@place-color, 70%); + &.work { + background-color: fade(@work-color, 70%); } } @@ -476,11 +480,14 @@ a#edit-review { margin-top: 20px; } &.release-group { background-color: fade(@rg-color, 70%); } + &.place { + background-color: fade(@place-color, 70%); + } &.event { background-color: fade(@event-color, 70%); } - &.place { - background-color: fade(@place-color, 70%); + &.work { + background-color: fade(@work-color, 70%); } } } diff --git a/critiquebrainz/frontend/templates/entity_review.html b/critiquebrainz/frontend/templates/entity_review.html index df9168e81..4bee8be77 100644 --- a/critiquebrainz/frontend/templates/entity_review.html +++ b/critiquebrainz/frontend/templates/entity_review.html @@ -7,5 +7,7 @@ {{ _('%(event)s', event = ''|safe + entity.name | default(_('[Unknown event]')) + ''|safe) }} {% elif review.entity_type == 'place' %} {{ _('%(place)s', place = ''|safe + entity.name | default(_('[Unknown place]')) + ''|safe) }} + {% elif review.entity_type == 'work' %} + {{ _('%(work)s', work = ''|safe + entity.name | default(_('[Unknown work]')) + ''|safe) }} {% endif %} diff --git a/critiquebrainz/frontend/templates/macros.html b/critiquebrainz/frontend/templates/macros.html index f64b2a3ae..33ab9850b 100644 --- a/critiquebrainz/frontend/templates/macros.html +++ b/critiquebrainz/frontend/templates/macros.html @@ -46,6 +46,13 @@ {{ _('Place') }} {% endif %} + {% elif entity_type == 'work' %} + + {% if overlay_type %} + + {{ _('Work') }} + + {% endif %} {% else %} {# release-group #} {% if overlay_type %} diff --git a/critiquebrainz/frontend/templates/review/browse.html b/critiquebrainz/frontend/templates/review/browse.html index e51ac306c..ebd9bcc0c 100644 --- a/critiquebrainz/frontend/templates/review/browse.html +++ b/critiquebrainz/frontend/templates/review/browse.html @@ -15,6 +15,8 @@

{{ _('Reviews') }}

{{ _('Event') }}
  • {{ _('Place') }}
  • +
  • + {{ _('Work') }}
  • diff --git a/critiquebrainz/frontend/templates/review/entity/work.html b/critiquebrainz/frontend/templates/review/entity/work.html new file mode 100644 index 000000000..1989a86d3 --- /dev/null +++ b/critiquebrainz/frontend/templates/review/entity/work.html @@ -0,0 +1,24 @@ +{% extends 'review/entity/base.html' %} + +{% set work = review.entity_id | entity_details(type='work') %} + +{% block title %} + {% set work_title = work.name | default(_('[Unknown work]')) %} + {{ _('Review of "%(work)s" by %(user)s', work=work_title, user=review.user.display_name) }} - CritiqueBrainz +{% endblock %} + +{% block entity_title %} +

    + {% if work %} + {% set work_name = '' | safe % url_for('work.entity', id=review.entity_id) ~ work.name ~ ''|safe %} + {% else %} + {% set work_name = _('[Unknown work]') %} + {% endif %} + + {{ _('%(work)s', work=work_name) }} + + {% if work['life-span'] %} + {{ work['life-span']['begin'][:4] }} + {% endif %} +

    +{% endblock %} diff --git a/critiquebrainz/frontend/templates/review/modify/work.html b/critiquebrainz/frontend/templates/review/modify/work.html new file mode 100644 index 000000000..a1de82e0d --- /dev/null +++ b/critiquebrainz/frontend/templates/review/modify/work.html @@ -0,0 +1,28 @@ +{% if entity is not defined %} + {% set entity = review.entity_id | entity_details(type=entity_type) %} +{% endif %} +
    +
    +
    {{ _('Work') }}
    +
    + {{ entity['name'] | default(_('[Unknown work]')) }} +
    +
    {{ _('Type') }}
    +
    {{ entity['type'] or '-' }}
    +
    {{ _('Artists') }}
    +
    + {% if entity['artist-rels'] %} + {{ entity['artist-rels'][0]['artist']['name'] or '-' }} + {% set count = entity['artist-rels'] | length %} + {% if count > 1 %} + + {{ count - 1 }} {{ _("more") }} + {% endif %} + {% else %} + - + {% endif %} +
    + {% block more_info %} + {# Information like creation date, votes etc. #} + {% endblock %} +
    +
    diff --git a/critiquebrainz/frontend/templates/search/selector.html b/critiquebrainz/frontend/templates/search/selector.html index 22f8b319a..955200024 100644 --- a/critiquebrainz/frontend/templates/search/selector.html +++ b/critiquebrainz/frontend/templates/search/selector.html @@ -152,6 +152,7 @@

    {{ _('Work selection') }}

    {{ _('Artists') }} {{ _('Type') }} {{ _('Language') }} + {% endif %} diff --git a/critiquebrainz/frontend/templates/work/entity.html b/critiquebrainz/frontend/templates/work/entity.html index 21f5da261..4dc70e74b 100644 --- a/critiquebrainz/frontend/templates/work/entity.html +++ b/critiquebrainz/frontend/templates/work/entity.html @@ -1 +1,23 @@ {% extends 'base.html' %} + +{# {% block title %}{{ event.name }} - CritiqueBrainz{% endblock %} #} + +{% block content %} +
    +

    + {# {{ event.name }} #} +

    + + {% if not my_review %} + + {{ _('Write a review') }} + + {% else %} + + {{ _('Edit my review') }} + + {% endif %} +
    +{% endblock %} From 24dc6a60380c07d48011b5723e70177def8ca7c1 Mon Sep 17 00:00:00 2001 From: Suyash Garg Date: Tue, 18 Jun 2019 22:08:10 +0200 Subject: [PATCH 047/159] Update lodash version --- npm-shrinkwrap.json | 14537 ++++++++++++------------------------------ package.json | 6 +- 2 files changed, 4032 insertions(+), 10511 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index aad693933..a4220b30f 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3,5881 +3,2060 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "babel-core": { - "version": "6.3.26", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.3.26.tgz", - "integrity": "sha1-HsnoGlOp4+JlUiW9/2Lyj2xeIks=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-generator": "6.7.5", - "babel-helpers": "6.6.0", - "babel-messages": "6.7.2", - "babel-register": "6.7.2", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "convert-source-map": "1.2.0", - "debug": "2.2.0", - "json5": "0.4.0", - "lodash": "3.10.1", - "minimatch": "2.0.10", - "path-exists": "1.0.0", - "path-is-absolute": "1.0.0", - "private": "0.1.6", - "shebang-regex": "1.0.0", - "slash": "1.0.0", - "source-map": "0.5.3" + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accord": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.27.3.tgz", + "integrity": "sha1-f7kSlwkoXK6oTrNyxOiCAxtxOOg=", + "requires": { + "convert-source-map": "^1.5.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.3.3", + "semver": "^5.3.0", + "uglify-js": "^2.8.22", + "when": "^3.7.8" }, "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-generator": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.7.5.tgz", - "integrity": "sha1-WGAMU/Wx4js1MrniqP23xYT64Xk=", - "requires": { - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "detect-indent": "3.0.1", - "is-integer": "1.0.6", - "lodash": "3.10.1", - "repeating": "1.1.3", - "source-map": "0.5.3", - "trim-right": "1.0.1" - }, - "dependencies": { - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "requires": { - "get-stdin": "4.0.1", - "minimist": "1.2.0", - "repeating": "1.1.3" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "is-integer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz", - "integrity": "sha1-UnOBn62ogNEj4awAqTjnFy3Y2V4=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - } - } - }, - "babel-helpers": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.6.0.tgz", - "integrity": "sha1-T7AFMmVp7uyfWZAXa1Oeo6Qktxw=", - "requires": { - "babel-runtime": "5.8.38", - "babel-template": "6.7.0" - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babel-register": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.7.2.tgz", - "integrity": "sha1-TeyAm6LUzK3Rhe+ywKP1YOH2yKA=", - "requires": { - "babel-core": "6.7.6", - "babel-runtime": "5.8.38", - "core-js": "2.2.2", - "home-or-tmp": "1.0.0", - "lodash": "3.10.1", - "mkdirp": "0.5.1", - "path-exists": "1.0.0", - "source-map-support": "0.2.10" - }, - "dependencies": { - "babel-core": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.7.6.tgz", - "integrity": "sha1-Nv5n56zthlXM9sYh/W/+nAFALas=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-generator": "6.7.5", - "babel-helpers": "6.6.0", - "babel-messages": "6.7.2", - "babel-register": "6.7.2", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "convert-source-map": "1.2.0", - "debug": "2.2.0", - "json5": "0.4.0", - "lodash": "3.10.1", - "minimatch": "2.0.10", - "path-exists": "1.0.0", - "path-is-absolute": "1.0.0", - "private": "0.1.6", - "shebang-regex": "1.0.0", - "slash": "1.0.0", - "source-map": "0.5.3" - } - }, - "core-js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.2.2.tgz", - "integrity": "sha1-eaDzqUlVB2QaW/fOJ1+klGSRgL8=" - }, - "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", - "requires": { - "os-tmpdir": "1.0.1", - "user-home": "1.1.1" - }, - "dependencies": { - "os-tmpdir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", - "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=" - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } - } - } - } - } - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "convert-source-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", - "integrity": "sha1-RMCMJQbxD7PKb9iI1aNETPjWpmk=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "requires": { - "brace-expansion": "1.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", - "requires": { - "balanced-match": "0.3.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=" - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" - }, - "private": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz", - "integrity": "sha1-VcapdtD5uvuZJIUTUP5HubX7t8E=" - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "source-map": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", - "integrity": "sha1-gmdLhacbC+dsPnQW0V6fUlLrO+A=" + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" } } }, - "babel-preset-es2015": { - "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.3.13.tgz", - "integrity": "sha1-l9zn7ykuGMubK3VF2AxZPCjZUX8=", - "requires": { - "babel-plugin-check-es2015-constants": "6.7.2", - "babel-plugin-transform-es2015-arrow-functions": "6.5.2", - "babel-plugin-transform-es2015-block-scoped-functions": "6.6.5", - "babel-plugin-transform-es2015-block-scoping": "6.7.1", - "babel-plugin-transform-es2015-classes": "6.6.5", - "babel-plugin-transform-es2015-computed-properties": "6.6.5", - "babel-plugin-transform-es2015-destructuring": "6.6.5", - "babel-plugin-transform-es2015-for-of": "6.6.0", - "babel-plugin-transform-es2015-function-name": "6.5.0", - "babel-plugin-transform-es2015-literals": "6.5.0", - "babel-plugin-transform-es2015-modules-commonjs": "6.7.4", - "babel-plugin-transform-es2015-object-super": "6.6.5", - "babel-plugin-transform-es2015-parameters": "6.7.0", - "babel-plugin-transform-es2015-shorthand-properties": "6.5.0", - "babel-plugin-transform-es2015-spread": "6.6.5", - "babel-plugin-transform-es2015-sticky-regex": "6.5.0", - "babel-plugin-transform-es2015-template-literals": "6.6.5", - "babel-plugin-transform-es2015-typeof-symbol": "6.6.0", - "babel-plugin-transform-es2015-unicode-regex": "6.5.0", - "babel-plugin-transform-regenerator": "6.6.5" + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + }, + "acorn-node": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.7.0.tgz", + "integrity": "sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw==", + "requires": { + "acorn": "^6.1.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.1", + "xtend": "^4.0.1" }, "dependencies": { - "babel-plugin-check-es2015-constants": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.7.2.tgz", - "integrity": "sha1-yZHCZu485pDcVz/rZcBupnaOX0g=", - "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.5.2.tgz", - "integrity": "sha1-BUQFhA1dcNkRyPWsq082s4Fwx5w=", - "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.6.5.tgz", - "integrity": "sha1-ZA2JGKMvsrXuStIFwrWiSOEIP+Y=", - "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.7.1.tgz", - "integrity": "sha1-pXhrBnHOttSOROdLRdAPzkKSK6Y=", + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "optional": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "lodash": "3.10.1" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + "is-buffer": "^1.1.5" } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.6.5.tgz", - "integrity": "sha1-sCc8WCd8lw1dFVF/YeRfcxplxho=", - "requires": { - "babel-helper-define-map": "6.6.5", - "babel-helper-function-name": "6.6.0", - "babel-helper-optimise-call-expression": "6.6.0", - "babel-helper-replace-supers": "6.7.0", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-define-map": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.6.5.tgz", - "integrity": "sha1-FhXPErB85fVFlY8h+aIas2/LWYU=", - "requires": { - "babel-helper-function-name": "6.6.0", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "lodash": "3.10.1" - } - }, - "babel-helper-function-name": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.6.0.tgz", - "integrity": "sha1-HChms80In3G75frAvykyACBlu7s=", - "requires": { - "babel-helper-get-function-arity": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-get-function-arity": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.6.5.tgz", - "integrity": "sha1-cC1UsuBiAcZDwERhEFbaUlj3irU=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - } - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.6.0.tgz", - "integrity": "sha1-zQ91UXiqAtyTDWjrTHYLR2vEuY8=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - }, - "babel-helper-replace-supers": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.7.0.tgz", - "integrity": "sha1-UXQmZWpBmd3IfIwJ679wxY+xoHs=", - "requires": { - "babel-helper-optimise-call-expression": "6.6.0", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + } + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "optional": 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=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "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=", + "optional": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "requires": { + "babel-code-frame": "^6.22.0", + "babel-generator": "^6.25.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.25.0", + "babel-traverse": "^6.25.0", + "babel-types": "^6.25.0", + "babylon": "^6.17.2", + "convert-source-map": "^1.1.0", + "debug": "^2.1.1", + "json5": "^0.5.0", + "lodash": "^4.2.0", + "minimatch": "^3.0.2", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "slash": "^1.0.0", + "source-map": "^0.5.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "requires": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" } }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.6.5.tgz", - "integrity": "sha1-zt9IeFeqGuJdXBeVQC54pF/Zig8=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "babel-helper-define-map": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0" - }, - "dependencies": { - "babel-helper-define-map": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.6.5.tgz", - "integrity": "sha1-FhXPErB85fVFlY8h+aIas2/LWYU=", - "requires": { - "babel-helper-function-name": "6.6.0", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "lodash": "3.10.1" - }, - "dependencies": { - "babel-helper-function-name": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.6.0.tgz", - "integrity": "sha1-HChms80In3G75frAvykyACBlu7s=", - "requires": { - "babel-helper-get-function-arity": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-get-function-arity": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.6.5.tgz", - "integrity": "sha1-cC1UsuBiAcZDwERhEFbaUlj3irU=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - } + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, + "bootstrap": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", + "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + }, + "bootstrap-rating-input": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/bootstrap-rating-input/-/bootstrap-rating-input-0.4.0.tgz", + "integrity": "sha1-w59inwBH7TU8hyrlYaVmerX3unQ=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "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==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "codemirror": { + "version": "5.32.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.32.0.tgz", + "integrity": "sha1-y2/12O820LEPAxEw4tnr7ukskC4=" + }, + "codemirror-spell-checker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz", + "integrity": "sha1-HGYPkIlIPMtRE7m6nKGcP0mTNx4=", + "requires": { + "typo-js": "*" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + } + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "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", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "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=" + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" } }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.6.5.tgz", - "integrity": "sha1-bMsU4kX4CgFe4hmwFDzx31ns0iM=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "kind-of": "^6.0.0" } }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.6.0.tgz", - "integrity": "sha1-mxTtbpUpO8xbYk/cX7qzmQKDR1g=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.5.0.tgz", - "integrity": "sha1-KTncQ3rKxwXjyUaFQrbkrAUXkIg=", + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "~1.1.9" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "requires": { + "once": "~1.3.0" + } + }, + "envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "requires": { + "esprima": "^4.0.0", + "through": "~2.3.4" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "babel-helper-function-name": "6.6.0", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-function-name": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.6.0.tgz", - "integrity": "sha1-HChms80In3G75frAvykyACBlu7s=", - "requires": { - "babel-helper-get-function-arity": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-get-function-arity": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.6.5.tgz", - "integrity": "sha1-cC1UsuBiAcZDwERhEFbaUlj3irU=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - } - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + "is-descriptor": "^0.1.0" } }, - "babel-plugin-transform-es2015-literals": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.5.0.tgz", - "integrity": "sha1-XEZ6B+uwXbTUK9t5gKgyJzaKrQA=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "is-extendable": "^0.1.0" } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.7.4.tgz", - "integrity": "sha1-32XznN0fXORCzuY+Z2RnpuWRbkY=", + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "babel-plugin-transform-strict-mode": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-plugin-transform-strict-mode": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.6.5.tgz", - "integrity": "sha1-I8Woua91YJ0UIu8W4TyW3sKaAl8=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + "is-plain-object": "^2.0.4" } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.6.5.tgz", - "integrity": "sha1-7SnKWxddl+is2twli89ApWTpBqQ=", + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "babel-helper-replace-supers": "6.7.0", - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-helper-replace-supers": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.7.0.tgz", - "integrity": "sha1-UXQmZWpBmd3IfIwJ679wxY+xoHs=", - "requires": { - "babel-helper-optimise-call-expression": "6.6.0", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-optimise-call-expression": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.6.0.tgz", - "integrity": "sha1-zQ91UXiqAtyTDWjrTHYLR2vEuY8=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "is-descriptor": "^1.0.0" } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.7.0.tgz", - "integrity": "sha1-XZk0gupDKTTUkY3mBl/DMLVsvLc=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "babel-helper-call-delegate": "6.6.5", - "babel-helper-get-function-arity": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-call-delegate": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.6.5.tgz", - "integrity": "sha1-18jOZ9jh0o7xcjAbFmgMNsRfbmM=", - "requires": { - "babel-helper-hoist-variables": "6.6.5", - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-hoist-variables": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.6.5.tgz", - "integrity": "sha1-xI9hlTbVHVyZDdIZOwsgTo/yu6U=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - } - } - }, - "babel-helper-get-function-arity": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.6.5.tgz", - "integrity": "sha1-cC1UsuBiAcZDwERhEFbaUlj3irU=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + "is-extendable": "^0.1.0" } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.5.0.tgz", - "integrity": "sha1-jXyPozKCZUbIbJS4P68iatAYJVk=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + "kind-of": "^6.0.0" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.6.5.tgz", - "integrity": "sha1-4aSWxobMRxD0C8gEZYQdwfrIBRE=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "kind-of": "^6.0.0" } }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.5.0.tgz", - "integrity": "sha1-64u2tHTSwKTYhV8F/k9bGXxFtJw=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "babel-helper-regex": "6.6.5", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-regex": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.6.5.tgz", - "integrity": "sha1-RLNvLxWUjammB0Hfq2pSBh7RQ+k=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "lodash": "3.10.1" - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.6.5.tgz", - "integrity": "sha1-9AOqJlHilgbPAohMPKCb2NIWPF4=", + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "is-extendable": "^0.1.0" } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.6.0.tgz", - "integrity": "sha1-R51m+WYEf/HBivIzw9EtTQZ53Tg=", + } + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": 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==", + "optional": 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", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "~0.1.0" + } + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "brace-expansion": "^1.0.0" + } + } + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" } }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.5.0.tgz", - "integrity": "sha1-9TFD0t89uWuDDIFiUQs2dYAW3e8=", + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "babel-helper-regex": "6.6.5", - "babel-runtime": "5.8.38", - "regexpu-core": "1.0.0" - }, - "dependencies": { - "babel-helper-regex": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.6.5.tgz", - "integrity": "sha1-RLNvLxWUjammB0Hfq2pSBh7RQ+k=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "lodash": "3.10.1" - }, - "dependencies": { - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "1.2.1", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - }, - "dependencies": { - "regenerate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.2.1.tgz", - "integrity": "sha1-njC6aKa9lqw9y6YqsJ1V1LL8vgQ=" - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - } - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "babel-plugin-transform-regenerator": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.6.5.tgz", - "integrity": "sha1-B5qYK9VuIjXjHuOxetVK66iY1Oc=", + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "requires": { - "babel-core": "6.7.6", - "babel-plugin-syntax-async-functions": "6.5.0", - "babel-plugin-transform-es2015-block-scoping": "6.7.1", - "babel-plugin-transform-es2015-for-of": "6.6.0", - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "private": "0.1.6" - }, - "dependencies": { - "babel-core": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.7.6.tgz", - "integrity": "sha1-Nv5n56zthlXM9sYh/W/+nAFALas=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-generator": "6.7.5", - "babel-helpers": "6.6.0", - "babel-messages": "6.7.2", - "babel-register": "6.7.2", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "convert-source-map": "1.2.0", - "debug": "2.2.0", - "json5": "0.4.0", - "lodash": "3.10.1", - "minimatch": "2.0.10", - "path-exists": "1.0.0", - "path-is-absolute": "1.0.0", - "private": "0.1.6", - "shebang-regex": "1.0.0", - "slash": "1.0.0", - "source-map": "0.5.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-generator": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.7.5.tgz", - "integrity": "sha1-WGAMU/Wx4js1MrniqP23xYT64Xk=", - "requires": { - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "detect-indent": "3.0.1", - "is-integer": "1.0.6", - "lodash": "3.10.1", - "repeating": "1.1.3", - "source-map": "0.5.3", - "trim-right": "1.0.1" - }, - "dependencies": { - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "requires": { - "get-stdin": "4.0.1", - "minimist": "1.2.0", - "repeating": "1.1.3" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "is-integer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz", - "integrity": "sha1-UnOBn62ogNEj4awAqTjnFy3Y2V4=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - } - } - }, - "babel-helpers": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.6.0.tgz", - "integrity": "sha1-T7AFMmVp7uyfWZAXa1Oeo6Qktxw=", - "requires": { - "babel-runtime": "5.8.38", - "babel-template": "6.7.0" - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babel-register": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.7.2.tgz", - "integrity": "sha1-TeyAm6LUzK3Rhe+ywKP1YOH2yKA=", - "requires": { - "babel-core": "6.7.6", - "babel-runtime": "5.8.38", - "core-js": "2.2.2", - "home-or-tmp": "1.0.0", - "lodash": "3.10.1", - "mkdirp": "0.5.1", - "path-exists": "1.0.0", - "source-map-support": "0.2.10" - }, - "dependencies": { - "core-js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.2.2.tgz", - "integrity": "sha1-eaDzqUlVB2QaW/fOJ1+klGSRgL8=" - }, - "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", - "requires": { - "os-tmpdir": "1.0.1", - "user-home": "1.1.1" - }, - "dependencies": { - "os-tmpdir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", - "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=" - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } - } - } - } - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - } - }, - "convert-source-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", - "integrity": "sha1-RMCMJQbxD7PKb9iI1aNETPjWpmk=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "requires": { - "brace-expansion": "1.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", - "requires": { - "balanced-match": "0.3.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=" - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "source-map": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", - "integrity": "sha1-gmdLhacbC+dsPnQW0V6fUlLrO+A=" - } - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.5.0.tgz", - "integrity": "sha1-kKXOgdRQ88uhdttfdBKlxdgHJ8A=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "private": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz", - "integrity": "sha1-VcapdtD5uvuZJIUTUP5HubX7t8E=" - } + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } }, - "babel-preset-stage-2": { - "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.3.13.tgz", - "integrity": "sha1-NlfbY9EYBkVvZNTQsOmoF4N67qc=", + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "requires": { + "find-index": "^0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.5.0", - "babel-plugin-transform-object-rest-spread": "6.6.5", - "babel-preset-stage-3": "6.5.0" + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" }, "dependencies": { - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.5.0.tgz", - "integrity": "sha1-RLnUyfZYgdiIEdu29oozwuWj2mI=", + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "requires": { - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" } }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.6.5.tgz", - "integrity": "sha1-uTvZsQlQ530ZU+m71EmAzEkVfx8=", + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "requires": { - "babel-plugin-syntax-object-rest-spread": "6.5.0", - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-plugin-syntax-object-rest-spread": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.5.0.tgz", - "integrity": "sha1-853PmZknVx/I/ywDCTKf6rNXe+s=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } + "lru-cache": "2", + "sigmund": "~1.0.0" } - }, - "babel-preset-stage-3": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.5.0.tgz", - "integrity": "sha1-VC2sWGhNrRsLxK7oW6UoUcxudcw=", + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "requires": { + "natives": "^1.1.0" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "gulp-less": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.3.2.tgz", + "integrity": "sha1-9mNq3MZhUKiQJxn6WZY/x/hipJo=", + "requires": { + "accord": "^0.27.3", + "gulp-util": "^3.0.7", + "less": "2.6.x || ^2.7.1", + "object-assign": "^4.0.1", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-rev": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-7.1.2.tgz", + "integrity": "sha1-XhfMIp9rRcdCVviK0/LT6aMwWCk=", + "requires": { + "gulp-util": "^3.0.0", + "modify-filename": "^1.1.0", + "object-assign": "^4.0.1", + "rev-hash": "^1.0.0", + "rev-path": "^1.0.0", + "sort-keys": "^1.0.0", + "through2": "^2.0.0", + "vinyl-file": "^1.1.0" + } + }, + "gulp-streamify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gulp-streamify/-/gulp-streamify-1.0.2.tgz", + "integrity": "sha1-ANazgU1IbAiPeHOO0HZqvBY4nk0=", + "requires": { + "plexer": "1.0.1" + }, + "dependencies": { + "plexer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plexer/-/plexer-1.0.1.tgz", + "integrity": "sha1-qAG2Ur+BRXOXlepNO/CvlGwwwN0=", "requires": { - "babel-plugin-transform-async-to-generator": "6.7.4", - "babel-plugin-transform-exponentiation-operator": "6.5.0" + "isstream": "^0.1.2", + "readable-stream": "^2.0.2" }, "dependencies": { - "babel-plugin-transform-async-to-generator": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.7.4.tgz", - "integrity": "sha1-rsfHrkX63JqRbs3veHl4Xb1F+a4=", + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "requires": { - "babel-helper-remap-async-to-generator": "6.7.0", - "babel-plugin-syntax-async-functions": "6.5.0", - "babel-runtime": "5.8.38" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" }, "dependencies": { - "babel-helper-remap-async-to-generator": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.7.0.tgz", - "integrity": "sha1-tc2/BYFwuscQ3zFKYTMJfsPJYp0=", - "requires": { - "babel-helper-function-name": "6.6.0", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-function-name": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.6.0.tgz", - "integrity": "sha1-HChms80In3G75frAvykyACBlu7s=", - "requires": { - "babel-helper-get-function-arity": "6.6.5", - "babel-runtime": "5.8.38", - "babel-template": "6.7.0", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-get-function-arity": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.6.5.tgz", - "integrity": "sha1-cC1UsuBiAcZDwERhEFbaUlj3irU=", - "requires": { - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - } - } - } - }, - "babel-template": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.7.0.tgz", - "integrity": "sha1-4w8yY5qivNqmp3vJuSveXJgUSQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "lodash": "3.10.1" - }, - "dependencies": { - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - } - } - }, - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } - } + "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=" + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, - "babel-plugin-syntax-async-functions": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.5.0.tgz", - "integrity": "sha1-kKXOgdRQ88uhdttfdBKlxdgHJ8A=", - "requires": { - "babel-runtime": "5.8.38" - } + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } - } - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.5.0.tgz", - "integrity": "sha1-yvDM90XXGx2RpOCC7bg9FHoaYlM=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.6.5", - "babel-plugin-syntax-exponentiation-operator": "6.5.0", - "babel-runtime": "5.8.38" - }, - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.6.5.tgz", - "integrity": "sha1-5wI9dQy+RUdJUTx3621eootCjA8=", - "requires": { - "babel-helper-explode-assignable-expression": "6.6.5", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-helper-explode-assignable-expression": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.6.5.tgz", - "integrity": "sha1-v4RUf1+9RCkSAWLvSra3gfv9UaA=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "babel-types": "6.7.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", - "integrity": "sha1-f4obrC0rEbviaRaF4XFT6ENVvQI=", - "requires": { - "babel-runtime": "5.8.38", - "babel-traverse": "6.7.6", - "esutils": "2.0.2", - "lodash": "3.10.1", - "to-fast-properties": "1.0.2" - }, - "dependencies": { - "babel-traverse": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.7.6.tgz", - "integrity": "sha1-oUkoBEBAsqbICqWVFIrwtjeNHJM=", - "requires": { - "babel-code-frame": "6.7.5", - "babel-messages": "6.7.2", - "babel-runtime": "5.8.38", - "babel-types": "6.7.2", - "babylon": "6.7.0", - "debug": "2.2.0", - "globals": "8.18.0", - "invariant": "2.2.1", - "lodash": "3.10.1", - "repeating": "1.1.3" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.5.tgz", - "integrity": "sha1-Oy4YyUIj8kELKGqU6q9ppXUBFas=", - "requires": { - "babel-runtime": "5.8.38", - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "1.0.3", - "repeating": "1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - }, - "babel-messages": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.7.2.tgz", - "integrity": "sha1-1G2/xp2kwn4OFFwXRB/GF892r3E=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "babylon": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.7.0.tgz", - "integrity": "sha1-p9aeQMkKWDVcv5tPnK1xEPPAfMo=", - "requires": { - "babel-runtime": "5.8.38" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=" - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "requires": { - "loose-envify": "1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz", - "integrity": "sha1-UnWC1iz/TgTaP5l2xxENM5Lsfgw=", - "requires": { - "js-tokens": "1.0.3" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=" - } - } - } - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=" - } - } - } - } + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.5.0.tgz", - "integrity": "sha1-17+0eehrwcOe5F5gE/uC3cJzJs4=", - "requires": { - "babel-runtime": "5.8.38" - } + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, - "babel-runtime": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", - "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", - "requires": { - "core-js": "1.2.6" - }, - "dependencies": { - "core-js": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", - "integrity": "sha1-4jUfbK52T4w05dg5rLamDO+LSkU=" - } - } + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } } @@ -5885,1441 +2064,532 @@ } } }, - "babelify": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.2.0.tgz", - "integrity": "sha1-WEJJvFBmth+YSz50XthVIDyexz4=", + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "requires": { - "babel-core": "6.3.26", - "object-assign": "4.0.1" + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" }, "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" } } }, - "bootstrap": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz", - "integrity": "sha1-jej3SdyKdD8qxbUQ2Yg3Hj2qZYk=" + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } }, - "codemirror": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.32.0.tgz", - "integrity": "sha512-95OxAlYiigW0g4n4ixFdavG07clJGILp3MvHh2pKR3FvyrTuHHvqtKSVbrV3/Jz6o0YqGvyCDLDTbH4h6ciaSw==" + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true }, - "codemirror-spell-checker": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz", - "integrity": "sha1-HGYPkIlIPMtRE7m6nKGcP0mTNx4=", + "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==", + "optional": true, "requires": { - "typo-js": "1.0.3" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "envify": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.0.tgz", - "integrity": "sha1-oL7VIiJSkHagL6v2zgDu9C17ZzQ=", + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "jstransform": "10.1.0", - "through": "2.3.8" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "jstransform": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-10.1.0.tgz", - "integrity": "sha1-tMSb9j8WLBCLA0g5moc3xxOwqDo=", + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "base62": "0.1.1", - "esprima-fb": "13001.1001.0-dev-harmony-fb", - "source-map": "0.1.31" - }, - "dependencies": { - "base62": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", - "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=" - }, - "esprima-fb": { - "version": "13001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-YzrNtA2b1NuKHB1owGqUKVn60rA=" - }, - "source-map": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", - "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=", - "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } - } - } + "is-buffer": "^1.1.5" } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" } } }, - "gulp": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.0.tgz", - "integrity": "sha1-zx+6TLVYu4xq5slhP1g64mINIUo=", - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.7", - "interpret": "0.6.6", - "liftoff": "2.2.1", - "minimist": "1.2.0", - "orchestrator": "0.3.7", - "pretty-hrtime": "1.0.2", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.0.11", - "vinyl-fs": "0.3.14" + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true + }, + "indx": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" }, "dependencies": { - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.2", - "beeper": "1.1.0", - "chalk": "1.1.3", - "dateformat": "1.0.12", - "fancy-log": "1.2.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.0", - "vinyl": "0.5.3" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=" - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.3.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.3.5", - "object-assign": "4.0.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "loud-rejection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", - "integrity": "sha1-8omjkvF9K6rPGU0KZzAEOUQzsRU=", - "requires": { - "array-find-index": "1.0.1", - "signal-exit": "2.1.2" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=" - }, - "signal-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=" - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "requires": { - "hosted-git-info": "2.1.4", - "is-builtin-module": "1.0.0", - "semver": "4.3.6", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz", - "integrity": "sha1-2elTsmmIvogJbEbpJklNlgTDAPg=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - } - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.2" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "1.2.1" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=" - } - } - }, - "spdx-expression-parse": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", - "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", - "requires": { - "spdx-exceptions": "1.0.4", - "spdx-license-ids": "1.2.1" - }, - "dependencies": { - "spdx-exceptions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", - "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=" - }, - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=" - } - } - } - } - } - } - }, - "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.3.5", - "path-type": "1.1.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "4.1.3", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "requires": { - "is-arrayish": "0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "4.1.3", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "requires": { - "chalk": "1.1.3", - "time-stamp": "1.0.1" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=" - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "requires": { - "sparkles": "1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "requires": { - "sparkles": "1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "requires": { - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.0.8", - "lodash.isarray": "3.0.4" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash.isarguments": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz", - "integrity": "sha1-W/jaiH8B8qnknAoXXNrrMYoOQ9w=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - } - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "1.1.13" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", - "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "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=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - } - } - } - } - }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" - }, - "liftoff": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.1.tgz", - "integrity": "sha1-jf74SNP0QZIcSjEfwyA66cNMQac=", - "requires": { - "extend": "2.0.1", - "findup-sync": "0.3.0", - "flagged-respawn": "0.3.2", - "rechoir": "0.6.2", - "resolve": "1.1.7" - }, - "dependencies": { - "extend": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz", - "integrity": "sha1-HugBBonnOV/5RIJByYZSvHWagmA=" - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "1.0.4", - "inherits": "2.0.1", - "minimatch": "3.0.0", - "once": "1.3.3", - "path-is-absolute": "1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", - "requires": { - "once": "1.3.3", - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "minimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", - "requires": { - "brace-expansion": "1.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", - "requires": { - "balanced-match": "0.3.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" - } - } - } - } - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "1.1.7" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "orchestrator": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.7.tgz", - "integrity": "sha1-xFBk4ixaKnuZc09AmpX/7cfTw98=", - "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.0" - }, - "dependencies": { - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "requires": { - "once": "1.3.3" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - } - } - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" - }, - "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=" - } - } - }, - "pretty-hrtime": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.2.tgz", - "integrity": "sha1-cMqW9NBiikQ7kYdY95QWqae8n6g=" - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "os-homedir": "1.0.1" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=" - } + "is-buffer": "^1.1.5" } - }, - "v8flags": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", - "integrity": "sha1-vKjzDw1tYGEswsAGQeaWLUKuaIE=", + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "user-home": "1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" - } + "is-buffer": "^1.1.5" } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "optional": true + }, + "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=", + "optional": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "optional": 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==" + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "leaflet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.1.0.tgz", + "integrity": "sha512-JK2bT5tZnLQlNuLa8pjOvUC/c/t4MfXBPZyrNK3C1BBxfX1rMHxFC2DvVCNd8esRjDtEddnwSTlv54sC5gvtMQ==" + }, + "less": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", + "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.72.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "optional": true + } + } + }, + "less-plugin-clean-css": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/less-plugin-clean-css/-/less-plugin-clean-css-1.5.1.tgz", + "integrity": "sha1-zFeveqM5iVflbezr5jy2DCNClwM=", + "requires": { + "clean-css": "^3.0.1" + }, + "dependencies": { + "clean-css": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.12.tgz", + "integrity": "sha1-BHKhYoyYD7Af6jquqyttNn2yd8I=", "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.8", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" + "commander": "2.8.x", + "source-map": "0.4.x" }, "dependencies": { - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - } - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "requires": { - "inflight": "1.0.4", - "inherits": "2.0.1", - "minimatch": "2.0.10", - "once": "1.3.3" - }, - "dependencies": { - "inflight": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", - "requires": { - "once": "1.3.3", - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - } - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "requires": { - "find-index": "0.1.1" - }, - "dependencies": { - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" - } - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "requires": { - "brace-expansion": "1.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", - "requires": { - "balanced-match": "0.3.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "requires": { - "gaze": "0.5.2" - }, - "dependencies": { - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "requires": { - "globule": "0.1.0" - }, - "dependencies": { - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" - } - } - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - } - } - } - } - } - } - } - } - }, - "graceful-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", - "integrity": "sha1-zoE+cl+oL35hR9UcmlymgnBVHCI=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "requires": { - "minimist": "0.0.8" + "graceful-readlink": ">= 1.0.0" }, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" } } }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" + "amdefine": ">=0.0.4" }, "dependencies": { - "first-chunk-stream": { + "amdefine": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - } - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": "1.0.33", - "xtend": "4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", - "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "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=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" } } } @@ -7327,2961 +2597,1582 @@ } } }, - "gulp-less": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.0.5.tgz", - "integrity": "sha1-gpSiB+Xo0m8L+pdsunZir1yZvQE=", - "requires": { - "accord": "0.20.5", - "gulp-util": "3.0.7", - "less": "2.5.3", - "object-assign": "4.0.1", - "through2": "2.0.0", - "vinyl-sourcemaps-apply": "0.2.1" + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.7.tgz", + "integrity": "sha1-gO87vxvQDRyc/r5CuhuMhdoljQ0=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "requires": { + "duplexer2": "0.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, + "net-browserify-stub": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/net-browserify-stub/-/net-browserify-stub-0.0.1.tgz", + "integrity": "sha1-yrMxPfq4yG5yeJLGHc31dD5HZdY=" + }, + "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=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "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=" + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" }, "dependencies": { - "accord": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/accord/-/accord-0.20.5.tgz", - "integrity": "sha1-pP2ObnJB4G73pjyoOUHNjkndrIw=", - "requires": { - "convert-source-map": "1.2.0", - "fobject": "0.0.3", - "glob": "5.0.15", - "indx": "0.2.3", - "lodash": "3.10.1", - "resolve": "1.1.7", - "semver": "4.3.6", - "uglify-js": "2.6.2", - "when": "3.7.7" - }, - "dependencies": { - "convert-source-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", - "integrity": "sha1-RMCMJQbxD7PKb9iI1aNETPjWpmk=" - }, - "fobject": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/fobject/-/fobject-0.0.3.tgz", - "integrity": "sha1-nRPrA9hr8JvdPRQxccrKiLPzgww=", - "requires": { - "graceful-fs": "3.0.8", - "semver": "4.3.6", - "when": "3.7.7" - }, - "dependencies": { - "graceful-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", - "integrity": "sha1-zoE+cl+oL35hR9UcmlymgnBVHCI=" - } - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "1.0.4", - "inherits": "2.0.1", - "minimatch": "3.0.0", - "once": "1.3.3", - "path-is-absolute": "1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", - "requires": { - "once": "1.3.3", - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "minimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", - "requires": { - "brace-expansion": "1.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", - "requires": { - "balanced-match": "0.3.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1.0.1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" - } - } - }, - "indx": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", - "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=" - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" - }, - "uglify-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", - "integrity": "sha1-9QvoikLNOWpiUdxSqzcvccwS/vA=", - "requires": { - "async": "0.2.10", - "source-map": "0.5.3", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "source-map": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", - "integrity": "sha1-gmdLhacbC+dsPnQW0V6fUlLrO+A=" - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.3" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "3.0.2", - "longest": "1.0.1", - "repeat-string": "1.5.4" - }, - "dependencies": { - "kind-of": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", - "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", - "requires": { - "is-buffer": "1.1.3" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=" - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=" - } - } - }, - "lazy-cache": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.3.tgz", - "integrity": "sha1-6XdUYY+ciGu5mbL/aceLgkU9ZnQ=" - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "0.1.4" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "3.0.2", - "longest": "1.0.1", - "repeat-string": "1.5.4" - }, - "dependencies": { - "kind-of": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", - "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", - "requires": { - "is-buffer": "1.1.3" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=" - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=" - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - } - } - } - } - }, - "when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=" - } - } + "process": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.2.tgz", + "integrity": "sha1-iljR0SxXPz+JDamEik/o4Wypd7I=" }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.2", - "beeper": "1.1.0", - "chalk": "1.1.3", - "dateformat": "1.0.12", - "fancy-log": "1.2.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.0", - "vinyl": "0.5.3" + "inherits": "2.0.1" }, "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.3.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.3.5", - "object-assign": "4.0.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "loud-rejection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", - "integrity": "sha1-8omjkvF9K6rPGU0KZzAEOUQzsRU=", - "requires": { - "array-find-index": "1.0.1", - "signal-exit": "2.1.2" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=" - }, - "signal-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=" - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "requires": { - "hosted-git-info": "2.1.4", - "is-builtin-module": "1.0.0", - "semver": "5.1.0", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz", - "integrity": "sha1-2elTsmmIvogJbEbpJklNlgTDAPg=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - } - } - }, - "semver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.2" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "1.2.1" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=" - } - } - }, - "spdx-expression-parse": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", - "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", - "requires": { - "spdx-exceptions": "1.0.4", - "spdx-license-ids": "1.2.1" - }, - "dependencies": { - "spdx-exceptions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", - "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=" - }, - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=" - } - } - } - } - } - } - }, - "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.3.5", - "path-type": "1.1.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "4.1.3", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "requires": { - "is-arrayish": "0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "4.1.3", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "requires": { - "chalk": "1.1.3", - "time-stamp": "1.0.1" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=" - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "requires": { - "sparkles": "1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "requires": { - "sparkles": "1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "requires": { - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.0.8", - "lodash.isarray": "3.0.4" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash.isarguments": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz", - "integrity": "sha1-W/jaiH8B8qnknAoXXNrrMYoOQ9w=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "1.1.13" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", - "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "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=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - } - } + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" } } + } + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.2.tgz", + "integrity": "sha1-iljR0SxXPz+JDamEik/o4Wypd7I=" + }, + "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==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true + }, + "psl": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "optional": 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==", + "optional": true + }, + "q": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "optional": 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" + } + }, + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rev-hash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rev-hash/-/rev-hash-1.0.0.tgz", + "integrity": "sha1-lpk5Weqb+xxZsTrfAqwuNLs3NgM=" + }, + "rev-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rev-path/-/rev-path-1.0.0.tgz", + "integrity": "sha1-1My0NqwzcMRgcXXOiOr8XGXF1lM=", + "requires": { + "modify-filename": "^1.0.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simplemde": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/simplemde/-/simplemde-1.11.2.tgz", + "integrity": "sha1-ojo12XjSxA7wfewAjJLwcNjggOM=", + "requires": { + "codemirror": "*", + "codemirror-spell-checker": "*", + "marked": "*" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } }, - "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "source-map": "0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", - "integrity": "sha1-gmdLhacbC+dsPnQW0V6fUlLrO+A=" - } + "is-extendable": "^0.1.0" } } } }, - "gulp-rev": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-6.0.1.tgz", - "integrity": "sha1-2Iah3CEx0iAr82ojj49IBleCoL0=", - "requires": { - "gulp-util": "3.0.7", - "modify-filename": "1.1.0", - "object-assign": "4.0.1", - "rev-hash": "1.0.0", - "rev-path": "1.0.0", - "sort-keys": "1.1.1", - "through2": "2.0.0", - "vinyl-file": "1.3.0" + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.2", - "beeper": "1.1.0", - "chalk": "1.1.3", - "dateformat": "1.0.12", - "fancy-log": "1.2.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.0", - "vinyl": "0.5.3" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.3.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.3.5", - "object-assign": "4.0.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "loud-rejection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", - "integrity": "sha1-8omjkvF9K6rPGU0KZzAEOUQzsRU=", - "requires": { - "array-find-index": "1.0.1", - "signal-exit": "2.1.2" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=" - }, - "signal-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=" - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "requires": { - "hosted-git-info": "2.1.4", - "is-builtin-module": "1.0.0", - "semver": "5.1.0", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz", - "integrity": "sha1-2elTsmmIvogJbEbpJklNlgTDAPg=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - } - } - }, - "semver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.2" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "1.2.1" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=" - } - } - }, - "spdx-expression-parse": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", - "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", - "requires": { - "spdx-exceptions": "1.0.4", - "spdx-license-ids": "1.2.1" - }, - "dependencies": { - "spdx-exceptions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", - "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=" - }, - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=" - } - } - } - } - } - } - }, - "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.3.5", - "path-type": "1.1.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "4.1.3", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "requires": { - "is-arrayish": "0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "4.1.3", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "requires": { - "number-is-nan": "1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "requires": { - "chalk": "1.1.3", - "time-stamp": "1.0.1" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=" - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "requires": { - "sparkles": "1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "requires": { - "sparkles": "1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "requires": { - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.0.8", - "lodash.isarray": "3.0.4" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash.isarguments": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz", - "integrity": "sha1-W/jaiH8B8qnknAoXXNrrMYoOQ9w=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "1.1.13" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", - "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "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=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - } - } - } + "is-descriptor": "^1.0.0" } }, - "modify-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", - "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" - }, - "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" - }, - "rev-hash": { + "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rev-hash/-/rev-hash-1.0.0.tgz", - "integrity": "sha1-lpk5Weqb+xxZsTrfAqwuNLs3NgM=" + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } }, - "rev-path": { + "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rev-path/-/rev-path-1.0.0.tgz", - "integrity": "sha1-1My0NqwzcMRgcXXOiOr8XGXF1lM=", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "modify-filename": "1.1.0" + "kind-of": "^6.0.0" } }, - "sort-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.1.tgz", - "integrity": "sha1-p5HCYHHfZsNWv13K2c+1ensvgm4=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-plain-obj": "1.1.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "vinyl-file": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-1.3.0.tgz", - "integrity": "sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc=", + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "graceful-fs": "4.1.3", - "strip-bom": "2.0.0", - "strip-bom-stream": "1.0.0", - "vinyl": "1.1.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - } - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "requires": { - "first-chunk-stream": "1.0.0", - "strip-bom": "2.0.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - } - } - }, - "vinyl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.1.1.tgz", - "integrity": "sha1-eUCIfu8JOB6zYmrEwPmrU9S35FA=", - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - } - } - } + "is-buffer": "^1.1.5" } } } }, - "gulp-streamify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/gulp-streamify/-/gulp-streamify-1.0.2.tgz", - "integrity": "sha1-ANazgU1IbAiPeHOO0HZqvBY4nk0=", + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { - "plexer": "1.0.1" + "is-plain-obj": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "optional": 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" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { - "plexer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plexer/-/plexer-1.0.1.tgz", - "integrity": "sha1-qAG2Ur+BRXOXlepNO/CvlGwwwN0=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "isstream": "0.1.2", - "readable-stream": "2.0.6" - }, - "dependencies": { - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "1.0.0", - "process-nextick-args": "1.0.6", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process-nextick-args": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", - "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - } - } - } + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" } } } }, - "jquery": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.1.4.tgz", - "integrity": "sha1-IoveaYoMYUMdwmMKahVPFYkNIxc=" + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, - "leaflet": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz", - "integrity": "sha1-HjUrpU5j0HZFH6NjyQCJDLLPde4=" + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "less": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.5.3.tgz", - "integrity": "sha1-n/WG6KcDUV/Bjcmce8SY0vOtSEk=", - "requires": { - "errno": "0.1.4", - "graceful-fs": "3.0.8", - "image-size": "0.3.5", - "mime": "1.3.4", - "mkdirp": "0.5.1", - "promise": "6.1.0", - "request": "2.70.0", - "source-map": "0.4.4" + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" }, "dependencies": { - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "optional": true, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", "requires": { - "prr": "0.0.0" - }, - "dependencies": { - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "optional": true - } + "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" } }, - "graceful-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", - "integrity": "sha1-zoE+cl+oL35hR9UcmlymgnBVHCI=", - "optional": true - }, - "image-size": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.3.5.tgz", - "integrity": "sha1-gyQOqy+1sAsEqrjHSwRx6cunrYw=", - "optional": true - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, + "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==", "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true - } + "safe-buffer": "~5.1.0" } - }, - "promise": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", - "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", - "optional": true, + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "asap": "1.0.0" - }, - "dependencies": { - "asap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", - "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=", - "optional": true - } + "is-buffer": "^1.1.5" } - }, - "request": { - "version": "2.70.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.70.0.tgz", - "integrity": "sha1-fs+EN9b7VT6S4pgaQRue4qrdfM4=", - "optional": true, + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "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==", + "optional": 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=", + "optional": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": 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=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typo-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.0.3.tgz", + "integrity": "sha1-VNjrx5SfGngQkItgAsaEFSbJnVo=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.3.2", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.0", - "forever-agent": "0.6.1", - "form-data": "1.0.0-rc4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.10", - "node-uuid": "1.4.7", - "oauth-sign": "0.8.1", - "qs": "6.1.0", - "stringstream": "0.0.5", - "tough-cookie": "2.2.2", - "tunnel-agent": "0.4.2" - }, - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "optional": true - }, - "aws4": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", - "integrity": "sha1-054L7kEs7Q6O2Uoj4xTzE6lbn9E=", - "optional": true, - "requires": { - "lru-cache": "4.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", - "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", - "optional": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.0.0" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "optional": true - }, - "yallist": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", - "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", - "optional": true - } - } - } - } - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "optional": true, - "requires": { - "readable-stream": "2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "1.0.0", - "process-nextick-args": "1.0.6", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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=", - "optional": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "process-nextick-args": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", - "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=", - "optional": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - } - } - } - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "optional": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - } - } - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "optional": true, - "requires": { - "async": "1.5.2", - "combined-stream": "1.0.5", - "mime-types": "2.1.10" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "optional": true - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "optional": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "is-my-json-valid": "2.13.1", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "optional": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "optional": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "optional": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "optional": true, - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "optional": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "optional": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "optional": true - } - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "optional": true, - "requires": { - "graceful-readlink": "1.0.1" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "optional": true - } - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", - "optional": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "2.0.0", - "xtend": "4.0.1" - }, - "dependencies": { - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "optional": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "optional": true, - "requires": { - "is-property": "1.0.2" - }, - "dependencies": { - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "optional": true - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", - "optional": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "optional": true - } - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "optional": true, - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "optional": true - } - } - } - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "optional": true, - "requires": { - "hoek": "2.16.3" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.2.2", - "sshpk": "1.7.4" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "jsprim": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", - "integrity": "sha1-8gyQaskqvVjjt5rIvHCkiDJRLaE=", - "optional": true, - "requires": { - "extsprintf": "1.0.2", - "json-schema": "0.2.2", - "verror": "1.3.6" - }, - "dependencies": { - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" - }, - "json-schema": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", - "optional": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - } - } - }, - "sshpk": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz", - "integrity": "sha1-rXtH3vymHIQV2WQkO2KwzmD7yjg=", - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "0.2.0", - "dashdash": "1.13.0", - "ecc-jsbn": "0.1.1", - "jodid25519": "1.0.2", - "jsbn": "0.1.0", - "tweetnacl": "0.14.3" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "optional": true - }, - "dashdash": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", - "integrity": "sha1-parm/Z2OFWYk6w3ZJZ6xK6JFOFo=", - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.0" - } - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "optional": true, - "requires": { - "jsbn": "0.1.0" - } - }, - "jsbn": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", - "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", - "optional": true - }, - "tweetnacl": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz", - "integrity": "sha1-PaOC9nDyXe1417PReSEZvKC3Ey0=", - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true - }, - "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=", - "optional": true - }, - "mime-types": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", - "integrity": "sha1-uTx8tDYuFtQQcqflRTj7TUMHCDc=", - "requires": { - "mime-db": "1.22.0" - }, - "dependencies": { - "mime-db": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz", - "integrity": "sha1-qyOmNy3J2G09yRIb0OvTgQWhkEo=" - } - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "optional": true - }, - "oauth-sign": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", - "integrity": "sha1-GCQ5vbkTeL90YOdcZOpD5kSN7wY=", - "optional": true - }, - "qs": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz", - "integrity": "sha1-7B0WJrJCeNmfD99FSeUk4k7O6yY=", - "optional": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "optional": true - }, - "tough-cookie": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", - "integrity": "sha1-yDoYMPTl7wuT7yo0iOck+N4Basc=", - "optional": true - }, - "tunnel-agent": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", - "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=", - "optional": true - } + "is-extendable": "^0.1.0" } }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "optional": true, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "optional": true - } + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, - "less-plugin-clean-css": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/less-plugin-clean-css/-/less-plugin-clean-css-1.5.1.tgz", - "integrity": "sha1-zFeveqM5iVflbezr5jy2DCNClwM=", + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "clean-css": "3.4.12" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { - "clean-css": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.12.tgz", - "integrity": "sha1-BHKhYoyYD7Af6jquqyttNn2yd8I=", + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "commander": "2.8.1", - "source-map": "0.4.4" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } + "isarray": "1.0.0" } } } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "optional": true, + "requires": { + "punycode": "^2.1.0" + } }, - "marked": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.7.tgz", - "integrity": "sha512-zBEP4qO1YQp5aXHt8S5wTiOv9i2X74V/LQL0zhUNvVaklt6Ywa6lChxIvS+ibYlCGgADwKwZFhjC3+XfpsvQvQ==" + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { - "process": "0.11.2", - "util": "0.10.3" + "punycode": "1.3.2", + "querystring": "0.2.0" }, "dependencies": { - "process": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.2.tgz", - "integrity": "sha1-iljR0SxXPz+JDamEik/o4Wypd7I=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "optional": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "requires": { + "user-home": "^1.1.1" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } }, - "simplemde": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/simplemde/-/simplemde-1.11.2.tgz", - "integrity": "sha1-ojo12XjSxA7wfewAjJLwcNjggOM=", + "vinyl-file": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-1.3.0.tgz", + "integrity": "sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc=", "requires": { - "codemirror": "5.32.0", - "codemirror-spell-checker": "1.1.2", - "marked": "0.3.7" + "graceful-fs": "^4.1.2", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "vinyl": "^1.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } } }, - "through2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.0.tgz", - "integrity": "sha1-9BocMd9eEp5DFERvZuygXNajBIA=", + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "requires": { - "readable-stream": "2.0.6", - "xtend": "4.0.1" + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" }, "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + }, "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "1.0.0", - "process-nextick-args": "1.0.6", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process-nextick-args": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", - "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } } } }, - "typo-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.0.3.tgz", - "integrity": "sha1-VNjrx5SfGngQkItgAsaEFSbJnVo=" - }, "vinyl-source-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", "requires": { - "through2": "0.6.5", - "vinyl": "0.4.6" + "through2": "^0.6.1", + "vinyl": "^0.4.3" }, "dependencies": { "through2": { @@ -10289,8 +4180,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "requires": { - "readable-stream": "1.0.33", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" }, "dependencies": { "readable-stream": { @@ -10298,10 +4189,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" }, "dependencies": { "core-util-is": { @@ -10338,8 +4229,8 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" }, "dependencies": { "clone": { @@ -10356,465 +4247,93 @@ } } }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + } + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, "yarb": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/yarb/-/yarb-0.6.1.tgz", - "integrity": "sha1-tfER7hSKgFvXucE4OhGeZVdU4DE=", - "requires": { - "array-uniq": "1.0.2", - "browser-pack": "6.0.1", - "buffer": "3.6.0", - "concat-stream": "1.5.1", - "detective": "4.3.1", - "events": "1.1.0", - "inherits": "2.0.1", - "insert-module-globals": "7.0.1", - "object-assign": "4.0.1", - "path-browserify": "0.0.0", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/yarb/-/yarb-0.8.0.tgz", + "integrity": "sha1-AuRAOkdR4geR8gC++eJCU9h2zwY=", + "requires": { + "array-uniq": "^1.0.2", + "browser-pack": "^6.0.1", + "buffer": "^3.1.2", + "concat-stream": "^1.4.7", + "detective": "^4.0.0", + "events": "^1.0.2", + "inherits": "^2.0.1", + "insert-module-globals": "^7.0.1", + "net-browserify-stub": "0.0.1", + "object-assign": "^4.0.1", + "path-browserify": "^0.0.0", "process": "0.11.2", - "sliced": "1.0.1", - "stream-browserify": "2.0.1", - "util": "0.10.3", - "vinyl": "1.1.1" + "sliced": "^1.0.1", + "stream-browserify": "^2.0.1", + "url": "^0.11.0", + "util": "^0.10.3", + "vinyl": "^1.1.0" }, "dependencies": { - "array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" - }, - "browser-pack": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.1.tgz", - "integrity": "sha1-d5iHx5LqofZKRqIsjxBRzc2WdV8=", - "requires": { - "JSONStream": "1.1.1", - "combine-source-map": "0.7.1", - "defined": "1.0.0", - "through2": "2.0.0", - "umd": "3.0.1" - }, - "dependencies": { - "JSONStream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", - "integrity": "sha1-yYv9iMjx4ehpTlPFuqbIaRVT5Zo=", - "requires": { - "jsonparse": "1.2.0", - "through": "2.3.8" - }, - "dependencies": { - "jsonparse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", - "integrity": "sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - } - } - }, - "combine-source-map": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.1.tgz", - "integrity": "sha1-FyB3He5/MiHOPGKhBO6alj8SAJ4=", - "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.6.1", - "lodash.memoize": "3.0.4", - "source-map": "0.4.2" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "inline-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.1.tgz", - "integrity": "sha1-+dHxlpBnTVFTnN/UTv1xPaws/gQ=", - "requires": { - "source-map": "0.4.2" - } - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" - }, - "source-map": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.2.tgz", - "integrity": "sha1-3J8xFDlKt8H5eCly89EYIP/wbx8=", - "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "umd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", - "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=" - } - } - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "requires": { - "base64-js": "0.0.8", - "ieee754": "1.1.6", - "isarray": "1.0.0" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "ieee754": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz", - "integrity": "sha1-LhATIZxtZxKXPsVNmB7BnlV53pc=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, - "concat-stream": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", - "integrity": "sha1-87gKz54fSOOHXAaItBtsMWAu6hw=", - "requires": { - "inherits": "2.0.1", - "readable-stream": "2.0.6", - "typedarray": "0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "1.0.0", - "process-nextick-args": "1.0.6", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process-nextick-args": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", - "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - } - } - }, - "detective": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", - "integrity": "sha1-n7Bt0e6PDqTbzGB82jnZzh1Pcm8=", - "requires": { - "acorn": "1.2.2", - "defined": "1.0.0" - }, - "dependencies": { - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - } - } - }, - "events": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.0.tgz", - "integrity": "sha1-SzifwgD5EHQuv/Orsu/jNpD0VCk=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "insert-module-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", - "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", - "requires": { - "JSONStream": "1.1.1", - "combine-source-map": "0.7.1", - "concat-stream": "1.5.1", - "is-buffer": "1.1.3", - "lexical-scope": "1.2.0", - "process": "0.11.2", - "through2": "2.0.0", - "xtend": "4.0.1" - }, - "dependencies": { - "JSONStream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", - "integrity": "sha1-yYv9iMjx4ehpTlPFuqbIaRVT5Zo=", - "requires": { - "jsonparse": "1.2.0", - "through": "2.3.8" - }, - "dependencies": { - "jsonparse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", - "integrity": "sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - } - } - }, - "combine-source-map": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.1.tgz", - "integrity": "sha1-FyB3He5/MiHOPGKhBO6alj8SAJ4=", - "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.6.1", - "lodash.memoize": "3.0.4", - "source-map": "0.4.2" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "inline-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.1.tgz", - "integrity": "sha1-+dHxlpBnTVFTnN/UTv1xPaws/gQ=", - "requires": { - "source-map": "0.4.2" - } - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" - }, - "source-map": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.2.tgz", - "integrity": "sha1-3J8xFDlKt8H5eCly89EYIP/wbx8=", - "requires": { - "amdefine": "1.0.0" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } - } - } - } - }, - "is-buffer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=" - }, - "lexical-scope": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "requires": { - "astw": "2.0.0" - }, - "dependencies": { - "astw": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", - "integrity": "sha1-CBIayCiNNWEcDO7GY/bNVFYEiX0=", - "requires": { - "acorn": "1.2.2" - }, - "dependencies": { - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" - } - } - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } - }, - "object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "process": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.2.tgz", - "integrity": "sha1-iljR0SxXPz+JDamEik/o4Wypd7I=" - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "2.0.1", - "readable-stream": "2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.1", - "isarray": "1.0.0", - "process-nextick-args": "1.0.6", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process-nextick-args": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", - "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - } - } - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - }, "vinyl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.1.1.tgz", - "integrity": "sha1-eUCIfu8JOB6zYmrEwPmrU9S35FA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - } } } } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } } } } diff --git a/package.json b/package.json index a0b983a95..2d97e50b3 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "leaflet": "1.1.0", "less": "2.7.2", "less-plugin-clean-css": "1.5.1", - "lodash": "4.17.4", "path": "0.12.7", "q": "1.5.0", "simplemde": "^1.11.2", @@ -29,5 +28,8 @@ "vinyl-source-stream": "1.1.0", "yarb": "0.8.0" }, - "private": true + "private": true, + "devDependencies": { + "lodash": "4.17.11" + } } From 42b8736b015ed6c1b5f2e5f532f961ed1eb3b04c Mon Sep 17 00:00:00 2001 From: Suyash Garg Date: Tue, 18 Jun 2019 22:18:11 +0200 Subject: [PATCH 048/159] Update jquery and bootstrap --- npm-shrinkwrap.json | 114 +++++++++++++++++++++++--------------------- package.json | 5 +- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a4220b30f..c56a18f98 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -54,9 +54,10 @@ } }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.0.tgz", + "integrity": "sha512-vvZ8PwswGTM15ZXyk3I+SvpTm8UbF8iRnGiU/f9TPU6By7K1XTvfvusFtoQt0WYycudFSYW2lrJDivhBlGovvQ==", + "dev": true }, "acorn-dynamic-import": { "version": "4.0.0", @@ -118,6 +119,11 @@ } } }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -1011,9 +1017,10 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" }, "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "dev": true }, "bootstrap-rating-input": { "version": "0.4.0", @@ -1160,6 +1167,25 @@ } } }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -1233,6 +1259,14 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1423,6 +1457,13 @@ "requires": { "acorn": "^5.2.1", "defined": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + } } }, "duplexer2": { @@ -1938,6 +1979,11 @@ "natives": "^1.1.0" } }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, "gulp": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", @@ -2449,9 +2495,10 @@ "optional": true }, "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.0.tgz", + "integrity": "sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ==", + "dev": true }, "js-tokens": { "version": "3.0.2", @@ -2552,49 +2599,6 @@ "integrity": "sha1-zFeveqM5iVflbezr5jy2DCNClwM=", "requires": { "clean-css": "^3.0.1" - }, - "dependencies": { - "clean-css": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.12.tgz", - "integrity": "sha1-BHKhYoyYD7Af6jquqyttNn2yd8I=", - "requires": { - "commander": "2.8.x", - "source-map": "0.4.x" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" - } - } - } - } - } } }, "liftoff": { @@ -2800,9 +2804,9 @@ } }, "marked": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.7.tgz", - "integrity": "sha1-gO87vxvQDRyc/r5CuhuMhdoljQ0=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==" }, "micromatch": { "version": "3.1.10", diff --git a/package.json b/package.json index 2d97e50b3..597828b35 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,12 @@ "babel-preset-es2015": "6.24.1", "babel-preset-stage-2": "6.24.1", "babelify": "7.3.0", - "bootstrap": "3.3.7", "bootstrap-rating-input": "0.4.0", "envify": "4.1.0", "gulp": "3.9.1", "gulp-less": "3.3.2", "gulp-rev": "7.1.2", "gulp-streamify": "1.0.2", - "jquery": "3.2.1", "leaflet": "1.1.0", "less": "2.7.2", "less-plugin-clean-css": "1.5.1", @@ -30,6 +28,9 @@ }, "private": true, "devDependencies": { + "acorn": "6.0.0", + "bootstrap": "3.4.1", + "jquery": "3.4.0", "lodash": "4.17.11" } } From 83e3fa2646b2829dc486cf5d56a561ad3fdb1e1b Mon Sep 17 00:00:00 2001 From: spellew Date: Sun, 23 Jun 2019 13:52:39 -0400 Subject: [PATCH 049/159] Restored critiquebrainz.frontend.external.musicbrainz_db.__init__.py --- .../external/musicbrainz_db/__init__.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py index e23950c1c..ac794e086 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py @@ -1 +1,26 @@ +from typing import Optional +from contextlib import contextmanager +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, scoped_session, Session +from sqlalchemy.pool import NullPool + +engine = None +Session: Optional[Session] = None # noqa: F811 DEFAULT_CACHE_EXPIRATION = 12 * 60 * 60 # seconds (12 hours) + + +def init_db_engine(connect_str): + global engine, Session + engine = create_engine(connect_str, poolclass=NullPool) + Session = scoped_session( + sessionmaker(bind=engine) + ) + + +@contextmanager +def mb_session(): + session = Session() + try: + yield session + finally: + session.close() From 2135d68a0053e04c0d7907209d41fec075eb48ea Mon Sep 17 00:00:00 2001 From: spellew Date: Sun, 23 Jun 2019 14:21:29 -0400 Subject: [PATCH 050/159] Fixed PyLint import warnings --- .../external/musicbrainz_db/entities.py | 6 +- .../external/musicbrainz_db/helpers.py | 81 ++++++ .../external/musicbrainz_db/includes.py | 35 +++ .../external/musicbrainz_db/release_group.py | 2 +- .../external/musicbrainz_db/serialize.py | 232 ++++++++++++++++++ .../frontend/external/musicbrainz_db/utils.py | 88 +++++++ .../frontend/views/test/test_review.py | 2 +- 7 files changed, 441 insertions(+), 5 deletions(-) create mode 100644 critiquebrainz/frontend/external/musicbrainz_db/helpers.py create mode 100644 critiquebrainz/frontend/external/musicbrainz_db/includes.py create mode 100644 critiquebrainz/frontend/external/musicbrainz_db/serialize.py create mode 100644 critiquebrainz/frontend/external/musicbrainz_db/utils.py diff --git a/critiquebrainz/frontend/external/musicbrainz_db/entities.py b/critiquebrainz/frontend/external/musicbrainz_db/entities.py index 369bfe954..5dde7072c 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/entities.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/entities.py @@ -1,9 +1,9 @@ +from brainzutils.musicbrainz_db.place import fetch_multiple_places +from brainzutils.musicbrainz_db.event import fetch_multiple_events +from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups from critiquebrainz.frontend.external.musicbrainz_db.release_group import get_release_group_by_id from critiquebrainz.frontend.external.musicbrainz_db.place import get_place_by_id from critiquebrainz.frontend.external.musicbrainz_db.event import get_event_by_id -from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups -from brainzutils.musicbrainz_db.place import fetch_multiple_places -from brainzutils.musicbrainz_db.event import fetch_multiple_events def get_multiple_entities(entities): diff --git a/critiquebrainz/frontend/external/musicbrainz_db/helpers.py b/critiquebrainz/frontend/external/musicbrainz_db/helpers.py new file mode 100644 index 000000000..2ddd90ab1 --- /dev/null +++ b/critiquebrainz/frontend/external/musicbrainz_db/helpers.py @@ -0,0 +1,81 @@ +from mbdata.utils.models import get_link_model +from mbdata.models import Tag +from sqlalchemy.orm import joinedload +from sqlalchemy import func +from critiquebrainz.frontend.external.musicbrainz_db.utils import ENTITY_MODELS + + +def get_relationship_info(*, db, target_type, source_type, source_entity_ids, includes_data): + """Get information related to relationships between different entities. + + Keep in mind that includes_data (dict) is altered to contain the relationship objects + keyed by the source entity MBIDs. + + Args: + db (Session object): Session object. + target_type (str): Type of target entity. + source_type (str): Type of source entity. + source_entity_ids (list): IDs of the source entity. + includes_data (dict): Dictionary containing includes data of entities. + """ + source_model = ENTITY_MODELS[source_type] + target_model = ENTITY_MODELS[target_type] + relation = get_link_model(source_model, target_model) + + query = db.query(relation).\ + options(joinedload("link", innerjoin=True)).\ + options(joinedload("link.link_type", innerjoin=True)) + if relation.entity0.property.mapper.class_ == relation.entity1.property.mapper.class_: + _relationship_link_helper(relation, query, "entity0", "entity1", target_type, source_entity_ids, includes_data) + _relationship_link_helper(relation, query, "entity1", "entity0", target_type, source_entity_ids, includes_data) + else: + if source_model == relation.entity0.property.mapper.class_: + _relationship_link_helper(relation, query, "entity0", "entity1", target_type, source_entity_ids, includes_data) + else: + _relationship_link_helper(relation, query, "entity1", "entity0", target_type, source_entity_ids, includes_data) + + +def _relationship_link_helper(relation, query, source_attr, target_attr, target_type, source_entity_ids, includes_data): + """Get relationship links between two entities. + + Keep in mind that includes_data (dict) is altered to contain the relationship objects + keyed by the source entity MBIDs. + + Args: + relation (mbdata.model): Model relating the two entities. + query (Session.query): Query object. + source_attr (str): 'entity0' or 'entity1' based on which represents source model in relation table. + target_attr (str): 'entity0' or 'entity1' based on which represents target model in relation table. + target_type (str): Type of the target entity. + source_entity_ids (list): IDs of the source entity. + includes_data (dict): Dictionary containing the includes data of entities. + """ + source_id_attr = source_attr + "_id" + query = query.filter(getattr(relation, source_id_attr).in_(source_entity_ids)) + query = query.options(joinedload(target_attr, innerjoin=True)) + relation_type = target_type + "-rels" + for link in query: + includes_data[getattr(link, source_id_attr)].setdefault('relationship_objs', {}).\ + setdefault(relation_type, []).append(link) + + +def get_tags(*, db, entity_model, tag_model, foreign_tag_id, entity_ids): + """Get tags associated with entities. + + Args: + db (Session object): Session object. + entity_model (mbdata.models): Model of the entity. + tag_model (mbdata.models): Tag of the model. + foreign_tag_id (tag_model.foreign_key): Foreign ID that joins the tag model and entity model + entity_ids (list): IDs of the entity whose tags are to be fetched + + Returns: + List of tuples containing the entity_ids and the list of associated tags. + """ + tags = db.query(entity_model.id, func.array_agg(Tag.name)).\ + join(tag_model, entity_model.id == foreign_tag_id).\ + join(Tag).\ + filter(entity_model.id.in_(entity_ids)).\ + group_by(entity_model.id).\ + all() + return tags diff --git a/critiquebrainz/frontend/external/musicbrainz_db/includes.py b/critiquebrainz/frontend/external/musicbrainz_db/includes.py new file mode 100644 index 000000000..325d83ea9 --- /dev/null +++ b/critiquebrainz/frontend/external/musicbrainz_db/includes.py @@ -0,0 +1,35 @@ +import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions + +RELATABLE_TYPES = [ + 'area', + 'artist', + 'label', + 'place', + 'event', + 'recording', + 'release', + 'release-group', + 'series', + 'url', + 'work', + 'instrument' +] +RELATION_INCLUDES = [entity + '-rels' for entity in RELATABLE_TYPES] +TAG_INCLUDES = ["tags", "user-tags"] +RATING_INCLUDES = ["ratings", "user-ratings"] +VALID_INCLUDES = { + 'place': ["aliases", "annotation"] + RELATION_INCLUDES + TAG_INCLUDES, + 'event': ["aliases"] + RELATION_INCLUDES + TAG_INCLUDES, + 'release_group': ["artists", "media", "releases"] + TAG_INCLUDES + RELATION_INCLUDES, + 'release': [ + "artists", "labels", "recordings", "release-groups", "media", "annotation", "aliases" + ] + TAG_INCLUDES + RELATION_INCLUDES, + 'artist': ["recordings", "releases", "media", "aliases", "annotation"] + RELATION_INCLUDES + TAG_INCLUDES, +} + + +def check_includes(entity, includes): + """Check if includes specified for an entity are valid includes.""" + for include in includes: + if include not in VALID_INCLUDES[entity]: + raise mb_exceptions.InvalidIncludeError("Bad includes: {inc} is not a valid include".format(inc=include)) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py index e2a874b91..62549f3b0 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py @@ -1,7 +1,7 @@ from brainzutils import cache +from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups, get_release_groups_for_artist from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION import critiquebrainz.frontend.external.relationships.release_group as release_group_rel -from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups, get_release_groups_for_artist def get_release_group_by_id(mbid): diff --git a/critiquebrainz/frontend/external/musicbrainz_db/serialize.py b/critiquebrainz/frontend/external/musicbrainz_db/serialize.py new file mode 100644 index 000000000..ca0c54eec --- /dev/null +++ b/critiquebrainz/frontend/external/musicbrainz_db/serialize.py @@ -0,0 +1,232 @@ +from mbdata.utils.models import get_link_target +from critiquebrainz.frontend.external.musicbrainz_db.utils import ENTITY_MODELS + + +def to_dict_relationships(data, source_obj, relationship_objs): + """Convert relationship objects to dictionaries. + + Args: + data (dict): Dictionary containing info of source object. + source_obj (mbdata.models): object of source entity. + relationship_objs (dict): Dictionary containing list of objects of different relations. + + Returns: + Dictionary containing lists of dictionaries of related entities. + """ + for entity_type in ENTITY_MODELS: + relation = f'{entity_type}-rels' + if relation in relationship_objs: + data[relation] = [] + for obj in relationship_objs[relation]: + link_data = { + 'type': obj.link.link_type.name, + 'type-id': obj.link.link_type.gid, + 'begin-year': obj.link.begin_date_year, + 'end-year': obj.link.end_date_year, + } + link_data['direction'] = 'forward' if source_obj.id == obj.entity0_id else 'backward' + if obj.link.ended: + link_data['ended'] = True + link_data[entity_type] = TO_DICT_ENTITIES[entity_type](get_link_target(obj, source_obj)) + data[relation].append(link_data) + + +def to_dict_areas(area, includes=None): + if includes is None: + includes = {} + data = { + 'id': area.gid, + 'name': area.name, + } + + if 'relationship_objs' in includes: + to_dict_relationships(data, area, includes['relationship_objs']) + return data + + +def to_dict_artists(artist, includes=None): + if includes is None: + includes = {} + data = { + 'id': artist.gid, + 'name': artist.name, + 'sort_name': artist.sort_name, + } + + if 'type' in includes and includes['type']: + data['type'] = includes['type'].name + + if 'relationship_objs' in includes: + to_dict_relationships(data, artist, includes['relationship_objs']) + return data + + +def to_dict_urls(url, includes=None): + if includes is None: + includes = {} + data = { + 'id': url.gid, + 'url': url.url, + } + + if 'relationship_objs' in includes: + to_dict_relationships(data, url, includes['relationship_objs']) + return data + + +def to_dict_places(place, includes=None): + if includes is None: + includes = {} + data = { + 'id': place.gid, + 'name': place.name, + 'address': place.address, + } + + if 'type' in includes and includes['type']: + data['type'] = includes['type'].name + + if place.coordinates: + data['coordinates'] = { + 'latitude': place.coordinates[0], + 'longitude': place.coordinates[1], + } + + if 'area' in includes and includes['area']: + data['area'] = to_dict_areas(includes['area']) + + if 'relationship_objs' in includes: + to_dict_relationships(data, place, includes['relationship_objs']) + return data + + +def to_dict_artist_credit_names(artist_credit_name): + data = { + 'name': artist_credit_name.name, + 'artist': to_dict_artists(artist_credit_name.artist), + } + if artist_credit_name.join_phrase: + data['join_phrase'] = artist_credit_name.join_phrase + return data + + +def to_dict_release_groups(release_group, includes=None): + if includes is None: + includes = {} + + data = { + 'id': release_group.gid, + 'title': release_group.name, + } + + if 'type' in includes and includes['type']: + data['type'] = includes['type'].name + + if 'artist-credit-phrase' in includes: + data['artist-credit-phrase'] = includes['artist-credit-phrase'] + + if 'meta' in includes and includes['meta'] and includes['meta'].first_release_date_year: + data['first-release-year'] = includes['meta'].first_release_date_year + + if 'artist-credit-names' in includes: + data['artist-credit'] = [to_dict_artist_credit_names(artist_credit_name) + for artist_credit_name in includes['artist-credit-names']] + + if 'releases' in includes: + data['release-list'] = [to_dict_releases(release) for release in includes['releases']] + + if 'relationship_objs' in includes: + to_dict_relationships(data, release_group, includes['relationship_objs']) + + if 'tags' in includes: + data['tag-list'] = includes['tags'] + return data + + +def to_dict_medium(medium, includes=None): + if includes is None: + includes = {} + data = { + 'name': medium.name, + 'track_count': medium.track_count, + 'position': medium.position, + } + if medium.format: + data['format'] = medium.format.name + + if 'tracks' in includes and includes['tracks']: + data['track-list'] = [to_dict_track(track) for track in includes['tracks']] + return data + + +def to_dict_track(track, includes=None): + if includes is None: + includes = {} + data = { + 'id': track.gid, + 'name': track.name, + 'number': track.number, + 'position': track.position, + 'length': track.length, + 'recording_id': track.recording.gid, + 'recording_title': track.recording.name, + } + return data + + +def to_dict_releases(release, includes=None): + if includes is None: + includes = {} + + data = { + 'id': release.gid, + 'name': release.name, + } + + if 'relationship_objs' in includes: + to_dict_relationships(data, release, includes['relationship_objs']) + + if 'release-groups' in includes: + data['release-group'] = to_dict_release_groups(includes['release-groups']) + + if 'media' in includes: + data['medium-list'] = [to_dict_medium(medium, includes={'tracks': medium.tracks}) + for medium in includes['media']] + return data + + +def to_dict_events(event, includes=None): + if includes is None: + includes = {} + data = { + 'id': event.gid, + 'name': event.name, + } + if 'relationship_objs' in includes: + to_dict_relationships(data, event, includes['relationship_objs']) + return data + + +def to_dict_series(series, includes=None): + if includes is None: + includes = [] + data = { + 'id': series.gid, + 'name': series.name, + } + if 'relationship_objs' in includes: + to_dict_relationships(data, series, includes['relationship_objs']) + return data + + +TO_DICT_ENTITIES = { + 'artist': to_dict_artists, + 'url': to_dict_urls, + 'place': to_dict_places, + 'release_group': to_dict_release_groups, + 'area': to_dict_areas, + 'release': to_dict_releases, + 'event': to_dict_events, + 'series': to_dict_series, + 'medium': to_dict_medium, +} diff --git a/critiquebrainz/frontend/external/musicbrainz_db/utils.py b/critiquebrainz/frontend/external/musicbrainz_db/utils.py new file mode 100644 index 000000000..3bc698209 --- /dev/null +++ b/critiquebrainz/frontend/external/musicbrainz_db/utils.py @@ -0,0 +1,88 @@ +from mbdata import models +import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +from critiquebrainz.frontend.external.musicbrainz_db import special_entities +from critiquebrainz.db.review import reviewed_entities, ENTITY_TYPES as CB_ENTITIES + + +# Entity models +ENTITY_MODELS = { + 'artist': models.Artist, + 'place': models.Place, + 'release_group': models.ReleaseGroup, + 'release': models.Release, + 'event': models.Event, + 'series': models.Series, + 'url': models.URL, +} + + +# Redirect models +REDIRECT_MODELS = { + 'place': models.PlaceGIDRedirect, + 'artist': models.ArtistGIDRedirect, + 'release': models.ReleaseGIDRedirect, + 'release_group': models.ReleaseGroupGIDRedirect, + 'event': models.EventGIDRedirect, +} + + +def unknown_entity(entity_gid, entity_type): + """Returns special unknown entities (in case, they are not present in MB). + + Args: + entity_gid: MBID of the unknown entity. + entity_type: Type of the unknown entity. + Returns: + Special entity object (unknown) of specified entity_type. + """ + if entity_type == 'release_group': + entity = special_entities.unknown_release_group + elif entity_type == 'place': + entity = special_entities.unknown_place + elif entity_type == 'event': + entity = special_entities.unknown_event + entity.gid = entity_gid + return entity + + +def get_entities_by_gids(*, query, entity_type, mbids): + """Get entities using their MBIDs. + + An entity can have multiple MBIDs. This function may be passed another + MBID of an entity, in which case, it is redirected to the original entity. + + Note that the query may be modified before passing it to this + function in order to save queries made to the database. + + Args: + query (Query): SQLAlchemy Query object. + entity_type (str): Type of entity being queried. + mbids (list): IDs of the target entities. + + Returns: + Dictionary of objects of target entities keyed by their MBID. + """ + entity_model = ENTITY_MODELS[entity_type] + results = query.filter(entity_model.gid.in_(mbids)).all() + remaining_gids = list(set(mbids) - {entity.gid for entity in results}) + entities = {str(entity.gid): entity for entity in results} + if remaining_gids: + redirect_model = REDIRECT_MODELS[entity_type] + query = query.add_entity(redirect_model).join(redirect_model) + results = query.filter(redirect_model.gid.in_(remaining_gids)) + for entity, redirect_obj in results: + entities[redirect_obj.gid] = entity + remaining_gids = list(set(remaining_gids) - {redirect_obj.gid for entity, redirect_obj in results}) + + if remaining_gids and entity_type in CB_ENTITIES: + reviewed_gids = reviewed_entities( + entity_ids=remaining_gids, + entity_type=entity_type, + ) + for entity_id in reviewed_gids: + entities[entity_id] = unknown_entity(entity_id, entity_type) + remaining_gids = list(set(remaining_gids) - set(reviewed_gids)) + + if remaining_gids: + raise mb_exceptions.NoDataFoundException("Couldn't find entities with IDs: {mbids}".format(mbids=remaining_gids)) + return entities diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index dbbf066c5..e4dd78c25 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -1,11 +1,11 @@ from unittest.mock import patch, MagicMock from flask import current_app +import brainzutils.musicbrainz_db.release as mb_release from critiquebrainz.frontend.testing import FrontendTestCase import critiquebrainz.db.review as db_review from critiquebrainz.db.user import User import critiquebrainz.db.users as db_users import critiquebrainz.db.license as db_license -import brainzutils.musicbrainz_db.release as mb_release def mock_get_entity_by_id(id, type='release_group'): From 0c9b56bdbd57c77d30f041eb93f84873d8d1a3d4 Mon Sep 17 00:00:00 2001 From: spellew Date: Mon, 24 Jun 2019 20:06:12 -0400 Subject: [PATCH 051/159] Restored critiquebrainz.frontend.external.musicbrainz_db.special_entities.py --- .../musicbrainz_db/special_entities.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 critiquebrainz/frontend/external/musicbrainz_db/special_entities.py diff --git a/critiquebrainz/frontend/external/musicbrainz_db/special_entities.py b/critiquebrainz/frontend/external/musicbrainz_db/special_entities.py new file mode 100644 index 000000000..dc32db7ae --- /dev/null +++ b/critiquebrainz/frontend/external/musicbrainz_db/special_entities.py @@ -0,0 +1,29 @@ +from mbdata import models + +# Unknown entities +unknown_artist = models.Artist() +unknown_artist.gid = '125ec42a-7229-4250-afc5-e057484327fe' +unknown_artist.id = 97546 +unknown_artist.name = '[unknown]' +unknown_artist.sort_name = '[unknown]' + +unknown_artist_credit_name = models.ArtistCreditName() +unknown_artist_credit_name.name = '[unknown]' +unknown_artist_credit_name.artist = unknown_artist + +unknown_artist_credit = models.ArtistCredit() +unknown_artist_credit.name = '[unknown]' +unknown_artist_credit.artists = [unknown_artist_credit_name] + +unknown_release_group = models.ReleaseGroup() +unknown_release_group.artist_credit = unknown_artist_credit +unknown_release_group.id = 0 +unknown_release_group.name = '[Unknown Release Group]' + +unknown_place = models.Place() +unknown_place.id = 0 +unknown_place.name = '[Unknown Place]' + +unknown_event = models.Place() +unknown_event.id = 0 +unknown_event.name = '[Unknown Event]' From 33fc2098b3608fcc196e045e529eecbb6358970e Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 27 Jun 2019 20:10:18 -0400 Subject: [PATCH 052/159] Updated test configurations to include mb_database --- critiquebrainz/test_config.py | 1 + docker/docker-compose.test.yml | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/critiquebrainz/test_config.py b/critiquebrainz/test_config.py index a7314587e..46fc3ac7f 100644 --- a/critiquebrainz/test_config.py +++ b/critiquebrainz/test_config.py @@ -4,6 +4,7 @@ WTF_CSRF_ENABLED = False SQLALCHEMY_DATABASE_URI = "postgresql://critiquebrainz:critiquebrainz@db_test:5432/critiquebrainz" +MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_test" # Logging LOG_FILE = None diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 271d03fe4..d52999b82 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -25,3 +25,12 @@ services: - db_test - critiquebrainz_redis network_mode: bridge + + musicbrainz_db: + image: metabrainz/musicbrainz-test-database:beta + environment: + PGDATA: /var/lib/postgresql/data/pgdata + MB_IMPORT_DUMPS: "false" + ports: + - "5430:5432" + network_mode: bridge From 982378e2c6775669bab65388c3d742987a4b14b4 Mon Sep 17 00:00:00 2001 From: spellew Date: Fri, 28 Jun 2019 20:54:39 -0400 Subject: [PATCH 053/159] Updated docker-compose.test.yml and MB_DATABASE_URI --- critiquebrainz/frontend/__init__.py | 8 +++--- .../external/musicbrainz_db/__init__.py | 25 ------------------- critiquebrainz/test_config.py | 2 +- critiquebrainz/ws/__init__.py | 10 +++++--- docker/docker-compose.test.yml | 21 +++++++++------- 5 files changed, 24 insertions(+), 42 deletions(-) diff --git a/critiquebrainz/frontend/__init__.py b/critiquebrainz/frontend/__init__.py index 0658c51b6..489ea6d0a 100644 --- a/critiquebrainz/frontend/__init__.py +++ b/critiquebrainz/frontend/__init__.py @@ -63,15 +63,15 @@ def create_app(debug=None, config_path=None): sentry_config=app.config.get("LOG_SENTRY"), ) - # Database - from critiquebrainz.db import init_db_engine - init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + # CritiqueBrainz Database + from critiquebrainz import db as critiquebrainz_db + critiquebrainz_db.init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) add_robots(app) # MusicBrainz Database from brainzutils import musicbrainz_db - musicbrainz_db.init_db_engine(app.config.get('MB_DATABASE_URI')) + musicbrainz_db.init_db_engine(app.config.get("MB_DATABASE_URI")) # Redis (cache) from brainzutils import cache diff --git a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py index ac794e086..e23950c1c 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py @@ -1,26 +1 @@ -from typing import Optional -from contextlib import contextmanager -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, scoped_session, Session -from sqlalchemy.pool import NullPool - -engine = None -Session: Optional[Session] = None # noqa: F811 DEFAULT_CACHE_EXPIRATION = 12 * 60 * 60 # seconds (12 hours) - - -def init_db_engine(connect_str): - global engine, Session - engine = create_engine(connect_str, poolclass=NullPool) - Session = scoped_session( - sessionmaker(bind=engine) - ) - - -@contextmanager -def mb_session(): - session = Session() - try: - yield session - finally: - session.close() diff --git a/critiquebrainz/test_config.py b/critiquebrainz/test_config.py index 46fc3ac7f..0b16c072c 100644 --- a/critiquebrainz/test_config.py +++ b/critiquebrainz/test_config.py @@ -4,7 +4,7 @@ WTF_CSRF_ENABLED = False SQLALCHEMY_DATABASE_URI = "postgresql://critiquebrainz:critiquebrainz@db_test:5432/critiquebrainz" -MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_test" +MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_db" # Logging LOG_FILE = None diff --git a/critiquebrainz/ws/__init__.py b/critiquebrainz/ws/__init__.py index 07a3d8fcc..ccb7293aa 100644 --- a/critiquebrainz/ws/__init__.py +++ b/critiquebrainz/ws/__init__.py @@ -56,9 +56,13 @@ def create_app(debug=None, config_path=None): sentry_config=app.config.get("LOG_SENTRY"), ) - # Database - from critiquebrainz.db import init_db_engine - init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + # CritiqueBrainz Database + from critiquebrainz import db as critiquebrainz_db + critiquebrainz_db.init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + + # MusicBrainz Database + from brainzutils import musicbrainz_db + musicbrainz_db.init_db_engine(app.config.get("MB_DATABASE_URI")) # Redis (cache) from brainzutils import cache diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index d52999b82..df083a52a 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -13,6 +13,17 @@ services: command: postgres -F network_mode: bridge + musicbrainz_db: + image: metabrainz/musicbrainz-test-database:beta + volumes: + - ../data/mbdata:/var/lib/postgresql/data/pgdata:z + environment: + PGDATA: /var/lib/postgresql/data/pgdata + MB_IMPORT_DUMPS: "true" + ports: + - "5430:5432" + network_mode: bridge + critiquebrainz_redis: image: redis:4.0-alpine network_mode: bridge @@ -23,14 +34,6 @@ services: dockerfile: ./docker/Dockerfile.test links: - db_test + - musicbrainz_db - critiquebrainz_redis network_mode: bridge - - musicbrainz_db: - image: metabrainz/musicbrainz-test-database:beta - environment: - PGDATA: /var/lib/postgresql/data/pgdata - MB_IMPORT_DUMPS: "false" - ports: - - "5430:5432" - network_mode: bridge From e45aff3e8b0444514757fd5426920c64a455d3c8 Mon Sep 17 00:00:00 2001 From: spellew Date: Fri, 28 Jun 2019 21:00:13 -0400 Subject: [PATCH 054/159] Restored critiquebrainz.frontend.external.musicbrainz_db.__init__.py --- .../external/musicbrainz_db/__init__.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py index e23950c1c..ac794e086 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py @@ -1 +1,26 @@ +from typing import Optional +from contextlib import contextmanager +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, scoped_session, Session +from sqlalchemy.pool import NullPool + +engine = None +Session: Optional[Session] = None # noqa: F811 DEFAULT_CACHE_EXPIRATION = 12 * 60 * 60 # seconds (12 hours) + + +def init_db_engine(connect_str): + global engine, Session + engine = create_engine(connect_str, poolclass=NullPool) + Session = scoped_session( + sessionmaker(bind=engine) + ) + + +@contextmanager +def mb_session(): + session = Session() + try: + yield session + finally: + session.close() From 8cbbab7759f22b12d84f5b850be4b586dc04b4d5 Mon Sep 17 00:00:00 2001 From: spellew Date: Sat, 29 Jun 2019 18:11:48 -0400 Subject: [PATCH 055/159] Removed test importing of dumps and added wait for musicbrainz_db before starting tests --- docker/Dockerfile.test | 1 + docker/docker-compose.test.yml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 634d101fb..98ef52e0b 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -39,6 +39,7 @@ COPY . /code/ RUN pybabel compile -d critiquebrainz/frontend/translations CMD dockerize -wait tcp://db_test:5432 -timeout 60s \ + dockerize -wait tcp://musicbrainz_db:5432 -timeout 60s \ python manage.py init_db --skip-create-db --test-db \ && py.test --junitxml=/data/test_report.xml \ --cov-report xml:/data/coverage.xml diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index df083a52a..e98a8b6ad 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -19,7 +19,6 @@ services: - ../data/mbdata:/var/lib/postgresql/data/pgdata:z environment: PGDATA: /var/lib/postgresql/data/pgdata - MB_IMPORT_DUMPS: "true" ports: - "5430:5432" network_mode: bridge From 7fb13cd6a75c21730d2bbf61d3660751d712aecc Mon Sep 17 00:00:00 2001 From: spellew Date: Sat, 29 Jun 2019 18:24:10 -0400 Subject: [PATCH 056/159] Updated test_config MB_DATABASE_URI --- critiquebrainz/test_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/critiquebrainz/test_config.py b/critiquebrainz/test_config.py index 0b16c072c..46fc3ac7f 100644 --- a/critiquebrainz/test_config.py +++ b/critiquebrainz/test_config.py @@ -4,7 +4,7 @@ WTF_CSRF_ENABLED = False SQLALCHEMY_DATABASE_URI = "postgresql://critiquebrainz:critiquebrainz@db_test:5432/critiquebrainz" -MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_db" +MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_test" # Logging LOG_FILE = None From f0e21964f06d62eea9d5db1fa7ecc8accb90a71c Mon Sep 17 00:00:00 2001 From: spellew Date: Wed, 3 Jul 2019 18:50:25 -0400 Subject: [PATCH 057/159] Updated image and removed volumes from docker-compose.test.yml --- docker/docker-compose.test.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index e98a8b6ad..996525404 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -14,9 +14,7 @@ services: network_mode: bridge musicbrainz_db: - image: metabrainz/musicbrainz-test-database:beta - volumes: - - ../data/mbdata:/var/lib/postgresql/data/pgdata:z + image: ferbncode/musicbrainz-test-database:latest environment: PGDATA: /var/lib/postgresql/data/pgdata ports: From 1fb1b62b76019aa3e4eba13b6382b24090cbb40f Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 16:14:16 -0400 Subject: [PATCH 058/159] Increased musicbrainz_db timeout --- docker/Dockerfile.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 98ef52e0b..40a83c29c 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -39,7 +39,7 @@ COPY . /code/ RUN pybabel compile -d critiquebrainz/frontend/translations CMD dockerize -wait tcp://db_test:5432 -timeout 60s \ - dockerize -wait tcp://musicbrainz_db:5432 -timeout 60s \ + dockerize -wait tcp://musicbrainz_db:5432 -timeout 180s \ python manage.py init_db --skip-create-db --test-db \ && py.test --junitxml=/data/test_report.xml \ --cov-report xml:/data/coverage.xml From 16f4213e604bb39afd62a9f5fc8a0f81fa3130e2 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 19:36:02 -0400 Subject: [PATCH 059/159] Updated brainzutils requirement --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 89d851286..db40ae765 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://github.com/metabrainz/brainzutils-python.git@v1.12.0 +git+https://github.com/metabrainz/brainzutils-python.git@v1.12.1 beautifulsoup4==4.6.0 coverage==4.4.1 click==6.7 From f8cd2acd712170a5bbfbdde975f1abf93e9cfd32 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 20:42:55 -0400 Subject: [PATCH 060/159] Fixed tests --- admin/sql/create_types.sql | 2 +- critiquebrainz/db/review.py | 2 +- .../frontend/external/musicbrainz_db/entities.py | 2 +- critiquebrainz/frontend/views/search.py | 3 ++- critiquebrainz/frontend/views/work.py | 13 +++++++------ critiquebrainz/test_config.py | 1 + critiquebrainz/ws/__init__.py | 10 +++++++--- docker/Dockerfile.test | 1 + docker/docker-compose.test.yml | 9 +++++++++ requirements.txt | 2 +- 10 files changed, 31 insertions(+), 14 deletions(-) diff --git a/admin/sql/create_types.sql b/admin/sql/create_types.sql index c11fe59f3..857dc9fdd 100644 --- a/admin/sql/create_types.sql +++ b/admin/sql/create_types.sql @@ -9,5 +9,5 @@ CREATE TYPE entity_types AS ENUM ( 'release_group', 'event', 'place', - 'work', + 'work' ); diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index 1c5c3d4ec..52bc8dac3 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -2,8 +2,8 @@ from datetime import datetime, timedelta import uuid import sqlalchemy -import pycountry from brainzutils import cache +import pycountry from critiquebrainz import db from critiquebrainz.db import (exceptions as db_exceptions, revision as db_revision, diff --git a/critiquebrainz/frontend/external/musicbrainz_db/entities.py b/critiquebrainz/frontend/external/musicbrainz_db/entities.py index e49b66aaa..ec169f5a6 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/entities.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/entities.py @@ -1,8 +1,8 @@ +from brainzutils.musicbrainz_db.work import fetch_multiple_works from critiquebrainz.frontend.external.musicbrainz_db.release_group import fetch_multiple_release_groups, get_release_group_by_id from critiquebrainz.frontend.external.musicbrainz_db.place import fetch_multiple_places, get_place_by_id from critiquebrainz.frontend.external.musicbrainz_db.event import fetch_multiple_events, get_event_by_id from critiquebrainz.frontend.external.musicbrainz_db.work import get_work_by_id -from brainzutils.musicbrainz_db.work import fetch_multiple_works def get_multiple_entities(entities): diff --git a/critiquebrainz/frontend/views/search.py b/critiquebrainz/frontend/views/search.py index 76e538406..8e73b0351 100644 --- a/critiquebrainz/frontend/views/search.py +++ b/critiquebrainz/frontend/views/search.py @@ -46,6 +46,7 @@ def more(): @search_bp.route('/selector') def selector(): + artist = request.args.get('artist') release_group = request.args.get('release_group') event = request.args.get('event') place = request.args.get('place') @@ -68,7 +69,7 @@ def selector(): return render_template('search/selector.html', next=next, type=type, results=results, count=count, limit=RESULTS_LIMIT, artist=artist, release_group=release_group, event=event, - recording=recording, work=work, place=place) + work=work, place=place) @search_bp.route('/selector/more') diff --git a/critiquebrainz/frontend/views/work.py b/critiquebrainz/frontend/views/work.py index dffd4ec93..ecad71f43 100644 --- a/critiquebrainz/frontend/views/work.py +++ b/critiquebrainz/frontend/views/work.py @@ -16,15 +16,16 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -from flask import Blueprint, render_template, request -from flask_login import current_user -from flask_babel import gettext +from flask import Blueprint, render_template +# from flask import request +# from flask_login import current_user from werkzeug.exceptions import NotFound +from flask_babel import gettext import critiquebrainz.frontend.external.musicbrainz_db.work as mb_work import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -import critiquebrainz.db.review as db_review -from critiquebrainz.frontend.forms.rate import RatingEditForm -from critiquebrainz.frontend.views import get_avg_rating +# import critiquebrainz.db.review as db_review +# from critiquebrainz.frontend.forms.rate import RatingEditForm +# from critiquebrainz.frontend.views import get_avg_rating work_bp = Blueprint('work', __name__) diff --git a/critiquebrainz/test_config.py b/critiquebrainz/test_config.py index a7314587e..46fc3ac7f 100644 --- a/critiquebrainz/test_config.py +++ b/critiquebrainz/test_config.py @@ -4,6 +4,7 @@ WTF_CSRF_ENABLED = False SQLALCHEMY_DATABASE_URI = "postgresql://critiquebrainz:critiquebrainz@db_test:5432/critiquebrainz" +MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_test" # Logging LOG_FILE = None diff --git a/critiquebrainz/ws/__init__.py b/critiquebrainz/ws/__init__.py index 07a3d8fcc..ccb7293aa 100644 --- a/critiquebrainz/ws/__init__.py +++ b/critiquebrainz/ws/__init__.py @@ -56,9 +56,13 @@ def create_app(debug=None, config_path=None): sentry_config=app.config.get("LOG_SENTRY"), ) - # Database - from critiquebrainz.db import init_db_engine - init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + # CritiqueBrainz Database + from critiquebrainz import db as critiquebrainz_db + critiquebrainz_db.init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + + # MusicBrainz Database + from brainzutils import musicbrainz_db + musicbrainz_db.init_db_engine(app.config.get("MB_DATABASE_URI")) # Redis (cache) from brainzutils import cache diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 634d101fb..40a83c29c 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -39,6 +39,7 @@ COPY . /code/ RUN pybabel compile -d critiquebrainz/frontend/translations CMD dockerize -wait tcp://db_test:5432 -timeout 60s \ + dockerize -wait tcp://musicbrainz_db:5432 -timeout 180s \ python manage.py init_db --skip-create-db --test-db \ && py.test --junitxml=/data/test_report.xml \ --cov-report xml:/data/coverage.xml diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 271d03fe4..996525404 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -13,6 +13,14 @@ services: command: postgres -F network_mode: bridge + musicbrainz_db: + image: ferbncode/musicbrainz-test-database:latest + environment: + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5430:5432" + network_mode: bridge + critiquebrainz_redis: image: redis:4.0-alpine network_mode: bridge @@ -23,5 +31,6 @@ services: dockerfile: ./docker/Dockerfile.test links: - db_test + - musicbrainz_db - critiquebrainz_redis network_mode: bridge diff --git a/requirements.txt b/requirements.txt index 89d851286..db40ae765 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://github.com/metabrainz/brainzutils-python.git@v1.12.0 +git+https://github.com/metabrainz/brainzutils-python.git@v1.12.1 beautifulsoup4==4.6.0 coverage==4.4.1 click==6.7 From 3a8ae176e7a1b84c614291b6cb2e0d9d08f77eb2 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 20:48:49 -0400 Subject: [PATCH 061/159] Fixed tests --- critiquebrainz/db/review.py | 2 +- .../frontend/external/musicbrainz_db/entities.py | 2 +- critiquebrainz/test_config.py | 1 + critiquebrainz/ws/__init__.py | 10 +++++++--- docker/Dockerfile.test | 1 + docker/docker-compose.test.yml | 9 +++++++++ requirements.txt | 2 +- 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index 20c7c01df..5af39cc09 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -2,8 +2,8 @@ from datetime import datetime, timedelta import uuid import sqlalchemy -import pycountry from brainzutils import cache +import pycountry from critiquebrainz import db from critiquebrainz.db import (exceptions as db_exceptions, revision as db_revision, diff --git a/critiquebrainz/frontend/external/musicbrainz_db/entities.py b/critiquebrainz/frontend/external/musicbrainz_db/entities.py index 07af13bef..e553feb47 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/entities.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/entities.py @@ -1,8 +1,8 @@ +from brainzutils.musicbrainz_db.artist import fetch_multiple_artists from critiquebrainz.frontend.external.musicbrainz_db.release_group import fetch_multiple_release_groups, get_release_group_by_id from critiquebrainz.frontend.external.musicbrainz_db.place import fetch_multiple_places, get_place_by_id from critiquebrainz.frontend.external.musicbrainz_db.event import fetch_multiple_events, get_event_by_id from critiquebrainz.frontend.external.musicbrainz_db.artist import get_artist_by_id -from brainzutils.musicbrainz_db.artist import fetch_multiple_artists def get_multiple_entities(entities): diff --git a/critiquebrainz/test_config.py b/critiquebrainz/test_config.py index a7314587e..46fc3ac7f 100644 --- a/critiquebrainz/test_config.py +++ b/critiquebrainz/test_config.py @@ -4,6 +4,7 @@ WTF_CSRF_ENABLED = False SQLALCHEMY_DATABASE_URI = "postgresql://critiquebrainz:critiquebrainz@db_test:5432/critiquebrainz" +MB_DATABASE_URI = "postgresql://musicbrainz:musicbrainz@musicbrainz_db:5432/musicbrainz_test" # Logging LOG_FILE = None diff --git a/critiquebrainz/ws/__init__.py b/critiquebrainz/ws/__init__.py index 07a3d8fcc..ccb7293aa 100644 --- a/critiquebrainz/ws/__init__.py +++ b/critiquebrainz/ws/__init__.py @@ -56,9 +56,13 @@ def create_app(debug=None, config_path=None): sentry_config=app.config.get("LOG_SENTRY"), ) - # Database - from critiquebrainz.db import init_db_engine - init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + # CritiqueBrainz Database + from critiquebrainz import db as critiquebrainz_db + critiquebrainz_db.init_db_engine(app.config.get("SQLALCHEMY_DATABASE_URI")) + + # MusicBrainz Database + from brainzutils import musicbrainz_db + musicbrainz_db.init_db_engine(app.config.get("MB_DATABASE_URI")) # Redis (cache) from brainzutils import cache diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 634d101fb..40a83c29c 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -39,6 +39,7 @@ COPY . /code/ RUN pybabel compile -d critiquebrainz/frontend/translations CMD dockerize -wait tcp://db_test:5432 -timeout 60s \ + dockerize -wait tcp://musicbrainz_db:5432 -timeout 180s \ python manage.py init_db --skip-create-db --test-db \ && py.test --junitxml=/data/test_report.xml \ --cov-report xml:/data/coverage.xml diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 271d03fe4..996525404 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -13,6 +13,14 @@ services: command: postgres -F network_mode: bridge + musicbrainz_db: + image: ferbncode/musicbrainz-test-database:latest + environment: + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5430:5432" + network_mode: bridge + critiquebrainz_redis: image: redis:4.0-alpine network_mode: bridge @@ -23,5 +31,6 @@ services: dockerfile: ./docker/Dockerfile.test links: - db_test + - musicbrainz_db - critiquebrainz_redis network_mode: bridge diff --git a/requirements.txt b/requirements.txt index 89d851286..db40ae765 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://github.com/metabrainz/brainzutils-python.git@v1.12.0 +git+https://github.com/metabrainz/brainzutils-python.git@v1.12.1 beautifulsoup4==4.6.0 coverage==4.4.1 click==6.7 From cfa5369e9de1842d9e3e7dd4b4a450028403c3ff Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 21:26:07 -0400 Subject: [PATCH 062/159] Removed typo in create_types --- admin/sql/create_types.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/sql/create_types.sql b/admin/sql/create_types.sql index ebbbaad3b..ea9218c2d 100644 --- a/admin/sql/create_types.sql +++ b/admin/sql/create_types.sql @@ -9,5 +9,5 @@ CREATE TYPE entity_types AS ENUM ( 'release_group', 'event', 'place', - 'artist', + 'artist' ); From dfc17dcf77b9a080e4a4c7e9a86ba258c11a2252 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 21:34:52 -0400 Subject: [PATCH 063/159] Remove redundant test --- .../musicbrainz_db/tests/artist_test.py | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 critiquebrainz/frontend/external/musicbrainz_db/tests/artist_test.py diff --git a/critiquebrainz/frontend/external/musicbrainz_db/tests/artist_test.py b/critiquebrainz/frontend/external/musicbrainz_db/tests/artist_test.py deleted file mode 100644 index d72926e67..000000000 --- a/critiquebrainz/frontend/external/musicbrainz_db/tests/artist_test.py +++ /dev/null @@ -1,43 +0,0 @@ -from unittest import TestCase -from unittest.mock import MagicMock -from critiquebrainz.frontend.external.musicbrainz_db.test_data import artist_linkin_park, artist_jay_z -from critiquebrainz.frontend.external.musicbrainz_db import artist as mb_artist -from critiquebrainz.frontend.external.musicbrainz_db.tests import setup_cache - - -class ArtistTestCase(TestCase): - - def setUp(self): - setup_cache() - mb_artist.mb_session = MagicMock() - self.mock_db = mb_artist.mb_session.return_value.__enter__.return_value - self.artist_query = self.mock_db.query.return_value.options.return_value.filter.return_value.all - - def test_get_by_id(self): - self.artist_query.return_value = [artist_linkin_park] - artist = mb_artist.get_artist_by_id("f59c5520-5f46-4d2c-b2c4-822eabf53419") - self.assertDictEqual(artist, { - "id": "f59c5520-5f46-4d2c-b2c4-822eabf53419", - "name": "Linkin Park", - "sort_name": "Linkin Park", - "type": "Group" - }) - - def test_fetch_multiple_artists(self): - self.artist_query.return_value = [artist_jay_z, artist_linkin_park] - artists = mb_artist.fetch_multiple_artists([ - "f59c5520-5f46-4d2c-b2c4-822eabf53419", - "f82bcf78-5b69-4622-a5ef-73800768d9ac", - ]) - self.assertDictEqual(artists["f82bcf78-5b69-4622-a5ef-73800768d9ac"], { - "id": "f82bcf78-5b69-4622-a5ef-73800768d9ac", - "name": "JAY Z", - "sort_name": "JAY Z", - "type": "Person", - }) - self.assertDictEqual(artists["f59c5520-5f46-4d2c-b2c4-822eabf53419"], { - "id": "f59c5520-5f46-4d2c-b2c4-822eabf53419", - "name": "Linkin Park", - "sort_name": "Linkin Park", - "type": "Group", - }) From 8dca334e59945f2a30bdb94020f766de6b3d81d9 Mon Sep 17 00:00:00 2001 From: spellew Date: Sat, 6 Jul 2019 17:52:22 -0400 Subject: [PATCH 064/159] Updated artist.py to use brainzutils functions --- .../external/musicbrainz_db/artist.py | 69 ++----------------- 1 file changed, 6 insertions(+), 63 deletions(-) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/artist.py b/critiquebrainz/frontend/external/musicbrainz_db/artist.py index 55dc62338..d72bf8364 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/artist.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/artist.py @@ -1,13 +1,7 @@ -from collections import defaultdict -from sqlalchemy.orm import joinedload -from mbdata import models from brainzutils import cache -from critiquebrainz.frontend.external.musicbrainz_db import mb_session, DEFAULT_CACHE_EXPIRATION -from critiquebrainz.frontend.external.musicbrainz_db.helpers import get_relationship_info +from brainzutils.musicbrainz_db.artist import fetch_multiple_artists +from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import artist as artist_rel -from critiquebrainz.frontend.external.musicbrainz_db.utils import get_entities_by_gids -from critiquebrainz.frontend.external.musicbrainz_db.serialize import to_dict_artists -from critiquebrainz.frontend.external.musicbrainz_db.includes import check_includes def get_artist_by_id(mbid): @@ -21,60 +15,9 @@ def get_artist_by_id(mbid): key = cache.gen_key(mbid) artist = cache.get(key) if not artist: - artist = _get_artist_by_id(mbid) + artist = fetch_multiple_artists( + [mbid], + includes=['artist-rels', 'url-rels'], + ).get(mbid) cache.set(key=key, val=artist, time=DEFAULT_CACHE_EXPIRATION) return artist_rel.process(artist) - - -def _get_artist_by_id(mbid): - return fetch_multiple_artists( - [mbid], - includes=['artist-rels', 'url-rels'], - ).get(mbid) - - -def fetch_multiple_artists(mbids, *, includes=None): - """Get info related to multiple artists using their MusicBrainz IDs. - - Args: - mbids (list): List of MBIDs of artists. - includes (list): List of information to be included. - - Returns: - Dictionary containing info of multiple artists keyed by their mbid. - """ - if includes is None: - includes = [] - includes_data = defaultdict(dict) - check_includes('artist', includes) - with mb_session() as db: - query = db.query(models.Artist).\ - options(joinedload("type")) - artists = get_entities_by_gids( - query=query, - entity_type='artist', - mbids=mbids, - ) - artist_ids = [artist.id for artist in artists.values()] - - if 'artist-rels' in includes: - get_relationship_info( - db=db, - target_type='artist', - source_type='artist', - source_entity_ids=artist_ids, - includes_data=includes_data, - ) - if 'url-rels' in includes: - get_relationship_info( - db=db, - target_type='url', - source_type='artist', - source_entity_ids=artist_ids, - includes_data=includes_data, - ) - - for artist in artists.values(): - includes_data[artist.id]['type'] = artist.type - artists = {str(mbid): to_dict_artists(artists[mbid], includes_data[artists[mbid].id]) for mbid in mbids} - return artists From de24536c65d33cce4d2a38cb5f5a0a463390959d Mon Sep 17 00:00:00 2001 From: spellew Date: Sat, 6 Jul 2019 17:52:51 -0400 Subject: [PATCH 065/159] Updated imports and removed critiquebrainz musicbrainz_db.__init__.py --- .../external/musicbrainz_db/__init__.py | 25 ------------------- import_musicbrainz_row_ids.py | 2 +- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py index ac794e086..e23950c1c 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/__init__.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/__init__.py @@ -1,26 +1 @@ -from typing import Optional -from contextlib import contextmanager -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, scoped_session, Session -from sqlalchemy.pool import NullPool - -engine = None -Session: Optional[Session] = None # noqa: F811 DEFAULT_CACHE_EXPIRATION = 12 * 60 * 60 # seconds (12 hours) - - -def init_db_engine(connect_str): - global engine, Session - engine = create_engine(connect_str, poolclass=NullPool) - Session = scoped_session( - sessionmaker(bind=engine) - ) - - -@contextmanager -def mb_session(): - session = Session() - try: - yield session - finally: - session.close() diff --git a/import_musicbrainz_row_ids.py b/import_musicbrainz_row_ids.py index b9b84b317..0433a9a27 100644 --- a/import_musicbrainz_row_ids.py +++ b/import_musicbrainz_row_ids.py @@ -1,6 +1,6 @@ from sqlalchemy import text +from brainzutils import musicbrainz_db import critiquebrainz.db.users as db_users -from critiquebrainz.frontend.external import musicbrainz_db from critiquebrainz.frontend import create_app from critiquebrainz import db From 1842fb58a8f1a9d8835b976e2764f29590a77b89 Mon Sep 17 00:00:00 2001 From: spellew Date: Sat, 6 Jul 2019 18:42:47 -0400 Subject: [PATCH 066/159] Increased musicbrainz_db testing timeout --- docker/Dockerfile.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 40a83c29c..a4a6a733a 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -39,7 +39,7 @@ COPY . /code/ RUN pybabel compile -d critiquebrainz/frontend/translations CMD dockerize -wait tcp://db_test:5432 -timeout 60s \ - dockerize -wait tcp://musicbrainz_db:5432 -timeout 180s \ + dockerize -wait tcp://musicbrainz_db:5432 -timeout 240s \ python manage.py init_db --skip-create-db --test-db \ && py.test --junitxml=/data/test_report.xml \ --cov-report xml:/data/coverage.xml From 7b7c98c35d29c23be434d027f199d8658b48ebdd Mon Sep 17 00:00:00 2001 From: Suyash Garg Date: Wed, 10 Jul 2019 22:53:21 +0200 Subject: [PATCH 067/159] Reset cache when review is deleted of the popular reviews --- critiquebrainz/db/review.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index afc05f4dc..8ecc1fc66 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -534,8 +534,9 @@ def get_popular(limit=None): cache_key = cache.gen_key("popular_reviews", limit) reviews = cache.get(cache_key, REVIEW_CACHE_NAMESPACE) defined_limit = 4 * limit if limit else None + reset_cache = any([check_review_deleted(review["id"]) for review in reviews]) if reviews else False - if not reviews: + if not reviews or reset_cache: with db.engine.connect() as connection: results = connection.execute(sqlalchemy.text(""" SELECT review.id, @@ -635,6 +636,22 @@ def delete(review_id): db_avg_rating.update(review["entity_id"], review["entity_type"]) +def check_review_deleted(review_id) -> bool: + """Check if a review exists in CB. + + Args: + review_id: ID of the review to be checked. + """ + with db.engine.connect() as connection: + result = connection.execute(sqlalchemy.text(""" + SELECT NOT EXISTS (SELECT true FROM review WHERE id = :review_id) AS exists + """), { + "review_id": review_id, + }) + + return dict(result.fetchone())["exists"] + + def get_distinct_entities(connection): """ helper function for distinct_entities() that extends support for execution within a transaction by directly receiving the From b4716bc41e5731819221f799966c0d34b501d6a5 Mon Sep 17 00:00:00 2001 From: Param Singh Date: Thu, 11 Jul 2019 19:28:43 +0530 Subject: [PATCH 068/159] Revert some design changes --- critiquebrainz/frontend/templates/footer.html | 1 + critiquebrainz/frontend/templates/navbar.html | 19 +++++++++---------- package.json | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/critiquebrainz/frontend/templates/footer.html b/critiquebrainz/frontend/templates/footer.html index 11ccc867e..1f491712a 100644 --- a/critiquebrainz/frontend/templates/footer.html +++ b/critiquebrainz/frontend/templates/footer.html @@ -1,4 +1,5 @@ {% if current_user.is_admin() %} +
    • {{ _('Admin zone:') }}
    • diff --git a/critiquebrainz/frontend/templates/navbar.html b/critiquebrainz/frontend/templates/navbar.html index af77f033a..980b69eda 100644 --- a/critiquebrainz/frontend/templates/navbar.html +++ b/critiquebrainz/frontend/templates/navbar.html @@ -18,8 +18,7 @@
      @@ -101,6 +104,26 @@

      {{ _('Place selection') }}

      +
      +

      {{ _('Label selection') }}

      +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      + + +
      +
      +
    @@ -109,6 +132,7 @@

    {{ _('Place selection') }}

    or request.args.get('release_group', default=False) or request.args.get('event', default=False) or request.args.get('place', default=False) + or request.args.get('label', default=False) %}
    {% if not results %} @@ -146,6 +170,12 @@

    {{ _('Place selection') }}

    {{ _('Location') }} + {% elif type=="label" %} + + {{ _('Name') }} + {{ _('Type') }} + {{ _('Country') }} + {% endif %} {% include 'search/selector_results.html' %} diff --git a/critiquebrainz/frontend/templates/search/selector_results.html b/critiquebrainz/frontend/templates/search/selector_results.html index e90be8090..aea3696c2 100644 --- a/critiquebrainz/frontend/templates/search/selector_results.html +++ b/critiquebrainz/frontend/templates/search/selector_results.html @@ -91,5 +91,21 @@ +{% elif type=="label" %} + + + {{ result['name'] }} + + + {{ result['type'] or '-' }} + + + {{ result['country'] or '-' }} + + + + + + {% endif %} {% endfor %} diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py new file mode 100644 index 000000000..519508f16 --- /dev/null +++ b/critiquebrainz/frontend/views/label.py @@ -0,0 +1,41 @@ +# critiquebrainz - Repository for Creative Commons licensed reviews +# +# Copyright (C) 2018 MetaBrainz Foundation Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from flask import Blueprint, render_template, request +from flask_login import current_user +from flask_babel import gettext +from werkzeug.exceptions import NotFound +import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label +import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +import critiquebrainz.db.review as db_review +from critiquebrainz.frontend.forms.rate import RatingEditForm +from critiquebrainz.frontend.views import get_avg_rating + + +label_bp = Blueprint('label', __name__) + + +@label_bp.route('/') +def entity(id): + id = str(id) + try: + label = mb_label.get_label_by_id(id) + except mb_exceptions.NoDataFoundException: + raise NotFound(gettext("Sorry, we couldn't find a label with that MusicBrainz ID.")) + + return render_template('label/entity.html', id=label['id'], label=label) diff --git a/critiquebrainz/frontend/views/search.py b/critiquebrainz/frontend/views/search.py index 05dc6d176..a609f8ad4 100644 --- a/critiquebrainz/frontend/views/search.py +++ b/critiquebrainz/frontend/views/search.py @@ -16,6 +16,8 @@ def search_wrapper(query, type, offset=None): count, results = musicbrainz.search_places(query, limit=RESULTS_LIMIT, offset=offset) elif type == "release-group": count, results = musicbrainz.search_release_groups(query, limit=RESULTS_LIMIT, offset=offset) + elif type == "label": + count, results = musicbrainz.search_labels(query, limit=RESULTS_LIMIT, offset=offset) else: count, results = 0, [] else: @@ -46,6 +48,7 @@ def more(): def selector(): release_group = request.args.get('release_group') artist = request.args.get('artist') + label = request.args.get('label') event = request.args.get('event') place = request.args.get('place') type = request.args.get('type') @@ -56,6 +59,8 @@ def selector(): count, results = musicbrainz.search_release_groups(release_group, limit=RESULTS_LIMIT) elif artist: count, results = musicbrainz.search_artists(artist, limit=RESULTS_LIMIT) + elif label: + count, results = musicbrainz.search_labels(label, limit=RESULTS_LIMIT) elif event: count, results = musicbrainz.search_events(event, limit=RESULTS_LIMIT) elif place: @@ -65,13 +70,14 @@ def selector(): return render_template('search/selector.html', next=next, type=type, results=results, count=count, limit=RESULTS_LIMIT, artist=artist, release_group=release_group, event=event, - place=place) + label=label, place=place) @search_bp.route('/selector/more') def selector_more(): artist = request.args.get('artist') release_group = request.args.get('release_group') + label = request.args.get('label') event = request.args.get('event') place = request.args.get('place') type = request.args.get('type') @@ -82,6 +88,8 @@ def selector_more(): limit=RESULTS_LIMIT, offset=offset) elif type == 'artist': count, results = musicbrainz.search_artists(artist, limit=RESULTS_LIMIT, offset=offset) + elif type == 'label': + count, results = musicbrainz.search_labels(label, limit=RESULTS_LIMIT, offset=offset) elif type == 'event': count, results = musicbrainz.search_events(event, limit=RESULTS_LIMIT, offset=offset) elif type == 'place': From 8bfae4fe4439ee7a32163b4a5a5e20d19649a3b2 Mon Sep 17 00:00:00 2001 From: spellew Date: Sun, 16 Jun 2019 13:05:26 -0400 Subject: [PATCH 081/159] Implemented the reviewal of labels --- critiquebrainz/db/review.py | 1 + .../frontend/static/styles/main.less | 7 ++++++ .../frontend/templates/entity_review.html | 2 ++ .../frontend/templates/label/entity.html | 22 +++++++++++++++++ critiquebrainz/frontend/templates/macros.html | 7 ++++++ .../frontend/templates/review/browse.html | 2 ++ .../templates/review/entity/label.html | 24 +++++++++++++++++++ .../templates/review/modify/label.html | 21 ++++++++++++++++ .../frontend/templates/search/selector.html | 2 +- 9 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 critiquebrainz/frontend/templates/review/entity/label.html create mode 100644 critiquebrainz/frontend/templates/review/modify/label.html diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index fc92fc19d..6da2f8740 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -20,6 +20,7 @@ "place", "release_group", "artist", + "label", ] diff --git a/critiquebrainz/frontend/static/styles/main.less b/critiquebrainz/frontend/static/styles/main.less index 47e333899..ef2509dcf 100644 --- a/critiquebrainz/frontend/static/styles/main.less +++ b/critiquebrainz/frontend/static/styles/main.less @@ -13,6 +13,7 @@ @artist-color: @blue; @event-color: @green; @place-color: @yellow; +@label-color: @blue; body { padding-bottom: 25px; @@ -131,6 +132,9 @@ ul.sharing { &.place { background-color: fade(@place-color, 70%); } + &.label { + background-color: fade(@label-color, 70%); + } &.event { background-color: fade(@event-color, 70%); } @@ -493,6 +497,9 @@ a#edit-review { margin-top: 20px; } &.place { background-color: fade(@place-color, 70%); } + &.label { + background-color: fade(@label-color, 70%); + } &.event { background-color: fade(@event-color, 70%); } diff --git a/critiquebrainz/frontend/templates/entity_review.html b/critiquebrainz/frontend/templates/entity_review.html index f5f26fa06..1e40b261e 100644 --- a/critiquebrainz/frontend/templates/entity_review.html +++ b/critiquebrainz/frontend/templates/entity_review.html @@ -5,6 +5,8 @@ artist = entity['artist-credit-phrase'] | default(_('[Unknown artist]'))) }} {% elif review.entity_type == 'artist' %} {{ _('%(artist)s', artist = ''|safe + entity.name | default(_('[Unknown artist]')) + ''|safe) }} + {% elif review.entity_type == 'label' %} + {{ _('%(label)s', label = ''|safe + entity.name | default(_('[Unknown label]')) + ''|safe) }} {% elif review.entity_type == 'event' %} {{ _('%(event)s', event = ''|safe + entity.name | default(_('[Unknown event]')) + ''|safe) }} {% elif review.entity_type == 'place' %} diff --git a/critiquebrainz/frontend/templates/label/entity.html b/critiquebrainz/frontend/templates/label/entity.html index 21f5da261..4a49be425 100644 --- a/critiquebrainz/frontend/templates/label/entity.html +++ b/critiquebrainz/frontend/templates/label/entity.html @@ -1 +1,23 @@ {% extends 'base.html' %} + +{# {% block title %}{{ event.name }} - CritiqueBrainz{% endblock %} #} + +{% block content %} +
    +

    + {# {{ event.name }} #} +

    + + {% if not my_review %} + + {{ _('Write a review') }} + + {% else %} + + {{ _('Edit my review') }} + + {% endif %} +
    +{% endblock %} diff --git a/critiquebrainz/frontend/templates/macros.html b/critiquebrainz/frontend/templates/macros.html index 1acee7d0b..cc922adb9 100644 --- a/critiquebrainz/frontend/templates/macros.html +++ b/critiquebrainz/frontend/templates/macros.html @@ -53,6 +53,13 @@ {{ _('Artist') }} {% endif %} + {% elif entity_type == 'label' %} + + {% if overlay_type %} + + {{ _('Label') }} + + {% endif %} {% else %} {# release-group #} {% if overlay_type %} diff --git a/critiquebrainz/frontend/templates/review/browse.html b/critiquebrainz/frontend/templates/review/browse.html index b50374e99..22e47ad64 100644 --- a/critiquebrainz/frontend/templates/review/browse.html +++ b/critiquebrainz/frontend/templates/review/browse.html @@ -13,6 +13,8 @@

    {{ _('Reviews') }}

    {{ _('Release group') }}
  • {{ _('Artist') }}
  • +
  • + {{ _('Label') }}
  • {{ _('Event') }}
  • diff --git a/critiquebrainz/frontend/templates/review/entity/label.html b/critiquebrainz/frontend/templates/review/entity/label.html new file mode 100644 index 000000000..204a0574f --- /dev/null +++ b/critiquebrainz/frontend/templates/review/entity/label.html @@ -0,0 +1,24 @@ +{% extends 'review/entity/base.html' %} + +{% set label = review.entity_id | entity_details(type='label') %} + +{% block title %} + {% set label_title = label.name | default(_('[Unknown label]')) %} + {{ _('Review of "%(label)s" by %(user)s', label=label_title, user=review.user.display_name) }} - CritiqueBrainz +{% endblock %} + +{% block entity_title %} +

    + {% if label %} + {% set label_name = '' | safe % url_for('label.entity', id=review.entity_id) ~ label.name ~ ''|safe %} + {% else %} + {% set label_name = _('[Unknown label]') %} + {% endif %} + + {{ _('%(label)s', label=label_name) }} + + {% if label['life-span'] %} + {{ label['life-span']['begin'][:4] }} + {% endif %} +

    +{% endblock %} diff --git a/critiquebrainz/frontend/templates/review/modify/label.html b/critiquebrainz/frontend/templates/review/modify/label.html new file mode 100644 index 000000000..373000939 --- /dev/null +++ b/critiquebrainz/frontend/templates/review/modify/label.html @@ -0,0 +1,21 @@ +{% if entity is not defined %} + {% set entity = review.entity_id | entity_details(type=entity_type) %} +{% endif %} +
    +
    +
    {{ _('Label') }}
    +
    + {{ entity['name'] | default(_('[Unknown label]')) }} + {% if entity['life-span'] %} + ({{ entity['life-span']['begin'] }} - {{ entity['life-span']['end'] }}) + {% endif %} +
    +
    {{ _('Type') }}
    +
    {{ entity['type'] or '-' }}
    +
    {{ _('Country') }}
    +
    {{ entity['area'] or '-' }}
    + {% block more_info %} + {# Information like creation date, votes etc. #} + {% endblock %} +
    +
    diff --git a/critiquebrainz/frontend/templates/search/selector.html b/critiquebrainz/frontend/templates/search/selector.html index bdf287f6b..ae3c37993 100644 --- a/critiquebrainz/frontend/templates/search/selector.html +++ b/critiquebrainz/frontend/templates/search/selector.html @@ -175,12 +175,12 @@

    {{ _('Label selection') }}

    {{ _('Name') }} {{ _('Type') }} {{ _('Country') }} + {% endif %} {% include 'search/selector_results.html' %} -
    {% if count > limit %}
    From b05cc1c3b9c04ecf8ffe9bbbdbd29c807defbb72 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 4 Jul 2019 19:34:19 -0400 Subject: [PATCH 082/159] Fixed testing --- .../frontend/external/musicbrainz_db/entities.py | 1 + critiquebrainz/frontend/views/label.py | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/entities.py b/critiquebrainz/frontend/external/musicbrainz_db/entities.py index 6be1a035e..c7b40cce7 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/entities.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/entities.py @@ -9,6 +9,7 @@ from critiquebrainz.frontend.external.musicbrainz_db.label import get_label_by_id from critiquebrainz.frontend.external.musicbrainz_db.artist import get_artist_by_id + def get_multiple_entities(entities): """Fetch multiple entities using their MBIDs. diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index 519508f16..d2c9cfea7 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -16,15 +16,16 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -from flask import Blueprint, render_template, request -from flask_login import current_user -from flask_babel import gettext +from flask import Blueprint, render_template +# from flask import request +# from flask_login import current_user from werkzeug.exceptions import NotFound +from flask_babel import gettext import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -import critiquebrainz.db.review as db_review -from critiquebrainz.frontend.forms.rate import RatingEditForm -from critiquebrainz.frontend.views import get_avg_rating +# import critiquebrainz.db.review as db_review +# from critiquebrainz.frontend.forms.rate import RatingEditForm +# from critiquebrainz.frontend.views import get_avg_rating label_bp = Blueprint('label', __name__) From 3adc21678a2cc03768b143c30a2936d8717b2497 Mon Sep 17 00:00:00 2001 From: spellew Date: Mon, 5 Aug 2019 18:05:57 -0400 Subject: [PATCH 083/159] Removed comments and unused imports --- critiquebrainz/frontend/views/label.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index d2c9cfea7..7e270ff33 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -1,32 +1,8 @@ -# critiquebrainz - Repository for Creative Commons licensed reviews -# -# Copyright (C) 2018 MetaBrainz Foundation Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - from flask import Blueprint, render_template -# from flask import request -# from flask_login import current_user from werkzeug.exceptions import NotFound from flask_babel import gettext import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -# import critiquebrainz.db.review as db_review -# from critiquebrainz.frontend.forms.rate import RatingEditForm -# from critiquebrainz.frontend.views import get_avg_rating - label_bp = Blueprint('label', __name__) From 4545d922e3205ecf1b8d504e54bf6bdd34aef008 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 8 Aug 2019 19:25:05 -0400 Subject: [PATCH 084/159] Updated label entity page to display name, info, reviews, and external links --- .../frontend/external/musicbrainz_db/label.py | 3 +- .../frontend/external/relationships/label.py | 76 +++++++++++++ .../frontend/templates/label/entity.html | 102 +++++++++++++++--- critiquebrainz/frontend/views/__init__.py | 1 + critiquebrainz/frontend/views/label.py | 28 ++++- 5 files changed, 192 insertions(+), 18 deletions(-) create mode 100644 critiquebrainz/frontend/external/relationships/label.py diff --git a/critiquebrainz/frontend/external/musicbrainz_db/label.py b/critiquebrainz/frontend/external/musicbrainz_db/label.py index 76865a931..0cb48995b 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/label.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/label.py @@ -1,6 +1,7 @@ from brainzutils import cache from brainzutils.musicbrainz_db.label import fetch_multiple_labels from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION +from critiquebrainz.frontend.external.relationships import label as label_rel def get_label_by_id(mbid): @@ -19,4 +20,4 @@ def get_label_by_id(mbid): includes=['artist-rels', 'url-rels'], ).get(mbid) cache.set(key=key, val=label, time=DEFAULT_CACHE_EXPIRATION) - return label + return label_rel.process(label) diff --git a/critiquebrainz/frontend/external/relationships/label.py b/critiquebrainz/frontend/external/relationships/label.py new file mode 100644 index 000000000..150684f43 --- /dev/null +++ b/critiquebrainz/frontend/external/relationships/label.py @@ -0,0 +1,76 @@ +""" +Relationship processor for label entity. +""" +import urllib.parse +from flask_babel import lazy_gettext + + +def process(label): + """Handles processing supported relation lists.""" + if 'url-rels' in label and label['url-rels']: + label['external-urls'] = _url(label['url-rels']) + return label + + +def _url(url_list): + """Processor for Label-URL relationship.""" + basic_types = { + 'wikidata': {'name': lazy_gettext('Wikidata'), 'icon': 'wikidata-16.png', }, + 'discogs': {'name': lazy_gettext('Discogs'), 'icon': 'discogs-16.png', }, + 'allmusic': {'name': lazy_gettext('Allmusic'), 'icon': 'allmusic-16.png', }, + 'bandcamp': {'name': lazy_gettext('Bandcamp'), 'icon': 'bandcamp-16.png', }, + 'official homepage': {'name': lazy_gettext('Official homepage'), 'icon': 'home-16.png', }, + 'BBC Music page': {'name': lazy_gettext('BBC Music'), }, + } + external_urls = [] + for relation in url_list: + if relation['type'] in basic_types: + external_urls.append(dict(list(relation.items()) + list(basic_types[relation['type']].items()))) + else: + try: + target = urllib.parse.urlparse(relation['target']) + if relation['type'] == 'lyrics': + external_urls.append(dict( + relation.items() + { + 'name': lazy_gettext('Lyrics'), + 'disambiguation': target.netloc, + }.items())) + elif relation['type'] == 'wikipedia': + external_urls.append(dict( + relation.items() + { + 'name': lazy_gettext('Wikipedia'), + 'disambiguation': ( + target.netloc.split('.')[0] + + ':' + + urllib.parse.unquote(target.path.split('/')[2]).decode('utf8').replace("_", " ") + ), + 'icon': 'wikipedia-16.png', + }.items())) + elif relation['type'] == 'youtube': + path = target.path.split('/') + if path[1] == 'user' or path[1] == 'channel': + disambiguation = path[2] + else: + disambiguation = path[1] + external_urls.append(dict( + relation.items() + { + 'name': lazy_gettext('YouTube'), + 'disambiguation': disambiguation, + 'icon': 'youtube-16.png', + }.items())) + elif relation['type'] == 'social network': + if target.netloc == 'twitter.com': + external_urls.append(dict( + relation.items() + { + 'name': lazy_gettext('Twitter'), + 'disambiguation': target.path.split('/')[1], + 'icon': 'twitter-16.png', + }.items())) + else: + # TODO(roman): Process other types here + pass + except Exception: # FIXME(roman): Too broad exception clause. + # TODO(roman): Log error. + pass + + return sorted(external_urls, key=lambda k: k['name']) diff --git a/critiquebrainz/frontend/templates/label/entity.html b/critiquebrainz/frontend/templates/label/entity.html index 4a49be425..eed1de912 100644 --- a/critiquebrainz/frontend/templates/label/entity.html +++ b/critiquebrainz/frontend/templates/label/entity.html @@ -1,23 +1,97 @@ {% extends 'base.html' %} -{# {% block title %}{{ event.name }} - CritiqueBrainz{% endblock %} #} +{% block title %}{{ label.name }} - CritiqueBrainz{% endblock %} {% block content %} -
    -

    - {# {{ event.name }} #} -

    +
    +

    + {{ label.name }} + {% if label.disambiguation %} + ({{ label.disambiguation }}) + {% endif %} +

    + + {% if not my_review %} + + {{ _('Write a review') }} + + {% else %} + + {{ _('Edit my review') }} + + {% endif %} +
    - {% if not my_review %} - - {{ _('Write a review') }} - +
    +
    +

    {{ _('Reviews') }}

    + {% if not reviews %} +

    {{ _('No reviews found') }}

    {% else %} - - {{ _('Edit my review') }} - + + + + + + + + + + {% for review in reviews %} + + + + + + {% endfor %} + +
    {{ _('Published on') }}{{ _('Votes (+/-)') }}
    + + {{ _('by %(reviewer)s', reviewer=' '|safe % review.user.avatar + review.user.display_name) }} + + {{ review.published_on | date }}{{ review.votes_positive_count }}/{{ review.votes_negative_count }}
    +
    + +
    {% endif %} +
      +
      + +
      +

      {{ _('Label information') }}

      + {% if label.type %}

      {{ label.type }}

      {% endif %} + + {% if label['external-urls'] %} + {{ _('External links') }} + + {% endif %} + +
      +
      {% endblock %} diff --git a/critiquebrainz/frontend/views/__init__.py b/critiquebrainz/frontend/views/__init__.py index 1f05d8b3c..51f6c13c4 100644 --- a/critiquebrainz/frontend/views/__init__.py +++ b/critiquebrainz/frontend/views/__init__.py @@ -2,6 +2,7 @@ import critiquebrainz.db.exceptions as db_exceptions ARTIST_REVIEWS_LIMIT = 5 +LABEL_REVIEWS_LIMIT = 5 BROWSE_RELEASE_GROUPS_LIMIT = 20 diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index 7e270ff33..ef5e80a59 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -1,8 +1,10 @@ -from flask import Blueprint, render_template -from werkzeug.exceptions import NotFound +from flask import Blueprint, render_template, request +from werkzeug.exceptions import BadRequest, NotFound from flask_babel import gettext +import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +from critiquebrainz.frontend.views import BROWSE_RELEASE_GROUPS_LIMIT, LABEL_REVIEWS_LIMIT label_bp = Blueprint('label', __name__) @@ -15,4 +17,24 @@ def entity(id): except mb_exceptions.NoDataFoundException: raise NotFound(gettext("Sorry, we couldn't find a label with that MusicBrainz ID.")) - return render_template('label/entity.html', id=label['id'], label=label) + label_reviews_limit = LABEL_REVIEWS_LIMIT + if request.args.get('reviews') == "all": + label_reviews_limit = None + + reviews_offset = 0 + reviews, reviews_count = db_review.list_reviews( + entity_id=label['id'], + entity_type='label', + sort='popularity', + limit=label_reviews_limit, + offset=reviews_offset, + ) + + return render_template( + 'label/entity.html', + id=label['id'], + label=label, + reviews=reviews, + reviews_limit=label_reviews_limit, + reviews_count=reviews_count, + ) From 9df5cd683f13af44ee16ef14052d871535b7f48c Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 8 Aug 2019 19:55:44 -0400 Subject: [PATCH 085/159] Removed unused imports --- critiquebrainz/frontend/views/label.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index ef5e80a59..b5ca99443 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -1,10 +1,10 @@ from flask import Blueprint, render_template, request -from werkzeug.exceptions import BadRequest, NotFound +from werkzeug.exceptions import NotFound from flask_babel import gettext import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -from critiquebrainz.frontend.views import BROWSE_RELEASE_GROUPS_LIMIT, LABEL_REVIEWS_LIMIT +from critiquebrainz.frontend.views import LABEL_REVIEWS_LIMIT label_bp = Blueprint('label', __name__) From f134e12b40d0213379c505ca3ec388d7e4e25a76 Mon Sep 17 00:00:00 2001 From: spellew Date: Mon, 12 Aug 2019 20:23:01 -0400 Subject: [PATCH 086/159] Added rating support for labels --- .../frontend/templates/label/entity.html | 24 +++++++++++++++++++ critiquebrainz/frontend/templates/macros.html | 6 +++-- critiquebrainz/frontend/views/label.py | 22 ++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/critiquebrainz/frontend/templates/label/entity.html b/critiquebrainz/frontend/templates/label/entity.html index eed1de912..17ff6fbfc 100644 --- a/critiquebrainz/frontend/templates/label/entity.html +++ b/critiquebrainz/frontend/templates/label/entity.html @@ -1,4 +1,5 @@ {% extends 'base.html' %} +{% from 'macros.html' import entity_rate_form, show_avg_rating with context %} {% block title %}{{ label.name }} - CritiqueBrainz{% endblock %} @@ -92,6 +93,29 @@

      {{ _('Label information') }}

      {{ _('Edit on MusicBrainz') }}
      + +

      + {{ entity_rate_form('label', 'label') }} + {% if avg_rating %} +
      + {{ show_avg_rating(avg_rating.rating, avg_rating.count, show_glyphicon = false) }} +
      + {% endif %}
      {% endblock %} + +{% block scripts %} + + + +{% endblock %} diff --git a/critiquebrainz/frontend/templates/macros.html b/critiquebrainz/frontend/templates/macros.html index cc922adb9..86329e196 100644 --- a/critiquebrainz/frontend/templates/macros.html +++ b/critiquebrainz/frontend/templates/macros.html @@ -160,8 +160,10 @@ {% endif %} {% endmacro %} -{% macro show_avg_rating(rating, count) %} - +{% macro show_avg_rating(rating, count, show_glyphicon=True) %} + {% if show_glyphicon %} + + {% endif %} {{ rating }}/5 {{ _('based on %(number)s ratings', number=count) }} {% endmacro %} diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index b5ca99443..9cba709cc 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -1,10 +1,13 @@ from flask import Blueprint, render_template, request from werkzeug.exceptions import NotFound +from flask_login import current_user from flask_babel import gettext import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -from critiquebrainz.frontend.views import LABEL_REVIEWS_LIMIT +from critiquebrainz.frontend.views import get_avg_rating, LABEL_REVIEWS_LIMIT +from critiquebrainz.frontend.forms.rate import RatingEditForm + label_bp = Blueprint('label', __name__) @@ -21,6 +24,16 @@ def entity(id): if request.args.get('reviews') == "all": label_reviews_limit = None + if current_user.is_authenticated: + my_reviews, my_count = db_review.list_reviews( + entity_id=label['id'], + entity_type='label', + user_id=current_user.id, + ) + my_review = my_reviews[0] if my_count else None + else: + my_review = None + reviews_offset = 0 reviews, reviews_count = db_review.list_reviews( entity_id=label['id'], @@ -30,6 +43,11 @@ def entity(id): offset=reviews_offset, ) + avg_rating = get_avg_rating(label['id'], "label") + + rating_form = RatingEditForm(entity_id=id, entity_type='label') + rating_form.rating.data = my_review['rating'] if my_review else None + return render_template( 'label/entity.html', id=label['id'], @@ -37,4 +55,6 @@ def entity(id): reviews=reviews, reviews_limit=label_reviews_limit, reviews_count=reviews_count, + avg_rating=avg_rating, + rating_form=rating_form, ) From 636ce3fb8c1e6422ad8eba8323bd75357498d16a Mon Sep 17 00:00:00 2001 From: spellew Date: Tue, 13 Aug 2019 19:10:49 -0400 Subject: [PATCH 087/159] Updated label render_template with proper arguments --- critiquebrainz/frontend/views/label.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index 9cba709cc..86a46e43e 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -48,13 +48,7 @@ def entity(id): rating_form = RatingEditForm(entity_id=id, entity_type='label') rating_form.rating.data = my_review['rating'] if my_review else None - return render_template( - 'label/entity.html', - id=label['id'], - label=label, - reviews=reviews, - reviews_limit=label_reviews_limit, - reviews_count=reviews_count, - avg_rating=avg_rating, - rating_form=rating_form, - ) + return render_template('label/entity.html', id=label['id'], label=label, + reviews=reviews, my_review=my_review, reviews_limit=label_reviews_limit, + reviews_count=reviews_count, avg_rating=avg_rating, rating_form=rating_form, + current_user=current_user) From aa643e97aa878242a72cfc8153edf915e30d0296 Mon Sep 17 00:00:00 2001 From: spellew Date: Tue, 13 Aug 2019 19:14:29 -0400 Subject: [PATCH 088/159] Updated label placeholder image --- critiquebrainz/frontend/templates/macros.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/critiquebrainz/frontend/templates/macros.html b/critiquebrainz/frontend/templates/macros.html index 86329e196..0c57b7cf1 100644 --- a/critiquebrainz/frontend/templates/macros.html +++ b/critiquebrainz/frontend/templates/macros.html @@ -54,7 +54,7 @@ {% endif %} {% elif entity_type == 'label' %} - + {% if overlay_type %} {{ _('Label') }} From 733f55db2d48098320c4db230dde88657557075c Mon Sep 17 00:00:00 2001 From: Param Singh Date: Wed, 14 Aug 2019 20:10:41 -0700 Subject: [PATCH 089/159] Move label schema change to different schema change script This needs to be done so that each schema change can be run independently on the main database. --- admin/schema_changes/16.sql | 1 - admin/schema_changes/17.sql | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 admin/schema_changes/17.sql diff --git a/admin/schema_changes/16.sql b/admin/schema_changes/16.sql index fe266c554..b1f4e5377 100644 --- a/admin/schema_changes/16.sql +++ b/admin/schema_changes/16.sql @@ -1,2 +1 @@ ALTER TYPE entity_types ADD VALUE 'artist' AFTER 'place'; -ALTER TYPE entity_types ADD VALUE 'label' AFTER 'artist'; diff --git a/admin/schema_changes/17.sql b/admin/schema_changes/17.sql new file mode 100644 index 000000000..5842ba030 --- /dev/null +++ b/admin/schema_changes/17.sql @@ -0,0 +1 @@ +ALTER TYPE entity_types ADD VALUE 'label' AFTER 'artist'; From 8980b725ef72ea60877b18483bff756ae0182885 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 15 Aug 2019 15:38:12 -0400 Subject: [PATCH 090/159] Added sql alter type script --- admin/schema_changes/19.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 admin/schema_changes/19.sql diff --git a/admin/schema_changes/19.sql b/admin/schema_changes/19.sql new file mode 100644 index 000000000..9d7c8e1c5 --- /dev/null +++ b/admin/schema_changes/19.sql @@ -0,0 +1 @@ +ALTER TYPE entity_types ADD VALUE 'work' AFTER 'recording'; From cb594d6b9aa200bb944706b386e7f6064e9bd9c3 Mon Sep 17 00:00:00 2001 From: spellew Date: Thu, 15 Aug 2019 16:22:15 -0400 Subject: [PATCH 091/159] Updated work entity page to display more information --- .../frontend/templates/work/entity.html | 172 ++++++++++++++++-- critiquebrainz/frontend/views/__init__.py | 3 +- critiquebrainz/frontend/views/work.py | 51 +++++- 3 files changed, 208 insertions(+), 18 deletions(-) diff --git a/critiquebrainz/frontend/templates/work/entity.html b/critiquebrainz/frontend/templates/work/entity.html index 4dc70e74b..c5efbd431 100644 --- a/critiquebrainz/frontend/templates/work/entity.html +++ b/critiquebrainz/frontend/templates/work/entity.html @@ -1,23 +1,165 @@ {% extends 'base.html' %} +{% from 'macros.html' import entity_rate_form, show_avg_rating with context %} -{# {% block title %}{{ event.name }} - CritiqueBrainz{% endblock %} #} +{% block title %}{{ work.name }} - CritiqueBrainz{% endblock %} {% block content %} -
      -

      - {# {{ event.name }} #} -

      - - {% if not my_review %} - - {{ _('Write a review') }} - +
      +

      + {{ work.name }} +

      + + {% if not my_review %} + + {{ _('Write a review') }} + + {% else %} + + {{ _('Edit my review') }} + + {% endif %} +
      + +
      +
      +

      {{ _('Reviews') }}

      + {% if not reviews %} +

      {{ _('No reviews found') }}

      + {% else %} + + + + + + + + + + {% for review in reviews %} + + + + + + {% endfor %} + +
      {{ _('Published on') }}{{ _('Votes (+/-)') }}
      + + {{ _('by %(reviewer)s', reviewer=' '|safe % review.user.avatar + review.user.display_name) }} + + {{ review.published_on | date }}{{ review.votes_positive_count }}/{{ review.votes_negative_count }}
      +
      + +
      + {% endif %} +
        +

        {{ _('Recordings') }}

        + {% if not recording_rels %} +

        {{ _('No recordings found') }}

        {% else %} - - {{ _('Edit my review') }} - + + + + + + + + + + {% for rel in recording_rels %} + {% set recording = rel['recording'] %} + + + + + + {% endfor %} + +
        {{ _('Type') }}{{ _('Length') }}
        + {# #} + {{ recording.name }} + {# #} + {{ rel.type | capitalize }} + {% if recording.length %} + {{ (recording.length * 1000) | track_length }} + {% else %} + - + {% endif %} +
        + {% if recording_count > recording_limit %} +
        + +
        + {% endif %} {% endif %} +
          + +
          +

          {{ _('Work information') }}

          + {% if work.type %}

          {{ work.type }}

          {% endif %} + + {% if work['external-urls'] %} + {{ _('External links') }} + + {% endif %} + + + +

          + {{ entity_rate_form('work', 'work') }} + {% if avg_rating %} +
          + {{ show_avg_rating(avg_rating.rating, avg_rating.count, show_glyphicon = false) }} +
          + {% endif %} +
          +
          +{% endblock %} + +{% block scripts %} + + + {% endblock %} diff --git a/critiquebrainz/frontend/views/__init__.py b/critiquebrainz/frontend/views/__init__.py index 51f6c13c4..4cb25e17f 100644 --- a/critiquebrainz/frontend/views/__init__.py +++ b/critiquebrainz/frontend/views/__init__.py @@ -3,8 +3,9 @@ ARTIST_REVIEWS_LIMIT = 5 LABEL_REVIEWS_LIMIT = 5 +WORK_REVIEWS_LIMIT = 5 BROWSE_RELEASE_GROUPS_LIMIT = 20 - +BROWSE_RECORDING_LIMIT = 10 def get_avg_rating(entity_id, entity_type): """Retrieve average rating""" diff --git a/critiquebrainz/frontend/views/work.py b/critiquebrainz/frontend/views/work.py index 78b2612ad..899df794f 100644 --- a/critiquebrainz/frontend/views/work.py +++ b/critiquebrainz/frontend/views/work.py @@ -1,8 +1,13 @@ -from flask import Blueprint, render_template +from flask import Blueprint, render_template, request, redirect, url_for from werkzeug.exceptions import NotFound +from flask_login import current_user from flask_babel import gettext +import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.work as mb_work import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +from critiquebrainz.frontend.views import get_avg_rating, WORK_REVIEWS_LIMIT, BROWSE_RECORDING_LIMIT +from critiquebrainz.frontend.forms.rate import RatingEditForm + work_bp = Blueprint('work', __name__) @@ -15,4 +20,46 @@ def entity(id): except mb_exceptions.NoDataFoundException: raise NotFound(gettext("Sorry, we couldn't find a work with that MusicBrainz ID.")) - return render_template('work/entity.html', id=work['id'], work=work) + work_reviews_limit = WORK_REVIEWS_LIMIT + if request.args.get('reviews') == "all": + work_reviews_limit = None + + if current_user.is_authenticated: + my_reviews, my_count = db_review.list_reviews( + entity_id=work['id'], + entity_type='work', + user_id=current_user.id, + ) + my_review = my_reviews[0] if my_count else None + else: + my_review = None + + reviews_offset = 0 + reviews, reviews_count = db_review.list_reviews( + entity_id=work['id'], + entity_type='work', + sort='popularity', + limit=work_reviews_limit, + offset=reviews_offset, + ) + + page = int(request.args.get('page', default=1)) + if page < 1: + return redirect(url_for('.reviews')) + + recording_rels = work['recording-rels'] + recording_count = len(recording_rels) + + recording_offset = (page - 1) * BROWSE_RECORDING_LIMIT + recording_rels = recording_rels[recording_offset:recording_offset + BROWSE_RECORDING_LIMIT] + + avg_rating = get_avg_rating(work['id'], "work") + + rating_form = RatingEditForm(entity_id=id, entity_type='work') + rating_form.rating.data = my_review['rating'] if my_review else None + + return render_template('work/entity.html', id=work['id'], work=work, page=page, + reviews=reviews, my_review=my_review, reviews_limit=work_reviews_limit, + reviews_count=reviews_count, avg_rating=avg_rating, rating_form=rating_form, + recording_limit=BROWSE_RECORDING_LIMIT, recording_rels=recording_rels, + recording_count=recording_count, current_user=current_user) From f52087e2357f64b0592eb608783b55572720858c Mon Sep 17 00:00:00 2001 From: spellew Date: Sun, 18 Aug 2019 07:55:49 -0400 Subject: [PATCH 092/159] Updated work entity page to show 'type' next to 'name' --- critiquebrainz/frontend/templates/work/entity.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/critiquebrainz/frontend/templates/work/entity.html b/critiquebrainz/frontend/templates/work/entity.html index c5efbd431..5d6a0db58 100644 --- a/critiquebrainz/frontend/templates/work/entity.html +++ b/critiquebrainz/frontend/templates/work/entity.html @@ -7,6 +7,9 @@

          {{ work.name }} + {% if work.type %} + ({{ work.type }}) + {% endif %}

          {% if not my_review %} @@ -112,7 +115,6 @@

          {{ _('Recordings') }}

          {{ _('Work information') }}

          - {% if work.type %}

          {{ work.type }}

          {% endif %} {% if work['external-urls'] %} {{ _('External links') }} From a631e06cf721993fa710a62276b7d773b6d08236 Mon Sep 17 00:00:00 2001 From: spellew Date: Tue, 20 Aug 2019 09:26:33 -0400 Subject: [PATCH 093/159] Added title for work to user template --- critiquebrainz/frontend/templates/user/reviews.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/critiquebrainz/frontend/templates/user/reviews.html b/critiquebrainz/frontend/templates/user/reviews.html index 0ec89470c..4dc3db463 100644 --- a/critiquebrainz/frontend/templates/user/reviews.html +++ b/critiquebrainz/frontend/templates/user/reviews.html @@ -48,6 +48,18 @@ {% endif %} {%- elif review.entity_type == 'place' -%} {{ entity.name | default(_('[Unknown place]')) }} + + {%- elif review.entity_type == 'work' -%} + {{ entity.name | default(_('[Unknown work]')) }} + {% if entity['artist-rels'] %} + ( + {{ entity['artist-rels'][0]['artist']['name'] }} + {% set count = entity['artist-rels'] | length %} + {% if count > 1 %} + + {{ count - 1 }} {{ _("more") }} + {% endif %} + ) + {% endif %} {%- endif -%} From 8d72578404e9c078f9d7a79cd6eef90e84968657 Mon Sep 17 00:00:00 2001 From: spellew Date: Wed, 21 Aug 2019 20:58:48 -0400 Subject: [PATCH 094/159] Created separate track_length functions for seconds and milliseconds --- critiquebrainz/frontend/__init__.py | 3 ++- .../frontend/templates/release_group/entity.html | 2 +- critiquebrainz/frontend/templates/work/entity.html | 2 +- critiquebrainz/utils.py | 7 +++++++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/critiquebrainz/frontend/__init__.py b/critiquebrainz/frontend/__init__.py index 6f9f1e60c..2cb560889 100644 --- a/critiquebrainz/frontend/__init__.py +++ b/critiquebrainz/frontend/__init__.py @@ -115,11 +115,12 @@ def create_app(debug=None, config_path=None): # TODO (code-master5): disabled no-member warnings just as a workaround to deal with failing tests till the # issue [https://github.com/PyCQA/pylint/issues/2563] with pylint is resolved app.jinja_env.add_extension('jinja2.ext.do') - from critiquebrainz.utils import reformat_date, reformat_datetime, track_length, parameterize + from critiquebrainz.utils import reformat_date, reformat_datetime, track_length, track_length_ms, parameterize from critiquebrainz.frontend.external.musicbrainz_db.entities import get_entity_by_id app.jinja_env.filters['date'] = reformat_date app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['track_length'] = track_length + app.jinja_env.filters['track_length_ms'] = track_length_ms app.jinja_env.filters['parameterize'] = parameterize app.jinja_env.filters['entity_details'] = get_entity_by_id from flask_babel import Locale, get_locale diff --git a/critiquebrainz/frontend/templates/release_group/entity.html b/critiquebrainz/frontend/templates/release_group/entity.html index 001cb3d27..d4f3cb599 100644 --- a/critiquebrainz/frontend/templates/release_group/entity.html +++ b/critiquebrainz/frontend/templates/release_group/entity.html @@ -119,7 +119,7 @@

          {{ _('Tracklist') }}

          {% if track.length %} - {{ track.length | track_length }} + {{ track.length | track_length_ms }} {% else %} - {% endif %} diff --git a/critiquebrainz/frontend/templates/work/entity.html b/critiquebrainz/frontend/templates/work/entity.html index 5d6a0db58..41b4c18d4 100644 --- a/critiquebrainz/frontend/templates/work/entity.html +++ b/critiquebrainz/frontend/templates/work/entity.html @@ -88,7 +88,7 @@

          {{ _('Recordings') }}

          {{ rel.type | capitalize }} {% if recording.length %} - {{ (recording.length * 1000) | track_length }} + {{ recording.length | track_length }} {% else %} - {% endif %} diff --git a/critiquebrainz/utils.py b/critiquebrainz/utils.py index 8de829d56..9d3e892c6 100644 --- a/critiquebrainz/utils.py +++ b/critiquebrainz/utils.py @@ -46,6 +46,13 @@ def reformat_datetime(value, format=None): def track_length(value): + """Converts track length specified in seconds into a pretty string.""" + seconds = int(value) + minutes, seconds = divmod(seconds, 60) + return '%i:%02i' % (minutes, seconds) + + +def track_length_ms(value): """Converts track length specified in milliseconds into a pretty string.""" seconds = int(value) / 1000 minutes, seconds = divmod(seconds, 60) From c8bd47d2d5f01c34c1403775a4ed138520f903e5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:47:09 +0000 Subject: [PATCH 095/159] Bump beautifulsoup4 from 4.6.0 to 4.8.0 Bumps [beautifulsoup4](http://www.crummy.com/software/BeautifulSoup/bs4/) from 4.6.0 to 4.8.0. Signed-off-by: dependabot-preview[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f279bed0a..84ca27086 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ git+https://github.com/metabrainz/brainzutils-python.git@v1.13.0 -beautifulsoup4==4.6.0 +beautifulsoup4==4.8.0 coverage==4.4.1 click==6.7 Flask-Babel==0.11.2 From d6911d3158def0ebbea66e87294acda674eba271 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:47:29 +0000 Subject: [PATCH 096/159] Bump wtforms from 2.1 to 2.2.1 Bumps [wtforms](https://github.com/wtforms/wtforms) from 2.1 to 2.2.1. - [Release notes](https://github.com/wtforms/wtforms/releases) - [Changelog](https://github.com/wtforms/wtforms/blob/master/CHANGES.rst) - [Commits](https://github.com/wtforms/wtforms/compare/2.1...2.2.1) Signed-off-by: dependabot-preview[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f279bed0a..7599b0a6c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,5 +18,5 @@ pycountry==1.20 python-dateutil==2.6.1 rauth==0.7.3 transifex-client==0.12.4 -WTForms==2.1 +WTForms==2.2.1 langdetect==1.0.7 From f8461a8b5d35843ae24ccee7e5069422409a6714 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:47:47 +0000 Subject: [PATCH 097/159] Bump markdown from 2.6.8 to 3.1.1 Bumps [markdown](https://github.com/Python-Markdown/markdown) from 2.6.8 to 3.1.1. - [Release notes](https://github.com/Python-Markdown/markdown/releases) - [Commits](https://github.com/Python-Markdown/markdown/commits/3.1.1) Signed-off-by: dependabot-preview[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f279bed0a..3e3d790b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ Flask-Login==0.4.0 Flask-SQLAlchemy==2.2 Flask-Testing==0.6.2 Flask-WTF==0.14.2 -Markdown==2.6.8 +Markdown==3.1.1 musicbrainzngs==0.6 pytest==3.2.0 pytest-cov==2.5.1 From 87247247ced35704d58d0f5bbae6e73c50bc1ba4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:48:11 +0000 Subject: [PATCH 098/159] Bump flask-sqlalchemy from 2.2 to 2.4.0 Bumps [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) from 2.2 to 2.4.0. - [Release notes](https://github.com/pallets/flask-sqlalchemy/releases) - [Changelog](https://github.com/pallets/flask-sqlalchemy/blob/master/CHANGES.rst) - [Commits](https://github.com/pallets/flask-sqlalchemy/compare/2.2...2.4.0) Signed-off-by: dependabot-preview[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f279bed0a..3c425d934 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ coverage==4.4.1 click==6.7 Flask-Babel==0.11.2 Flask-Login==0.4.0 -Flask-SQLAlchemy==2.2 +Flask-SQLAlchemy==2.4.0 Flask-Testing==0.6.2 Flask-WTF==0.14.2 Markdown==2.6.8 From a2c9f40c9f405d2425141ffc8685d4ab460514c7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:48:30 +0000 Subject: [PATCH 099/159] Bump psycopg2 from 2.7.3 to 2.8.3 Bumps [psycopg2](https://github.com/psycopg/psycopg2) from 2.7.3 to 2.8.3. - [Release notes](https://github.com/psycopg/psycopg2/releases) - [Changelog](https://github.com/psycopg/psycopg2/blob/master/NEWS) - [Commits](https://github.com/psycopg/psycopg2/commits) Signed-off-by: dependabot-preview[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f279bed0a..e3c8ea51d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ pytest==3.2.0 pytest-cov==2.5.1 pylint==2.3.0 flake8==3.7.7 -psycopg2==2.7.3 +psycopg2==2.8.3 pycountry==1.20 python-dateutil==2.6.1 rauth==0.7.3 From e8a1a9d8dbc2e812570dd0376979f64cefed8a61 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:48:31 +0000 Subject: [PATCH 100/159] Bump acorn from 6.0.0 to 7.0.0 Bumps [acorn](https://github.com/acornjs/acorn) from 6.0.0 to 7.0.0. - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/6.0.0...7.0.0) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 29 +++++++++++++++++++---------- package.json | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c56a18f98..9f1014a35 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -54,9 +54,9 @@ } }, "acorn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.0.tgz", - "integrity": "sha512-vvZ8PwswGTM15ZXyk3I+SvpTm8UbF8iRnGiU/f9TPU6By7K1XTvfvusFtoQt0WYycudFSYW2lrJDivhBlGovvQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", "dev": true }, "acorn-dynamic-import": { @@ -210,7 +210,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true }, "assign-symbols": { "version": "1.0.0", @@ -1255,6 +1256,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -1430,7 +1432,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true }, "deprecated": { "version": "0.0.1", @@ -1656,7 +1659,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true }, "fancy-log": { "version": "1.3.3", @@ -2508,7 +2512,8 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true }, "jsesc": { "version": "1.3.0", @@ -2837,12 +2842,14 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "optional": true }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "optional": true, "requires": { "mime-db": "1.40.0" } @@ -3397,7 +3404,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true }, "semver": { "version": "4.3.6", @@ -3867,7 +3875,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true }, "typedarray": { "version": "0.0.6", diff --git a/package.json b/package.json index 597828b35..b35444d9f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "private": true, "devDependencies": { - "acorn": "6.0.0", + "acorn": "7.0.0", "bootstrap": "3.4.1", "jquery": "3.4.0", "lodash": "4.17.11" From cc0ca1750bcebd2bf3a197da2da76f79766bf3ec Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:48:54 +0000 Subject: [PATCH 101/159] [Security] Bump lodash.merge from 4.6.1 to 4.6.2 Bumps [lodash.merge](https://github.com/lodash/lodash) from 4.6.1 to 4.6.2. **This update includes a security fix.** - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/commits) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c56a18f98..c6a59ec04 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -210,7 +210,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true }, "assign-symbols": { "version": "1.0.0", @@ -1255,6 +1256,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -1430,7 +1432,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true }, "deprecated": { "version": "0.0.1", @@ -1656,7 +1659,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true }, "fancy-log": { "version": "1.3.3", @@ -2508,7 +2512,8 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true }, "jsesc": { "version": "1.3.0", @@ -2715,9 +2720,9 @@ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" }, "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.partialright": { "version": "4.2.1", @@ -2837,12 +2842,14 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "optional": true }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "optional": true, "requires": { "mime-db": "1.40.0" } @@ -3397,7 +3404,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true }, "semver": { "version": "4.3.6", @@ -3867,7 +3875,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true }, "typedarray": { "version": "0.0.6", From c1a6a5c5ff8ab84fe151a1d7a9c59814851023f9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:48:58 +0000 Subject: [PATCH 102/159] Bump gulp-rev from 7.1.2 to 9.0.0 Bumps [gulp-rev](https://github.com/sindresorhus/gulp-rev) from 7.1.2 to 9.0.0. - [Release notes](https://github.com/sindresorhus/gulp-rev/releases) - [Commits](https://github.com/sindresorhus/gulp-rev/compare/v7.1.2...v9.0.0) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 268 +++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 218 insertions(+), 52 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c56a18f98..8414e047d 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -124,6 +124,14 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -210,7 +218,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true }, "assign-symbols": { "version": "1.0.0", @@ -1201,11 +1210,55 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "codemirror": { "version": "5.32.0", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.32.0.tgz", @@ -1255,6 +1308,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -1430,7 +1484,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true }, "deprecated": { "version": "0.0.1", @@ -1656,7 +1711,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true }, "fancy-log": { "version": "1.3.3", @@ -2025,18 +2081,48 @@ } }, "gulp-rev": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-7.1.2.tgz", - "integrity": "sha1-XhfMIp9rRcdCVviK0/LT6aMwWCk=", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-9.0.0.tgz", + "integrity": "sha512-Ytx/uzDA2xNxHlPG8GReS1ut00msd0HlKDk9Ai/0xF2yvg+DAeGRAviCFlQzQmdZtqAoXznYspwWoGEoxDvhyA==", "requires": { - "gulp-util": "^3.0.0", "modify-filename": "^1.1.0", - "object-assign": "^4.0.1", - "rev-hash": "^1.0.0", - "rev-path": "^1.0.0", - "sort-keys": "^1.0.0", + "plugin-error": "^1.0.1", + "rev-hash": "^2.0.0", + "rev-path": "^2.0.0", + "sort-keys": "^2.0.0", "through2": "^2.0.0", - "vinyl-file": "^1.1.0" + "vinyl": "^2.1.0", + "vinyl-file": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } } }, "gulp-streamify": { @@ -2508,7 +2594,8 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true }, "jsesc": { "version": "1.3.0", @@ -2837,12 +2924,14 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "optional": true }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "optional": true, "requires": { "mime-db": "1.40.0" } @@ -3136,6 +3225,22 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -3282,6 +3387,11 @@ } } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -3361,14 +3471,14 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rev-hash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rev-hash/-/rev-hash-1.0.0.tgz", - "integrity": "sha1-lpk5Weqb+xxZsTrfAqwuNLs3NgM=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rev-hash/-/rev-hash-2.0.0.tgz", + "integrity": "sha1-dyCiNu0MJY3z5kvsA+wEiwW5JMQ=" }, "rev-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rev-path/-/rev-path-1.0.0.tgz", - "integrity": "sha1-1My0NqwzcMRgcXXOiOr8XGXF1lM=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rev-path/-/rev-path-2.0.0.tgz", + "integrity": "sha512-G5R2L9gYu9kEuqPfIFgO9gO+OhBWOAT83HyauOQmGHO6y9Fsa4acv+XsmNhNDrod0HDh1/VxJRmsffThzeHJlQ==", "requires": { "modify-filename": "^1.0.0" } @@ -3397,7 +3507,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true }, "semver": { "version": "4.3.6", @@ -3558,9 +3669,9 @@ } }, "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "requires": { "is-plain-obj": "^1.0.0" } @@ -3709,15 +3820,58 @@ "is-utf8": "^0.2.0" } }, - "strip-bom-stream": { + "strip-bom-buf": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", "requires": { - "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "requires": { + "first-chunk-stream": "^2.0.0", "strip-bom": "^2.0.0" }, "dependencies": { + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", @@ -3867,7 +4021,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true }, "typedarray": { "version": "0.0.6", @@ -4084,37 +4239,48 @@ } }, "vinyl-file": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-1.3.0.tgz", - "integrity": "sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", "requires": { "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "vinyl": "^1.1.0" + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" }, "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } diff --git a/package.json b/package.json index 597828b35..a62570fbd 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "envify": "4.1.0", "gulp": "3.9.1", "gulp-less": "3.3.2", - "gulp-rev": "7.1.2", + "gulp-rev": "9.0.0", "gulp-streamify": "1.0.2", "leaflet": "1.1.0", "less": "2.7.2", From 99ecd4fadbf8cf317effdcfc305e0d8513900ab4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:50:20 +0000 Subject: [PATCH 103/159] Bump babelify from 7.3.0 to 8.0.0 Bumps [babelify](https://github.com/babel/babelify) from 7.3.0 to 8.0.0. - [Release notes](https://github.com/babel/babelify/releases) - [Commits](https://github.com/babel/babelify/compare/v7.3.0...v8.0.0) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 33 +++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c56a18f98..aca25521d 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -210,7 +210,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true }, "assign-symbols": { "version": "1.0.0", @@ -929,13 +930,9 @@ } }, "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz", + "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==" }, "babylon": { "version": "6.18.0", @@ -1255,6 +1252,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -1430,7 +1428,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true }, "deprecated": { "version": "0.0.1", @@ -1656,7 +1655,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true }, "fancy-log": { "version": "1.3.3", @@ -2508,7 +2508,8 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true }, "jsesc": { "version": "1.3.0", @@ -2837,12 +2838,14 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "optional": true }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "optional": true, "requires": { "mime-db": "1.40.0" } @@ -3397,7 +3400,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true }, "semver": { "version": "4.3.6", @@ -3867,7 +3871,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true }, "typedarray": { "version": "0.0.6", diff --git a/package.json b/package.json index 597828b35..0ba937f92 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "babel-core": "6.25.0", "babel-preset-es2015": "6.24.1", "babel-preset-stage-2": "6.24.1", - "babelify": "7.3.0", + "babelify": "8.0.0", "bootstrap-rating-input": "0.4.0", "envify": "4.1.0", "gulp": "3.9.1", From 63d63f723f9a7eea9827f59631c9768d40c2d2db Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:27:30 -0700 Subject: [PATCH 104/159] [Security] Bump mixin-deep from 1.3.1 to 1.3.2 (#282) Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2. **This update includes a security fix.** - [Release notes](https://github.com/jonschlinkert/mixin-deep/releases) - [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 584d81800..fbafa0b96 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2950,9 +2950,9 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" From a231ef27923f54f8c3abb0c368e871215423546e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2019 23:28:41 -0700 Subject: [PATCH 105/159] Bump jquery from 3.4.0 to 3.4.1 (#284) Bumps [jquery](https://github.com/jquery/jquery) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/3.4.0...3.4.1) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fbafa0b96..7c3f259d3 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2581,9 +2581,9 @@ "optional": true }, "jquery": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.0.tgz", - "integrity": "sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", "dev": true }, "js-tokens": { diff --git a/package.json b/package.json index 92bceb42a..0e79a62f6 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "devDependencies": { "acorn": "7.0.0", "bootstrap": "3.4.1", - "jquery": "3.4.0", + "jquery": "3.4.1", "lodash": "4.17.11" } } From 02c838ce8b9221c6657c9c398b3990c98cc1bb38 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 06:28:55 +0000 Subject: [PATCH 106/159] Bump through2 from 2.0.3 to 3.0.1 Bumps [through2](https://github.com/rvagg/through2) from 2.0.3 to 3.0.1. - [Release notes](https://github.com/rvagg/through2/releases) - [Commits](https://github.com/rvagg/through2/compare/v2.0.3...v3.0.1) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 229 +++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 206 insertions(+), 25 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fbafa0b96..53119ad37 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1083,6 +1083,44 @@ "safe-buffer": "^5.1.1", "through2": "^2.0.0", "umd": "^3.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, "buffer": { @@ -2078,6 +2116,44 @@ "object-assign": "^4.0.1", "through2": "^2.0.0", "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, "gulp-rev": { @@ -2105,11 +2181,47 @@ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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" + } + }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -2221,6 +2333,11 @@ "vinyl": "^0.5.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -2230,6 +2347,37 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } } } }, @@ -2388,6 +2536,44 @@ "through2": "^2.0.0", "undeclared-identifiers": "^1.1.2", "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, "interpret": { @@ -3893,39 +4079,34 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2 || 3" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "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==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } diff --git a/package.json b/package.json index 92bceb42a..ee1b2e875 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "path": "0.12.7", "q": "1.5.0", "simplemde": "^1.11.2", - "through2": "2.0.3", + "through2": "3.0.1", "vinyl-source-stream": "1.1.0", "yarb": "0.8.0" }, From 45b64f06a694553cb3aabb1d0a221093dda13613 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2019 06:29:53 +0000 Subject: [PATCH 107/159] [Security] Bump lodash from 4.17.11 to 4.17.13 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.13. **This update includes a security fix.** - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.13) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 7c3f259d3..1b350f85e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2704,9 +2704,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA==" }, "lodash._basecopy": { "version": "3.0.1", diff --git a/package.json b/package.json index 0e79a62f6..d8488d9b3 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,6 @@ "acorn": "7.0.0", "bootstrap": "3.4.1", "jquery": "3.4.1", - "lodash": "4.17.11" + "lodash": "4.17.13" } } From 5dbbc65cdd25b694dbca7a4ec9dc237389b7edab Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2019 21:49:59 +0000 Subject: [PATCH 108/159] [Security] Bump bootstrap from 3.4.1 to 4.1.2 (#286) * [Security] Bump bootstrap from 3.4.1 to 4.1.2 Bumps [bootstrap](https://github.com/twbs/bootstrap) from 3.4.1 to 4.1.2. **This update includes a security fix.** - [Release notes](https://github.com/twbs/bootstrap/releases) - [Commits](https://github.com/twbs/bootstrap/compare/v3.4.1...v4.1.2) Signed-off-by: dependabot-preview[bot] * Add popper for bootstrap update --- npm-shrinkwrap.json | 6 +++--- package.json | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0c24260a5..9d4e68e2f 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1022,9 +1022,9 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" }, "bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.2.tgz", + "integrity": "sha512-3bP609EdMc/8EwgGp8KgpN8HwnR4V4lZ9CTi5pImMrXNxpkw7dK1B05aMwQWpG1ZWmTLlBSN/uzkuz5GsmQNFA==", "dev": true }, "bootstrap-rating-input": { diff --git a/package.json b/package.json index 357858793..c35169724 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,9 @@ "private": true, "devDependencies": { "acorn": "7.0.0", - "bootstrap": "3.4.1", + "bootstrap": "4.1.2", "jquery": "3.4.1", + "popper.js": "^1.14.1", "lodash": "4.17.13" } } From 6b5ceb0b5a37ac5f44135d883e0640cc7647ad27 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2020 21:09:15 +0000 Subject: [PATCH 109/159] [Security] Bump acorn from 7.0.0 to 7.1.1 Bumps [acorn](https://github.com/acornjs/acorn) from 7.0.0 to 7.1.1. **This update includes a security fix.** - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/7.0.0...7.1.1) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 12 +++++++++--- package.json | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9d4e68e2f..d344565e0 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -54,9 +54,9 @@ } }, "acorn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-dynamic-import": { @@ -3423,6 +3423,12 @@ "extend-shallow": "^3.0.2" } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", diff --git a/package.json b/package.json index c35169724..073dc79dd 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "private": true, "devDependencies": { - "acorn": "7.0.0", + "acorn": "7.1.1", "bootstrap": "4.1.2", "jquery": "3.4.1", "popper.js": "^1.14.1", From 1e2e940b91732be574c890bdaa75becb5fe81e63 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 14 Mar 2020 16:28:20 +0000 Subject: [PATCH 110/159] [Security] Bump bootstrap from 4.1.2 to 4.3.1 Bumps [bootstrap](https://github.com/twbs/bootstrap) from 4.1.2 to 4.3.1. **This update includes a security fix.** - [Release notes](https://github.com/twbs/bootstrap/releases) - [Commits](https://github.com/twbs/bootstrap/compare/v4.1.2...v4.3.1) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index d344565e0..a9de6a2c7 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1022,9 +1022,9 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" }, "bootstrap": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.2.tgz", - "integrity": "sha512-3bP609EdMc/8EwgGp8KgpN8HwnR4V4lZ9CTi5pImMrXNxpkw7dK1B05aMwQWpG1ZWmTLlBSN/uzkuz5GsmQNFA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==", "dev": true }, "bootstrap-rating-input": { diff --git a/package.json b/package.json index 073dc79dd..deb92d0f5 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "private": true, "devDependencies": { "acorn": "7.1.1", - "bootstrap": "4.1.2", + "bootstrap": "4.3.1", "jquery": "3.4.1", "popper.js": "^1.14.1", "lodash": "4.17.13" From e6333cbf31eaa52e10edd00a554c54d1e677b416 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2020 23:15:59 +0000 Subject: [PATCH 111/159] [Security] Bump jquery from 3.4.1 to 3.5.0 Bumps [jquery](https://github.com/jquery/jquery) from 3.4.1 to 3.5.0. **This update includes security fixes.** - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/3.4.1...3.5.0) Signed-off-by: dependabot-preview[bot] --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a9de6a2c7..a16c9afaf 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2763,9 +2763,9 @@ "optional": true }, "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", + "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==", "dev": true }, "js-tokens": { diff --git a/package.json b/package.json index deb92d0f5..12c2f39a6 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "devDependencies": { "acorn": "7.1.1", "bootstrap": "4.3.1", - "jquery": "3.4.1", + "jquery": "3.5.0", "popper.js": "^1.14.1", "lodash": "4.17.13" } From 7a8dc2788d5946a6fdb09e1b443f42d7523ea110 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2020 19:41:40 +0000 Subject: [PATCH 112/159] Bump lodash from 4.17.13 to 4.17.19 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.13 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.13...4.17.19) Signed-off-by: dependabot[bot] --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a16c9afaf..a2f3a1e60 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2886,9 +2886,9 @@ } }, "lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash._basecopy": { "version": "3.0.1", diff --git a/package.json b/package.json index 12c2f39a6..0cc1d1abf 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,6 @@ "bootstrap": "4.3.1", "jquery": "3.5.0", "popper.js": "^1.14.1", - "lodash": "4.17.13" + "lodash": "4.17.19" } } From b315838da1b53e79a27ab1c3ab3b03877ec9b412 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 17:57:59 +0200 Subject: [PATCH 113/159] npm audit update --- package-lock.json | 1661 +++++++++++++++------------------------------ 1 file changed, 547 insertions(+), 1114 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f5e868a4..78dc20c25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -914,9 +914,9 @@ "dev": true }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "acorn-dynamic-import": { @@ -950,9 +950,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { @@ -965,24 +965,14 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, + "optional": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "aproba": { @@ -1009,21 +999,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -1098,10 +1073,11 @@ "dev": true }, "async-each": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", - "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "optional": true }, "asynckit": { "version": "0.4.0", @@ -1226,15 +1202,16 @@ "dev": true }, "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "bn.js": { @@ -1248,14 +1225,15 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { "hoek": "2.x.x" } }, "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" }, "bootstrap-rating-input": { "version": "0.4.0", @@ -1419,22 +1397,23 @@ "dev": true }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" @@ -1488,29 +1467,75 @@ } }, "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", + "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", "dev": true, + "optional": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "chrome-trace-event": { @@ -1555,24 +1580,15 @@ } } }, - "clean-webpack-plugin": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-2.0.1.tgz", - "integrity": "sha512-vway5pXGVd91bicwjaf8j188Al6VMf9R9Ekl6q0qeiaWStRsOOXuh4qtjX1UrUvmz5XevQVCdjBuzr4Tzsnpog==", - "dev": true, - "requires": { - "del": "^4.0.0" - } - }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "clone": { @@ -1588,12 +1604,6 @@ "dev": true, "optional": true }, - "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 - }, "codemirror": { "version": "5.45.0", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.45.0.tgz", @@ -1637,14 +1647,15 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, + "optional": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "commondir": { @@ -1856,9 +1867,9 @@ "dev": true }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "dashdash": { @@ -1957,25 +1968,12 @@ } } }, - "del": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-4.0.0.tgz", - "integrity": "sha512-/BnSJ+SuZyLu7xMn48kZY0nMXDi+5KNmR4g8n21Wivsl8+B9njV6/5kcTNE9juSprp0zRWBU28JuHUq0FqK1Nw==", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.2" - } - }, "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 + "dev": true, + "optional": true }, "des.js": { "version": "1.0.0", @@ -2040,9 +2038,9 @@ "dev": true }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -2054,6 +2052,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -2061,9 +2065,9 @@ "dev": true }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -2167,21 +2171,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2338,7 +2327,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "2.0.1", @@ -2353,9 +2343,9 @@ "dev": true }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "fill-range": { @@ -2402,26 +2392,15 @@ } }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", + "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } } }, "flush-write-stream": { @@ -2508,533 +2487,11 @@ "dev": true }, "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": 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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -3043,20 +2500,11 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3083,9 +2531,9 @@ } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3097,35 +2545,47 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, + "optional": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "^4.0.1" }, "dependencies": { "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, + "optional": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" } } } }, "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } } }, "global-prefix": { @@ -3147,27 +2607,6 @@ "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", "dev": true }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -3306,7 +2745,8 @@ "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true }, "homedir-polyfill": { "version": "1.0.3", @@ -3397,6 +2837,12 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3419,9 +2865,9 @@ "dev": true }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { @@ -3433,12 +2879,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -3460,12 +2900,13 @@ } }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { @@ -3572,30 +3013,6 @@ } } }, - "is-path-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.0.0.tgz", - "integrity": "sha512-m5dHHzpOXEiv18JEORttBO64UgTEypx99vCxQLjbBvGhOJxnTNglYoFXxwo6AbsQb79sqqycQEHv2hWkHZAijA==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.0.0.tgz", - "integrity": "sha512-6Vz5Gc9s/sDA3JBVu0FzWufm8xaBsqy1zn8Q6gmvGP6nSDMw78aS4poBNeatWjaRpTpxxLn1WOndAiOlk+qY8A==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "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-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3614,12 +3031,6 @@ "has": "^1.0.1" } }, - "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-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -3642,6 +3053,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3668,9 +3085,9 @@ "optional": true }, "jquery": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" }, "js-levenshtein": { "version": "1.1.6", @@ -3688,7 +3105,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "dev": true, + "optional": true }, "jsesc": { "version": "2.5.2", @@ -3780,20 +3198,11 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "leaflet": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.1.0.tgz", @@ -3873,9 +3282,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "loose-envify": { @@ -3912,15 +3321,6 @@ "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", "dev": true }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3937,9 +3337,9 @@ } }, "marked": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.1.tgz", - "integrity": "sha512-+H0L3ibcWhAZE02SKMqmvYsErLo4EAVJxu5h3bHBBDvvjeWXtl92rGUSBYHL2++5Y+RSNgl8dYOAXcYe7lp1fA==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.1.1.tgz", + "integrity": "sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw==" }, "md5.js": { "version": "1.3.5", @@ -3948,19 +3348,8 @@ "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", - "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "memory-fs": { @@ -4015,23 +3404,19 @@ "version": "1.38.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true + "dev": true, + "optional": 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, + "optional": true, "requires": { "mime-db": "~1.38.0" } }, - "mimic-fn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", - "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==", - "dev": true - }, "mini-css-extract-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", @@ -4065,9 +3450,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mississippi": { @@ -4089,9 +3474,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -4110,20 +3495,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -4146,13 +3523,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -4247,21 +3617,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "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" - } - }, - "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.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", @@ -4269,12 +3624,6 @@ "dev": true, "optional": 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", @@ -4355,35 +3704,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "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-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", - "dev": true - }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -4402,12 +3722,6 @@ "p-limit": "^2.0.0" } }, - "p-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", - "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", - "dev": true - }, "p-try": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.1.0.tgz", @@ -4421,12 +3735,12 @@ "dev": true }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } @@ -4476,7 +3790,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "dev": true, + "optional": true }, "path-exists": { "version": "3.0.0", @@ -4490,12 +3805,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -4528,27 +3837,19 @@ "dev": true, "optional": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -4795,14 +4096,13 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "regenerate": { @@ -4886,7 +4186,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "optional": true }, "repeat-element": { "version": "1.1.3", @@ -4938,9 +4239,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { @@ -4969,6 +4270,19 @@ "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } } }, "resolve-from": { @@ -4990,9 +4304,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -5036,7 +4350,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "optional": true }, "schema-utils": { "version": "1.0.0", @@ -5056,10 +4371,13 @@ "dev": true }, "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "set-blocking": { "version": "2.0.0", @@ -5068,9 +4386,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -5121,12 +4439,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, "simplemde": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/simplemde/-/simplemde-1.11.2.tgz", @@ -5295,9 +4607,9 @@ } }, "source-map-support": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", - "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5418,19 +4730,20 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "string_decoder": { @@ -5450,20 +4763,14 @@ "optional": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } }, - "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 - }, "style-loader": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", @@ -5490,14 +4797,14 @@ "dev": true }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -5509,19 +4816,20 @@ } }, "terser-webpack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", - "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", "dev": true, "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { "source-map": { @@ -5529,6 +4837,16 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } } } }, @@ -5656,7 +4974,8 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "dev": true, + "optional": true }, "typedarray": { "version": "0.0.6", @@ -5698,38 +5017,15 @@ "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "uniq": { @@ -5748,9 +5044,9 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -5803,10 +5099,11 @@ } }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true }, "uri-js": { "version": "4.2.2", @@ -5879,9 +5176,9 @@ "optional": true }, "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "verror": { @@ -5915,14 +5212,130 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } } }, "webpack": { @@ -5958,22 +5371,80 @@ } }, "webpack-cli": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.0.tgz", - "integrity": "sha512-t1M7G4z5FhHKJ92WRKwZ1rtvi7rHc0NZoZRbSkol0YKl4HvcC8+DsmGDmK7MmZxHSAetHagiOsjOB6MmzC2TUw==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "webpack-manifest-plugin": { @@ -6021,59 +5492,23 @@ "dev": true }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "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 - }, - "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" - } - }, - "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" - } - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { @@ -6095,35 +5530,33 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", From 159d934ff7886ab33cd72e89f6e1cf0f26fe9999 Mon Sep 17 00:00:00 2001 From: Suyash Garg Date: Sun, 5 Jan 2020 18:39:04 +0100 Subject: [PATCH 114/159] Upgrade to python 3.8 - Updated version of flake8 - Disabled toplevel import check for new pylint - Not using assignment with operator as pylint reports error (open issue) - Refactored assignment in views/review.py for not using same variable assignment - Add fix due to change in Enum class --- critiquebrainz/db/moderation_log.py | 6 +++++- critiquebrainz/frontend/views/__init__.py | 1 + critiquebrainz/frontend/views/review.py | 9 ++++----- docker/Dockerfile.dev | 2 +- docker/Dockerfile.test | 2 +- docker/Dockerfile.test.pylint | 2 +- manage.py | 2 +- pylintrc | 2 +- requirements.txt | 6 +++--- 9 files changed, 18 insertions(+), 14 deletions(-) diff --git a/critiquebrainz/db/moderation_log.py b/critiquebrainz/db/moderation_log.py index 80465a1b5..9d920b11f 100644 --- a/critiquebrainz/db/moderation_log.py +++ b/critiquebrainz/db/moderation_log.py @@ -16,6 +16,10 @@ class AdminActions(Enum): ACTION_BLOCK_USER = "block_user" ACTION_UNBLOCK_USER = "unblock_user" + @classmethod + def get_all_actions(cls): + return list(cls) + def create(*, admin_id, review_id=None, user_id=None, action, reason): @@ -30,7 +34,7 @@ def create(*, admin_id, review_id=None, user_id=None, """ if not review_id and not user_id: raise ValueError("No review ID or user ID specified.") - if action not in AdminActions: + if action not in AdminActions.get_all_actions(): raise ValueError("Please specify a valid action.") with db.engine.connect() as connection: connection.execute(sqlalchemy.text(""" diff --git a/critiquebrainz/frontend/views/__init__.py b/critiquebrainz/frontend/views/__init__.py index 4cb25e17f..017f648da 100644 --- a/critiquebrainz/frontend/views/__init__.py +++ b/critiquebrainz/frontend/views/__init__.py @@ -7,6 +7,7 @@ BROWSE_RELEASE_GROUPS_LIMIT = 20 BROWSE_RECORDING_LIMIT = 10 + def get_avg_rating(entity_id, entity_type): """Retrieve average rating""" try: diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index e0fafe460..ebea978b4 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -206,11 +206,10 @@ def revisions_more(id): @review_bp.route('/write', methods=('GET', 'POST')) @login_required def create(): - entity_id, entity_type = None, None - for entity_type in ENTITY_TYPES: - entity_id = request.args.get(entity_type) - if entity_id: - entity_type = entity_type + entity_type = None + for supported_type in ENTITY_TYPES: + if entity_id := request.args.get(supported_type): + entity_type = supported_type break if not (entity_id or entity_type): diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 8f5261f99..d5f112b9e 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM metabrainz/python:3.7 +FROM metabrainz/python:3.8 RUN apt-get update \ && apt-get install -y --no-install-recommends \ diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index ef1928203..348be8801 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -1,4 +1,4 @@ -FROM metabrainz/python:3.7 +FROM metabrainz/python:3.8 ENV DOCKERIZE_VERSION v0.2.0 RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ diff --git a/docker/Dockerfile.test.pylint b/docker/Dockerfile.test.pylint index f89a5d2c8..d5d76a690 100644 --- a/docker/Dockerfile.test.pylint +++ b/docker/Dockerfile.test.pylint @@ -1,4 +1,4 @@ -FROM metabrainz/python:3.7 +FROM metabrainz/python:3.8 RUN mkdir /data RUN mkdir /code diff --git a/manage.py b/manage.py index c58a1e587..a824d4042 100644 --- a/manage.py +++ b/manage.py @@ -1,7 +1,7 @@ import os import subprocess from werkzeug.serving import run_simple -from werkzeug.wsgi import DispatcherMiddleware +from werkzeug.middleware.dispatcher import DispatcherMiddleware from brainzutils import cache import click from critiquebrainz import frontend, ws diff --git a/pylintrc b/pylintrc index 20a9cdb76..7313b7286 100644 --- a/pylintrc +++ b/pylintrc @@ -9,7 +9,7 @@ # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" -disable=missing-docstring,protected-access,invalid-name,global-statement,fixme,too-many-locals,redefined-builtin,broad-except,line-too-long,too-many-arguments,too-many-instance-attributes,redefined-outer-name,attribute-defined-outside-init,anomalous-backslash-in-string,too-many-statements,too-few-public-methods,redefined-argument-from-local,too-many-return-statements,too-many-function-args,redefined-argument-from-local,too-many-public-methods,inconsistent-return-statements, keyword-arg-before-vararg, no-member +disable=missing-docstring,protected-access,invalid-name,global-statement,fixme,too-many-locals,redefined-builtin,broad-except,line-too-long,too-many-arguments,too-many-instance-attributes,redefined-outer-name,attribute-defined-outside-init,anomalous-backslash-in-string,too-many-statements,too-few-public-methods,redefined-argument-from-local,too-many-return-statements,too-many-function-args,redefined-argument-from-local,too-many-public-methods,inconsistent-return-statements, keyword-arg-before-vararg, no-member, import-outside-toplevel [REPORTS] diff --git a/requirements.txt b/requirements.txt index be4412ecc..4636a35f4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -git+https://github.com/metabrainz/brainzutils-python.git@v1.13.0 +git+https://github.com/metabrainz/brainzutils-python.git@v1.14.0 beautifulsoup4==4.8.0 coverage==4.4.1 click==6.7 @@ -11,8 +11,8 @@ Markdown==3.1.1 musicbrainzngs==0.6 pytest==3.2.0 pytest-cov==2.5.1 -pylint==2.3.0 -flake8==3.7.7 +pylint==2.4.4 +flake8==3.8.3 psycopg2==2.8.3 pycountry==1.20 python-dateutil==2.6.1 From b63e49a765bf1e62f97c87857f1e8a3887c8b51d Mon Sep 17 00:00:00 2001 From: Robert Kaye Date: Sun, 17 May 2020 15:09:28 +0200 Subject: [PATCH 115/159] Upgrade pg --- docker/pg_custom/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/pg_custom/Dockerfile b/docker/pg_custom/Dockerfile index 522e3a90f..8d316f3a8 100644 --- a/docker/pg_custom/Dockerfile +++ b/docker/pg_custom/Dockerfile @@ -1,3 +1,3 @@ -FROM postgres:9.5.4 +FROM postgres:12.3 ADD create_extensions.sql /docker-entrypoint-initdb.d/ From 785d2d7e4fbc62f1f8224098743ea4fbf20b3861 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:23:59 +0200 Subject: [PATCH 116/159] Use python 3.8 in production image --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1df42631b..e730a58e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM metabrainz/python:3.7 +FROM metabrainz/python:3.8 ARG DEPLOY_ENV From 4d322436b71ea713992dac2fa2d9ed9724146434 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:26:02 +0200 Subject: [PATCH 117/159] Install postgres 12 client where needed, and don't install where not --- Dockerfile | 2 +- docker/Dockerfile.dev | 10 ---------- docker/Dockerfile.test | 9 --------- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index e730a58e6..a59439aa4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN apt-get update \ # PostgreSQL client RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 -ENV PG_MAJOR 9.5 +ENV PG_MAJOR 12 RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list RUN apt-get update \ && apt-get install -y postgresql-client-$PG_MAJOR \ diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index d5f112b9e..fd31b14aa 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -13,16 +13,6 @@ RUN apt-get update \ libxslt1-dev \ && rm -rf /var/lib/apt/lists/* -# PostgreSQL client -RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 -ENV PG_MAJOR 9.5 -RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list -RUN apt-get update \ - && apt-get install -y postgresql-client-$PG_MAJOR \ - && rm -rf /var/lib/apt/lists/* -# Specifying password so that client doesn't ask scripts for it... -ENV PGPASSWORD "critiquebrainz" - # Node RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - RUN apt-get install -y nodejs diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 348be8801..2ef5df031 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -21,15 +21,6 @@ RUN apt-get update \ libxslt1-dev \ && rm -rf /var/lib/apt/lists/* -# PostgreSQL client -RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 -ENV PG_MAJOR 9.5 -RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list -RUN apt-get update \ - && apt-get install -y postgresql-client-$PG_MAJOR \ - && rm -rf /var/lib/apt/lists/* -ENV PGPASSWORD "critiquebrainz" - COPY requirements.txt /code/ RUN pip install -r requirements.txt From 8700e99d4bf2b5eab7307cb2f92f5345c30bb22f Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:26:56 +0200 Subject: [PATCH 118/159] Use node 12 --- Dockerfile | 5 +++-- Dockerfile.webpack | 3 +-- docker/Dockerfile.dev | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index a59439aa4..2c1be672a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,8 +27,9 @@ RUN apt-get update \ ENV PGPASSWORD "critiquebrainz" # Node -RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - -RUN apt-get install -y nodejs +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \ + && apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* RUN pip install uWSGI==2.0.18 diff --git a/Dockerfile.webpack b/Dockerfile.webpack index 2dbefb0e8..0daafd3c9 100644 --- a/Dockerfile.webpack +++ b/Dockerfile.webpack @@ -1,8 +1,7 @@ -FROM node:10.15-alpine +FROM node:12 RUN mkdir /code WORKDIR /code COPY package.json package-lock.json webpack.config.js /code/ RUN npm install - diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index fd31b14aa..9e6f6a1e3 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -14,8 +14,9 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* # Node -RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - -RUN apt-get install -y nodejs +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \ + && apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* RUN mkdir /code WORKDIR /code From 1a6353e8d9050a75ea6b938ed7c082f067096fbd Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:27:16 +0200 Subject: [PATCH 119/159] Use pip --no-cache-dir to reduce layer sizes --- Dockerfile | 6 +++--- docker/Dockerfile.dev | 2 +- docker/Dockerfile.test | 4 ++-- docker/Dockerfile.test.pylint | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2c1be672a..94b0c0640 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,17 +31,17 @@ RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* -RUN pip install uWSGI==2.0.18 +RUN pip install --no-cache-dir uWSGI==2.0.18 RUN mkdir /code WORKDIR /code # Python dependencies COPY ./requirements.txt /code/ -RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt # Node dependencies -COPY ./package.json /code/ +COPY ./package.json ./package-lock.json /code/ RUN npm install COPY . /code/ diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 9e6f6a1e3..b4f551ce0 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -23,7 +23,7 @@ WORKDIR /code # Python dependencies COPY requirements.txt /code/ -RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt COPY . /code/ diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 2ef5df031..7e092bb57 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -1,6 +1,6 @@ FROM metabrainz/python:3.8 -ENV DOCKERIZE_VERSION v0.2.0 +ENV DOCKERIZE_VERSION v0.6.1 RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz @@ -22,7 +22,7 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt /code/ -RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt COPY . /code/ diff --git a/docker/Dockerfile.test.pylint b/docker/Dockerfile.test.pylint index d5d76a690..64feef735 100644 --- a/docker/Dockerfile.test.pylint +++ b/docker/Dockerfile.test.pylint @@ -18,7 +18,7 @@ RUN apt-get update \ libxslt1-dev \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt /code/ -RUN pip install -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt COPY . /code/ From 020f5dbb8ab4d89d49253b0e7d4f64f71e1d242e Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:27:50 +0200 Subject: [PATCH 120/159] Remove unused db_test container --- docker/docker-compose.dev.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 81f1e0eb2..d6a28902a 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -13,16 +13,6 @@ services: ports: - "15432:5432" - db_test: - build: - context: ./pg_custom/ - dockerfile: Dockerfile - command: postgres -F - environment: - POSTGRES_USER: critiquebrainz - POSTGRES_PASSWORD: critiquebrainz - POSTGRES_DB: critiquebrainz - critiquebrainz: build: context: .. @@ -34,7 +24,6 @@ services: - "80:80" depends_on: - db - - db_test - critiquebrainz_redis - musicbrainz_db - static_builder From 8758cd50b2243fbc83eab5dfc43cdf1e501e8155 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:54:06 +0200 Subject: [PATCH 121/159] Add missing popper.js accidentally removed in b35b7e1bd7 --- package-lock.json | 5 +++++ package.json | 1 + 2 files changed, 6 insertions(+) diff --git a/package-lock.json b/package-lock.json index 78dc20c25..189dc8a6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3859,6 +3859,11 @@ "find-up": "^3.0.0" } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", diff --git a/package.json b/package.json index db0fb9eb9..e1c1718ac 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "bootstrap": "4.3.1", "bootstrap-rating-input": "0.4.0", "jquery": "3.5.1", + "popper.js": "^1.14.1", "leaflet": "1.1.0", "path": "0.12.7", "simplemde": "^1.11.2" From 4f24470899ceab1312f7b9fc802bca2c75c4cdec Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Mon, 3 Aug 2020 18:55:04 +0200 Subject: [PATCH 122/159] CB-370: Use docker volumes for postgres initdb scripts Instead of having to build a separate image --- docker/common.yml | 20 -------------------- docker/docker-compose.dev.yml | 12 +++++++----- docker/docker-compose.test.yml | 6 +++--- docker/pg_custom/Dockerfile | 3 --- 4 files changed, 10 insertions(+), 31 deletions(-) delete mode 100644 docker/common.yml delete mode 100644 docker/pg_custom/Dockerfile diff --git a/docker/common.yml b/docker/common.yml deleted file mode 100644 index 6f4604d7d..000000000 --- a/docker/common.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Docker Compose file with common services -# See https://docs.docker.com/compose/extends/#extending-services -version: "2" -services: - - db: - build: - context: ./pg_custom/ - dockerfile: Dockerfile - environment: - POSTGRES_USER: critiquebrainz - POSTGRES_PASSWORD: critiquebrainz - POSTGRES_DB: critiquebrainz - - nginx: - build: - context: ./nginx_custom/ - dockerfile: Dockerfile - ports: - - "80:80" diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index d6a28902a..ffafb768c 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -3,13 +3,15 @@ version: "2" services: db: - extends: - file: ./common.yml - service: db - volumes: - - ../data/pgdata:/var/lib/postgresql/data/pgdata:z + image: postgres:12.3 environment: + POSTGRES_USER: critiquebrainz + POSTGRES_PASSWORD: critiquebrainz + POSTGRES_DB: critiquebrainz PGDATA: /var/lib/postgresql/data/pgdata + volumes: + - ../data/pgdata:/var/lib/postgresql/data/pgdata:z + - ./pg_custom:/docker-entrypoint-initdb.d/ ports: - "15432:5432" diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 996525404..d5975c773 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -3,14 +3,14 @@ version: "2" services: db_test: - build: - context: ./pg_custom/ - dockerfile: Dockerfile + image: postgres:12.3 environment: POSTGRES_USER: critiquebrainz POSTGRES_PASSWORD: critiquebrainz POSTGRES_DB: critiquebrainz command: postgres -F + volumes: + - ./pg_custom:/docker-entrypoint-initdb.d/ network_mode: bridge musicbrainz_db: diff --git a/docker/pg_custom/Dockerfile b/docker/pg_custom/Dockerfile deleted file mode 100644 index 8d316f3a8..000000000 --- a/docker/pg_custom/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM postgres:12.3 - -ADD create_extensions.sql /docker-entrypoint-initdb.d/ From 42850478f57bee87a76822a41697a086bff9cea4 Mon Sep 17 00:00:00 2001 From: Suyash Garg Date: Mon, 3 Aug 2020 19:49:06 +0200 Subject: [PATCH 123/159] Add postgresql-client for Dockerfile.test --- docker/Dockerfile.test | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index 7e092bb57..f196ce1dc 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -21,6 +21,15 @@ RUN apt-get update \ libxslt1-dev \ && rm -rf /var/lib/apt/lists/* + +# PostgreSQL client +RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 +ENV PG_MAJOR 12 +RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list +RUN apt-get update \ + && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ + && rm -rf /var/lib/apt/lists/* + COPY requirements.txt /code/ RUN pip install --no-cache-dir -r requirements.txt From 76872837a9eb6b600d1e9f139741719fae4d8d24 Mon Sep 17 00:00:00 2001 From: Suyash Garg Date: Mon, 3 Aug 2020 21:06:21 +0200 Subject: [PATCH 124/159] Add password for test container --- docker/Dockerfile.test | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index f196ce1dc..cd65e635a 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -30,6 +30,9 @@ RUN apt-get update \ && apt-get install -y --no-install-recommends postgresql-client-$PG_MAJOR \ && rm -rf /var/lib/apt/lists/* +# Specifying password so that client doesn't ask scripts for it... +ENV PGPASSWORD "critiquebrainz" + COPY requirements.txt /code/ RUN pip install --no-cache-dir -r requirements.txt From cd0bd4c4fad69e41077bb32eea5fc5287ca45a51 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Fri, 31 Jul 2020 19:47:28 +0200 Subject: [PATCH 125/159] Add develop.sh script to make starting docker-compose easier --- develop.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 develop.sh diff --git a/develop.sh b/develop.sh new file mode 100755 index 000000000..f843ee288 --- /dev/null +++ b/develop.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +POSTGRES_CB_URI="postgresql://critiquebrainz:critiquebrainz@db/critiquebrainz" + +if [[ ! -d "docker" ]]; then + echo "This script must be run from the top level directory of the critiquebrainz source." + exit -1 +fi + +function invoke_docker_compose { + exec docker-compose -f docker/docker-compose.dev.yml \ + -p critiquebrainz \ + "$@" +} + +function invoke_docker_compose_test { + exec docker-compose -f docker/docker-compose.test.yml \ + -p critiquebrainz_test \ + "$@" +} + +function invoke_manage { + invoke_docker_compose run --rm critiquebrainz \ + python3 manage.py \ + "$@" +} + +function open_psql_shell { + invoke_docker_compose run --rm critiquebrainz psql \ + ${POSTGRES_CB_URI} +} + +# Arguments following "manage" are passed to manage.py inside a new web container. +if [[ "$1" == "manage" ]]; then shift + echo "Running manage.py..." + invoke_manage "$@" +elif [[ "$1" == "bash" ]]; then + echo "Running bash..." + invoke_docker_compose run --rm critiquebrainz bash +elif [[ "$1" == "shell" ]]; then + echo "Running flask shell..." + invoke_docker_compose run --rm critiquebrainz flask shell +elif [[ "$1" == "psql" ]]; then + echo "Connecting to postgresql..." + open_psql_shell +elif [[ "$1" == "test" ]]; then shift + echo "Running docker-compose test..." + invoke_docker_compose_test "$@" +else + echo "Running docker-compose with the given command..." + invoke_docker_compose "$@" +fi From e14fc4d565642e1c554e8cf0a78f7f1f148adaab Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Fri, 31 Jul 2020 19:48:45 +0200 Subject: [PATCH 126/159] Use Trust auth in postgres image --- docker/docker-compose.dev.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index ffafb768c..02da68d43 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -22,6 +22,9 @@ services: volumes: - ../:/code:z - ../data/app:/data:z + environment: + FLASK_APP: critiquebrainz.frontend + FLASK_ENV: development ports: - "80:80" depends_on: @@ -40,6 +43,7 @@ services: environment: PGDATA: /var/lib/postgresql/data/pgdata MB_IMPORT_DUMPS: "true" + POSTGRES_HOST_AUTH_METHOD: "trust" ports: - "5430:5432" From 47e60f2e0c7095afcf00dc8bd2041826f49bf07f Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Fri, 31 Jul 2020 19:49:18 +0200 Subject: [PATCH 127/159] Update documentation to use develop.sh and clarify some steps --- README.md | 5 ++--- docs/intro.rst | 60 +++++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 72bde5d2f..b2b013bad 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,11 @@ CritiqueBrainz is a repository for Creative Commons licensed reviews. ## Documentation -**Documentation is available at https://critiquebrainz.readthedocs.org/.** +Documentation is available at https://critiquebrainz.readthedocs.io/. ### Building documentation -In case you want to build documentation yourself follow the following steps -*(make sure that you use Python 3)*: +If you want to build documentation yourself, follow these steps using python 3 $ cd ./docs $ pip3 install -r requirements.txt diff --git a/docs/intro.rst b/docs/intro.rst index 71f0bca93..f84c1876e 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -58,37 +58,41 @@ fields ``SPOTIFY_CLIENT_ID`` and ``SPOTIFY_CLIENT_SECRET`` respectively. Startup ^^^^^^^ -Then you can build all the services:: - $ docker-compose -f docker/docker-compose.dev.yml build +We provide a helper tool, ``develop.sh`` to wrap docker-compose and to provide some shortcuts to +common tasks. -MusicBrainz database containing all the MusicBrainz metadata is needed for -setting up your application. The ``mbdump.tar.bz2`` is the core MusicBrainz -archive which includes the tables for artist, release_group etc. +Build all CritiqueBrainz services with:: + + $ ./develop.sh build + +A MusicBrainz database is required for running CritiqueBrainz. +The ``mbdump.tar.bz2`` is the core MusicBrainz archive which includes the tables for artist, +release_group etc. The ``mbdump-derived.tar.bz2`` archive contains annotations, user tags and search indexes. These archives include all the data required for setting up an instance of CritiqueBrainz. -One can import the database dump by downloading and importing the data in +You can import the database dump by downloading and importing the data in a single command:: - $ docker-compose -f docker/docker-compose.dev.yml run musicbrainz_db + $ ./develop.sh run --rm musicbrainz_db .. note:: - One can also manually download the dumps and then import it:- + You can also manually download the dumps and then import it:- i. For this, you have to download the dumps ``mbdump.tar.bz2`` and ``mbdump-derived.tar.bz2`` from http://ftp.musicbrainz.org/pub/musicbrainz/data/fullexport/. .. warning:: - Make sure to get the latest dumps + Make sure that you get the latest dumps - ii. Then the environment variable ``DUMPS_DIR`` must be set to the path of the - folders containing the dumps. This can be done by:: + ii. Set the environment variable ``DUMPS_DIR`` to the path of the + folders containing the dumps. For example:: - $ export DUMPS_DIR="Path of the folder containing the dumps" + $ export DUMPS_DIR="/home/me/folder/with/dumps" You can check that the variable ``DUMPS_DIR`` has been succesfully assigned or not by:: @@ -99,7 +103,7 @@ a single command:: iii. Then import the database dumps by this command:: - $ docker-compose -f docker/docker-compose.dev.yml run -v $DUMPS_DIR:/home/musicbrainz/dumps \ + $ ./develop.sh run --rm -v $DUMPS_DIR:/home/musicbrainz/dumps \ -v $PWD/data/mbdata:/var/lib/postgresql/data/pgdata musicbrainz_db .. note:: @@ -118,32 +122,34 @@ a single command:: the ``data/mbdata`` directory by accident. Also make sure that you have about 25GB of free space to keep the MusicBrainz data. -Initialization of CritiqueBrainz database is also required:: +Next, initialize the CritiqueBrainz database:: - $ docker-compose -f docker/docker-compose.dev.yml run critiquebrainz python3 \ - manage.py init_db --skip-create-db + $ ./develop.sh run --rm critiquebrainz python3 manage.py init_db --skip-create-db -You will also need to run a command to build the static assets (javascript and css files) for the first run:: +You will also need to run some commands to build the static assets (javascript and css files) for the first run:: - $ docker-compose -f docker/docker-compose.dev.yml run --rm static_builder npm run pre-dev + $ ./develop.sh run --rm static_builder npm install + $ ./develop.sh run --rm static_builder npm run pre-dev Then you can start all the services:: - $ docker-compose -f docker/docker-compose.dev.yml up -d + $ ./develop.sh up + +Visit CritiqueBrainz at ``http://localhost`` in your browser. Importing data dump ''''''''''''''''''' We provide daily data dumps from https://critiquebrainz.org that include reviews and most of the data associated with them. If you want to import that into your -own installation, download archives from ftp://ftp.musicbrainz.org/pub/musicbrainz/critiquebrainz/dump/ -(you'll need to get the base archive ``cbdump.tar.bz2`` and one with reviews) -and use ``python3 manage.py export importer`` command. First you need to import -base archive and then one that contains reviews. For example:: +own installation, download the archives from ftp://ftp.musicbrainz.org/pub/musicbrainz/critiquebrainz/dump/ +(you'll need to get the base archive ``cbdump.tar.bz2`` and the reviews ``cbdump-reviews-all.tar.bz2``) +and use ``python3 manage.py dump import`` command. First you need to import +base archive and then the one that contains reviews. For example:: - $ docker-compose -f docker/docker-compose.dev.yml run critiquebrainz python3 manage.py dump import cbdump.tar.bz2 - $ docker-compose -f docker/docker-compose.dev.yml run critiquebrainz python3 manage.py dump import cbdump-reviews-all.tar.bz2 + $ ./develop.sh run --rm critiquebrainz python3 manage.py dump import cbdump.tar.bz2 + $ ./develop.sh run --rm critiquebrainz python3 manage.py dump import cbdump-reviews-all.tar.bz2 Keep in mind that CritiqueBrainz only supports importing into an empty database. This should work if you just ran ``init_db`` command. @@ -152,9 +158,9 @@ This should work if you just ran ``init_db`` command. Testing ------- -Alternative way to test the web server is to use a Docker container:: +To test the web server run:: - $ docker-compose -f docker/docker-compose.test.yml up --build + $ ./develop.sh test up --build Modifying strings ----------------- From 2e11b01d462cd267869d03bb97e79e28aeacb1dc Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Tue, 4 Aug 2020 13:48:57 +0200 Subject: [PATCH 128/159] CB-281: Add test.sh --- docker/docker-compose.test.yml | 3 +- test.sh | 132 +++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 1 deletion(-) create mode 100755 test.sh diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index d5975c773..3c6ff2a7e 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -14,9 +14,10 @@ services: network_mode: bridge musicbrainz_db: - image: ferbncode/musicbrainz-test-database:latest + image: metabrainz/musicbrainz-test-database:beta environment: PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_HOST_AUTH_METHOD: trust ports: - "5430:5432" network_mode: bridge diff --git a/test.sh b/test.sh new file mode 100755 index 000000000..376a2cd38 --- /dev/null +++ b/test.sh @@ -0,0 +1,132 @@ +#!/bin/bash + +# UNIT TESTS +# ./test.sh build unit test containers, bring up, make database, test, bring down +# for development: +# ./test.sh -u build unit test containers, bring up background and load database if needed +# ./test.sh -b build unit test containers +# ./test.sh [params] run unit tests, passing optional params to inner test +# ./test.sh -s stop unit test containers without removing +# ./test.sh -d stop unit test containers and remove them + +COMPOSE_FILE_LOC=docker/docker-compose.test.yml +COMPOSE_PROJECT_NAME_ORIGINAL=critiquebrainz_test +# Project name is sanitized by Compose, so we need to do the same thing. +# See https://github.com/docker/compose/issues/2119. +COMPOSE_PROJECT_NAME=$(echo ${COMPOSE_PROJECT_NAME_ORIGINAL} | awk '{print tolower($0)}' | sed 's/[^a-z0-9]*//g') + +if [[ ! -d "docker" ]]; then + echo "This script must be run from the top level directory of the critiquebrainz-server source." + exit -1 +fi + +function build_containers { + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + build critiquebrainz_test +} + +function bring_up_db { + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + up -d db_test musicbrainz_db critiquebrainz_redis +} + +function setup { + echo "Running setup" + # PostgreSQL Database initialization + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + run --rm critiquebrainz_test dockerize \ + -wait tcp://db_test:5432 -timeout 60s \ + bash -c "python3 manage.py init_db --skip-create-db --test-db" +} + +function is_db_running { + # Check if the database container is running + containername="${COMPOSE_PROJECT_NAME}_db_test_1" + res=`docker ps --filter "name=$containername" --filter "status=running" -q` + if [[ -n "$res" ]]; then + return 0 + else + return 1 + fi +} + +function is_db_exists { + containername="${COMPOSE_PROJECT_NAME}_db_test_1" + res=`docker ps --filter "name=$containername" --filter "status=exited" -q` + if [[ -n "$res" ]]; then + return 0 + else + return 1 + fi +} + +function dc_stop { + # Stopping all unit test containers associated with this project + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + stop +} + +function dc_down { + # Shutting down all unit test containers associated with this project + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + down +} + + + +if [[ "$1" == "-s" ]]; then + echo "Stopping unit test containers" + dc_stop + exit 0 +fi + +if [[ "$1" == "-d" ]]; then + echo "Running docker-compose down" + dc_down + exit 0 +fi + +# if -u flag, bring up db, run setup, quit +if [[ "$1" == "-u" ]]; then + is_db_exists + DB_EXISTS=$? + is_db_running + DB_RUNNING=$? + if [[ ${DB_EXISTS} -eq 0 || ${DB_RUNNING} -eq 0 ]]; then + echo "Database is already up, doing nothing" + else + echo "Building containers" + build_containers + echo "Bringing up DB" + bring_up_db + setup + fi + exit 0 +fi + +is_db_exists +DB_EXISTS=$? +is_db_running +DB_RUNNING=$? +if [[ ${DB_EXISTS} -eq 1 && ${DB_RUNNING} -eq 1 ]]; then + # If no containers, build them, run setup then run tests, then bring down + build_containers + bring_up_db + setup + echo "Running tests" + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + run --rm critiquebrainz_test pytest "$@" + dc_down +else + # Else, we have containers, just run tests + echo "Running tests" + docker-compose -f ${COMPOSE_FILE_LOC} \ + -p ${COMPOSE_PROJECT_NAME} \ + run --rm critiquebrainz_test pytest "$@" +fi From 397aede81af96b847dfaae50cd01cab078071068 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Tue, 4 Aug 2020 14:23:19 +0200 Subject: [PATCH 129/159] Add volume to store root's home directory to save history --- docker/docker-compose.dev.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 02da68d43..a35e2ab82 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -1,5 +1,9 @@ # Docker Compose file for development version: "2" + +volumes: + cb_home: + services: db: @@ -22,6 +26,7 @@ services: volumes: - ../:/code:z - ../data/app:/data:z + - cb_home:/root environment: FLASK_APP: critiquebrainz.frontend FLASK_ENV: development From 46d827c6e27f866145276cf22a72f01d74bf5b4b Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Wed, 26 Aug 2020 16:51:03 +0200 Subject: [PATCH 130/159] Remove access_type arg from, which isn't documented or implemented --- docs/api/oauth2.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/api/oauth2.rst b/docs/api/oauth2.rst index 630fed6ab..2a5acceec 100644 --- a/docs/api/oauth2.rst +++ b/docs/api/oauth2.rst @@ -50,7 +50,6 @@ HTTP connections are refused. scope=review,vote& redirect_uri=http%3A%2F%2Fwww.example.com.com%2Fcallback& client_id=yDDvwAzPUnoD8imvTpVm& - access_type=offline Handling server response ^^^^^^^^^^^^^^^^^^^^^^^^ From ac2c89b12f0b0c11f0485c25f6cf7aaf15b6dcba Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Wed, 26 Aug 2020 16:53:19 +0200 Subject: [PATCH 131/159] Make labels on album image always appear above the cover art --- critiquebrainz/frontend/static/styles/main.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/critiquebrainz/frontend/static/styles/main.less b/critiquebrainz/frontend/static/styles/main.less index 610511404..9c5477637 100644 --- a/critiquebrainz/frontend/static/styles/main.less +++ b/critiquebrainz/frontend/static/styles/main.less @@ -279,6 +279,7 @@ ul.sharing { } img { + z-index: 0; display: block; margin-left: auto; margin-right: auto; @@ -294,10 +295,12 @@ ul.sharing { font-weight: bold; font-size: small; color: #fff; + z-index: 2; } .caption { .release-group-title { + z-index: 2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; From fbabbb8a2ed92ca70e4d3e122cdf4330afbf9d9c Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Wed, 26 Aug 2020 17:04:55 +0200 Subject: [PATCH 132/159] Use a git revision of bootstrap-rating-input for jquery compatibility --- package-lock.json | 5 ++--- package.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 189dc8a6f..78f8d23ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1236,9 +1236,8 @@ "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" }, "bootstrap-rating-input": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/bootstrap-rating-input/-/bootstrap-rating-input-0.4.0.tgz", - "integrity": "sha1-w59inwBH7TU8hyrlYaVmerX3unQ=" + "version": "github:javiertoledo/bootstrap-rating-input#0a4ebb7df3c3c1f70165d8c3e138fb8598c49352", + "from": "github:javiertoledo/bootstrap-rating-input#0a4ebb7d" }, "brace-expansion": { "version": "1.1.11", diff --git a/package.json b/package.json index e1c1718ac..46ec20527 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "bootstrap": "4.3.1", - "bootstrap-rating-input": "0.4.0", + "bootstrap-rating-input": "javiertoledo/bootstrap-rating-input#0a4ebb7d", "jquery": "3.5.1", "popper.js": "^1.14.1", "leaflet": "1.1.0", From 44486f075096b64899eb0ff5991aaba40c13abec Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Tue, 8 Sep 2020 08:25:52 +0530 Subject: [PATCH 133/159] Fix unsupported entity type error Do not raise BadRequest if both entity_id and entity_type are missing --- critiquebrainz/frontend/views/review.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index ebea978b4..36bd00723 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -212,10 +212,6 @@ def create(): entity_type = supported_type break - if not (entity_id or entity_type): - logging.warning("Unsupported entity type") - raise BadRequest("Unsupported entity type") - if not entity_id: flash.info(gettext("Please choose an entity to review.")) return redirect(url_for('search.selector', next=url_for('.create'))) From 82c4d484154c5c6cb7593d7ccde3b3277e76c191 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Tue, 8 Sep 2020 10:03:20 +0530 Subject: [PATCH 134/159] Fix incorrect request argument --- critiquebrainz/frontend/templates/search/selector_results.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/critiquebrainz/frontend/templates/search/selector_results.html b/critiquebrainz/frontend/templates/search/selector_results.html index c16dd533a..a399bd690 100644 --- a/critiquebrainz/frontend/templates/search/selector_results.html +++ b/critiquebrainz/frontend/templates/search/selector_results.html @@ -114,7 +114,7 @@ {% endif %} - + From c046700832a9756eac5da5c20507bb35d61a1c3b Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 11 Sep 2020 16:13:13 +0530 Subject: [PATCH 135/159] Modify create review endpoint --- .../frontend/templates/artist/entity.html | 2 +- .../frontend/templates/event/entity.html | 2 +- .../frontend/templates/label/entity.html | 2 +- .../frontend/templates/place/entity.html | 2 +- .../templates/release_group/entity.html | 2 +- .../frontend/templates/work/entity.html | 2 +- critiquebrainz/frontend/views/review.py | 18 +++++++----------- .../frontend/views/test/test_review.py | 17 +++++++++++------ 8 files changed, 24 insertions(+), 23 deletions(-) diff --git a/critiquebrainz/frontend/templates/artist/entity.html b/critiquebrainz/frontend/templates/artist/entity.html index 67513fda1..5586a3e34 100644 --- a/critiquebrainz/frontend/templates/artist/entity.html +++ b/critiquebrainz/frontend/templates/artist/entity.html @@ -48,7 +48,7 @@

          {% if not my_review %} - {{ _('Write a review') }} diff --git a/critiquebrainz/frontend/templates/event/entity.html b/critiquebrainz/frontend/templates/event/entity.html index 34e5a43c5..862703d7c 100644 --- a/critiquebrainz/frontend/templates/event/entity.html +++ b/critiquebrainz/frontend/templates/event/entity.html @@ -15,7 +15,7 @@

          {% if not my_review %} - {{ _('Write a review') }} diff --git a/critiquebrainz/frontend/templates/label/entity.html b/critiquebrainz/frontend/templates/label/entity.html index 17ff6fbfc..34b8d3a5e 100644 --- a/critiquebrainz/frontend/templates/label/entity.html +++ b/critiquebrainz/frontend/templates/label/entity.html @@ -13,7 +13,7 @@

          {% if not my_review %} - {{ _('Write a review') }} diff --git a/critiquebrainz/frontend/templates/place/entity.html b/critiquebrainz/frontend/templates/place/entity.html index dd51e7996..199514d05 100644 --- a/critiquebrainz/frontend/templates/place/entity.html +++ b/critiquebrainz/frontend/templates/place/entity.html @@ -15,7 +15,7 @@

          {% if not my_review %} - {{ _('Write a review') }} diff --git a/critiquebrainz/frontend/templates/release_group/entity.html b/critiquebrainz/frontend/templates/release_group/entity.html index d4f3cb599..49cc7f1e7 100644 --- a/critiquebrainz/frontend/templates/release_group/entity.html +++ b/critiquebrainz/frontend/templates/release_group/entity.html @@ -29,7 +29,7 @@

          {% if not my_review %} - {{ _('Write a review') }} diff --git a/critiquebrainz/frontend/templates/work/entity.html b/critiquebrainz/frontend/templates/work/entity.html index 41b4c18d4..dbca0df0e 100644 --- a/critiquebrainz/frontend/templates/work/entity.html +++ b/critiquebrainz/frontend/templates/work/entity.html @@ -13,7 +13,7 @@

          {% if not my_review %} - {{ _('Write a review') }} diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index 36bd00723..0414791b2 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -201,21 +201,17 @@ def revisions_more(id): return jsonify(results=template, more=(count - offset - RESULTS_LIMIT) > 0) -# TODO(psolanki): Refactor this function to remove PyLint warning. -# pylint: disable=too-many-branches -@review_bp.route('/write', methods=('GET', 'POST')) +@review_bp.route('/write///', methods=('GET', 'POST')) +@review_bp.route('/write/') @login_required -def create(): - entity_type = None - for supported_type in ENTITY_TYPES: - if entity_id := request.args.get(supported_type): - entity_type = supported_type - break - - if not entity_id: +def create(entity_type=None, entity_id=None): + if not (entity_id or entity_type): flash.info(gettext("Please choose an entity to review.")) return redirect(url_for('search.selector', next=url_for('.create'))) + if entity_type not in ENTITY_TYPES: + raise BadRequest("Unsupported entity type") + if current_user.is_blocked: flash.error(gettext("You are not allowed to write new reviews because your " "account has been blocked by a moderator.")) diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index e4dd78c25..82c2bda05 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -108,7 +108,8 @@ def test_missing_review(self): # pylint: disable=unused-variable def test_create(self): data = dict( - release_group="6b3cd75d-7453-39f3-86c4-1441f360e121", + entity_id='6b3cd75d-7453-39f3-86c4-1441f360e121', + entity_type='release_group', state='draft', text=self.review_text, license_choice=self.license["id"], @@ -120,21 +121,25 @@ def test_create(self): # test for review limit exceeded message with patch.object(User, 'is_review_limit_exceeded') as mock_is_review_limit_exceeded: mock_is_review_limit_exceeded.return_value = True - response = self.client.post('/review/write', data=data, - query_string=data, follow_redirects=True) + response = self.client.post("/review/write/{}/{}".format(data["entity_type"], data["entity_id"]), + data=data, query_string=data, follow_redirects=True) self.assertIn("You have exceeded your limit of reviews per day.", str(response.data)) # test create review when review limit is not exceeded - response = self.client.post('/review/write', data=data, - query_string=data, follow_redirects=True) + response = self.client.post("/review/write/{}/{}".format(data["entity_type"], data["entity_id"]), + data=data, query_string=data, follow_redirects=True) self.assert200(response) self.assertIn(self.review_text, str(response.data)) + response = self.client.post("/review/write/hello_entity/{}".format(data['entity_id']), + data=data, query_string=data, follow_redirects=True) + self.assert400(response, "Unsupported entity type") + def test_create_duplicate(self): review = self.create_dummy_review() self.temporary_login(self.user) - response = self.client.get("/review/write?release_group=%s" % review["entity_id"], + response = self.client.get("/review/write/release_group/%s" % review["entity_id"], follow_redirects=True) self.assertIn("You have already published a review for this entity!", str(response.data)) From ea803b73b8cc01cba02bc8baf6f76e7954c47fc6 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Mon, 14 Sep 2020 15:35:27 +0530 Subject: [PATCH 136/159] Downgrade to Bootstrap 3 The current UI components need to rewritten to work correctly with Bootstrap 4. Hence, using Bootstrap 3 till then. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46ec20527..ba5f4c94f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "pre-dev": "webpack --mode development" }, "dependencies": { - "bootstrap": "4.3.1", + "bootstrap": "^3.4.1", "bootstrap-rating-input": "javiertoledo/bootstrap-rating-input#0a4ebb7d", "jquery": "3.5.1", "popper.js": "^1.14.1", From 06cd525ed93c246718dd5763cc6103d814ce10d4 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Thu, 17 Sep 2020 02:19:56 +0530 Subject: [PATCH 137/159] Redirect query style urls to new scheme --- critiquebrainz/frontend/views/review.py | 17 +++++++++++++---- .../frontend/views/test/test_review.py | 19 ++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index 0414791b2..b08a951d1 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -1,5 +1,4 @@ from math import ceil -import logging from flask import Blueprint, render_template, request, redirect, url_for, jsonify from flask_babel import gettext, get_locale, lazy_gettext from flask_login import login_required, current_user @@ -205,12 +204,22 @@ def revisions_more(id): @review_bp.route('/write/') @login_required def create(entity_type=None, entity_id=None): + if not (entity_id or entity_type): - flash.info(gettext("Please choose an entity to review.")) - return redirect(url_for('search.selector', next=url_for('.create'))) + for allowed_type in ENTITY_TYPES: + if mbid := request.args.get(allowed_type): + entity_type = allowed_type + entity_id = mbid + break + + if entity_type: + return redirect(url_for('.create', entity_type=entity_type, entity_id=entity_id)) + else: + flash.info(gettext("Please choose an entity to review.")) + return redirect(url_for('search.selector', next=url_for('.create'))) if entity_type not in ENTITY_TYPES: - raise BadRequest("Unsupported entity type") + raise BadRequest("You can't write reviews about this type of entity.") if current_user.is_blocked: flash.error(gettext("You are not allowed to write new reviews because your " diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index 82c2bda05..330501bf5 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -1,12 +1,12 @@ from unittest.mock import patch, MagicMock -from flask import current_app +from flask import current_app, url_for import brainzutils.musicbrainz_db.release as mb_release from critiquebrainz.frontend.testing import FrontendTestCase import critiquebrainz.db.review as db_review from critiquebrainz.db.user import User import critiquebrainz.db.users as db_users import critiquebrainz.db.license as db_license - +from urllib.parse import urlparse def mock_get_entity_by_id(id, type='release_group'): if id == '6b3cd75d-7453-39f3-86c4-1441f360e121' and type == 'release_group': @@ -125,15 +125,24 @@ def test_create(self): data=data, query_string=data, follow_redirects=True) self.assertIn("You have exceeded your limit of reviews per day.", str(response.data)) + response = self.client.get("/review/write", follow_redirects=True) + self.assertIn("Please choose an entity to review.", str(response.data)) + # test create review when review limit is not exceeded response = self.client.post("/review/write/{}/{}".format(data["entity_type"], data["entity_id"]), data=data, query_string=data, follow_redirects=True) self.assert200(response) self.assertIn(self.review_text, str(response.data)) - response = self.client.post("/review/write/hello_entity/{}".format(data['entity_id']), - data=data, query_string=data, follow_redirects=True) - self.assert400(response, "Unsupported entity type") + response = self.client.get("/review/write/hello_entity/{}".format(data['entity_id']), + follow_redirects=True) + self.assert400(response, "You can't write reviews about this type of entity.") + + data = dict(release_group='6b3cd75d-7453-39f3-86c4-1441f360e121') + response = self.client.get("/review/write/", query_string=data) + redirect_url = urlparse(response.location) + self.assertEquals(redirect_url.path, url_for("review.create", entity_type="release_group", + entity_id=data["release_group"])) def test_create_duplicate(self): review = self.create_dummy_review() From 15fa59da43022f64328a8678921cc211c39e0362 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Sat, 19 Sep 2020 20:43:47 +0530 Subject: [PATCH 138/159] Handle NoDataFoundException while fetching entity This fixes CB-377. --- critiquebrainz/frontend/views/review.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index b08a951d1..09162e06d 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -22,7 +22,7 @@ import critiquebrainz.db.users as db_users import critiquebrainz.db.comment as db_comment from critiquebrainz.frontend.external.musicbrainz_db.entities import get_multiple_entities, get_entity_by_id - +from brainzutils.musicbrainz_db.exceptions import NoDataFoundException review_bp = Blueprint('review', __name__) RESULTS_LIMIT = 10 @@ -257,7 +257,11 @@ def create(entity_type=None, entity_id=None): flash.success(gettext("Review has been published!")) return redirect(url_for('.entity', id=review['id'])) - entity = get_entity_by_id(entity_id, entity_type) + try: + entity = get_entity_by_id(entity_id, entity_type) + except NoDataFoundException: + raise NotFound(gettext("Sorry, we couldn't find a %s with that MusicBrainz ID." % entity_type)) + if not entity: flash.error(gettext("You can only write a review for an entity that exists on MusicBrainz!")) return redirect(url_for('search.selector', next=url_for('.create'))) From 2e5e3c70526d13e27b0be8a83f2015d371058d61 Mon Sep 17 00:00:00 2001 From: Alastair Porter Date: Tue, 22 Sep 2020 13:43:45 +0200 Subject: [PATCH 139/159] Run psql inside db container, not critiquebrainz --- develop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop.sh b/develop.sh index f843ee288..de1c9d562 100755 --- a/develop.sh +++ b/develop.sh @@ -26,7 +26,7 @@ function invoke_manage { } function open_psql_shell { - invoke_docker_compose run --rm critiquebrainz psql \ + invoke_docker_compose run --rm db psql \ ${POSTGRES_CB_URI} } From 755c8114b5c2fd292eea2358d82954a19649c58f Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Wed, 23 Sep 2020 20:05:47 +0530 Subject: [PATCH 140/159] Delete init_postgres method --- manage.py | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/manage.py b/manage.py index a824d4042..f81b4fe39 100644 --- a/manage.py +++ b/manage.py @@ -115,7 +115,6 @@ def init_db(skip_create_db=False, test_db=False, force=False): db_uri = frontend.create_app().config['SQLALCHEMY_DATABASE_URI'] if not skip_create_db: - init_postgres(db_uri) create_extension(db_uri) click.echo("Creating tables... ", nl=False) @@ -131,37 +130,6 @@ def init_db(skip_create_db=False, test_db=False, force=False): click.echo("Initialization has been completed!") -def init_postgres(db_uri): - """Initializes PostgreSQL database from provided URI. - - New user and database will be created, if needed. It also creates uuid-ossp extension. - """ - hostname, port, db, username, password = data_utils.explode_db_uri(db_uri) # pylint: disable=unused-variable - if hostname not in ['localhost', '127.0.0.1']: - raise Exception('Cannot configure a remote database') - - # Checking if user already exists - retv = subprocess.check_output('sudo -u postgres psql -t -A -c' - '"SELECT COUNT(*) FROM pg_user WHERE usename = \'%s\';"' % - username, shell=True) - if retv == '0': - exit_code = subprocess.call( - 'sudo -u postgres psql -c ' - '"CREATE ROLE %s PASSWORD \'%s\' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;"' % - (username, password), - shell=True, - ) - if exit_code != 0: - raise Exception('Failed to create PostgreSQL user!') - - # Checking if database exists - exit_code = subprocess.call('sudo -u postgres psql -c "\\q" %s' % db, shell=True) - if exit_code != 0: - exit_code = subprocess.call('sudo -u postgres createdb -O %s %s' % (username, db), shell=True) - if exit_code != 0: - raise Exception('Failed to create PostgreSQL database!') - - def create_extension(db_uri): host, port, db, username, password = data_utils.explode_db_uri(db_uri) psql_cmd = "psql -h %s -p %s -U %s -W %s %s" % (host, port, username, password, db) From 71ed34b5d425634a8a2dde41d98d19f93213a0f9 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Wed, 23 Sep 2020 22:33:04 +0530 Subject: [PATCH 141/159] Reset postgres tables serial sequence after import --- critiquebrainz/data/dump_manager.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/critiquebrainz/data/dump_manager.py b/critiquebrainz/data/dump_manager.py index 3798078b7..03d665da9 100644 --- a/critiquebrainz/data/dump_manager.py +++ b/critiquebrainz/data/dump_manager.py @@ -14,6 +14,7 @@ from critiquebrainz.data.utils import create_path, remove_old_archives, slugify, explode_db_uri, with_request_context from critiquebrainz.db import license as db_license, review as db_review from critiquebrainz import db +from psycopg2.sql import SQL, Identifier cli = click.Group() @@ -471,6 +472,9 @@ def importer(archive): import_data(os.path.join(temp_dir, 'cbdump', 'avg_rating'), 'avg_rating') import_data(os.path.join(temp_dir, 'cbdump', 'vote'), 'vote') + # Reset sequence values after importing dump + reset_sequence(['revision']) + shutil.rmtree(temp_dir) # Cleanup print("Done!") @@ -503,6 +507,18 @@ def import_data(file_name, table_name, columns=None): connection.close() +def reset_sequence(table_names): + connection = db.engine.raw_connection() + try: + cursor = connection.cursor() + for table_name in table_names: + cursor.execute(SQL("SELECT setval(pg_get_serial_sequence(%s, 'id'), coalesce(max(id),0) + 1, false) FROM {};") + .format(Identifier(table_name)), (table_name,)) + connection.commit() + finally: + connection.close() + + class DumpJSONEncoder(JSONEncoder): """Custom JSON encoder for database dumps.""" From d9c1def371988c23fbb1156706c669662599f24f Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Wed, 23 Sep 2020 21:59:12 +0530 Subject: [PATCH 142/159] Accept 'created' as sort parameter --- critiquebrainz/ws/review/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/critiquebrainz/ws/review/views.py b/critiquebrainz/ws/review/views.py index 9354fda77..b28bacbc4 100644 --- a/critiquebrainz/ws/review/views.py +++ b/critiquebrainz/ws/review/views.py @@ -349,10 +349,14 @@ def review_list_handler(): entity_type = Parser.string('uri', 'entity_type', valid_values=ENTITY_TYPES, optional=True) user_id = Parser.uuid('uri', 'user_id', optional=True) - # TODO: "rating" sort value is deprecated and needs to be removed. - sort = Parser.string('uri', 'sort', valid_values=['popularity', 'published_on', 'rating'], optional=True) + sort = Parser.string('uri', 'sort', valid_values=['popularity', 'published_on', 'rating', 'created'], optional=True) + + # "rating" and "created" sort values are deprecated and but allowed here for backward compatibility + if sort == 'created': + sort = 'published_on' if sort == 'rating': sort = 'popularity' + limit = Parser.int('uri', 'limit', min=1, max=50, optional=True) or 50 offset = Parser.int('uri', 'offset', optional=True) or 0 language = Parser.string('uri', 'language', min=2, max=3, optional=True) From 32984cd749f413ae07577b3ba1a14b300893c381 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 12:47:08 +0530 Subject: [PATCH 143/159] Add tests for sort parameters --- critiquebrainz/ws/review/views_test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/critiquebrainz/ws/review/views_test.py b/critiquebrainz/ws/review/views_test.py index 77ec3226c..d5e19f550 100644 --- a/critiquebrainz/ws/review/views_test.py +++ b/critiquebrainz/ws/review/views_test.py @@ -41,6 +41,23 @@ def header(self, user): def create_dummy_review(self): return db_review.create(**self.review) + def test_review_sort(self): + response = self.client.get('/review/', query_string={'sort': 'rating'}) + self.assert200(response) + + response = self.client.get('/review/', query_string={'sort': 'published_on'}) + self.assert200(response) + + response = self.client.get('/review/', query_string={'sort': 'popularity'}) + self.assert200(response) + + response = self.client.get('/review/', query_string={'sort': 'created'}) + self.assert200(response) + + response = self.client.get('/review/', query_string={'sort': 'hello'}) + self.assert400(response) + self.assertEquals(response.json['description'], 'Parameter `sort`: is not valid') + def test_review_count(self): resp = self.client.get('/review/').json self.assertEqual(resp['count'], 0) From ab4282cd11e4293a474b9a1666fa97a69d667894 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Wed, 23 Sep 2020 00:38:49 +0530 Subject: [PATCH 144/159] Make changes to fix CB-380 --- critiquebrainz/frontend/forms/review.py | 2 +- critiquebrainz/frontend/views/review.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/critiquebrainz/frontend/forms/review.py b/critiquebrainz/frontend/forms/review.py index 4d0a6b1f1..2d651f6d8 100644 --- a/critiquebrainz/frontend/forms/review.py +++ b/critiquebrainz/frontend/forms/review.py @@ -41,7 +41,7 @@ class ReviewEditForm(FlaskForm): ('CC BY-SA 3.0', lazy_gettext('Allow commercial use of this review(CC BY-SA 3.0 license)')), # noqa: E501 ('CC BY-NC-SA 3.0', lazy_gettext('Do not allow commercial use of this review, unless approved by MetaBrainz Foundation (CC BY-NC-SA 3.0 license)')), # noqa: E501 ], - validators=[validators.DataRequired(message=lazy_gettext("You need to choose a license!"))]) + validators=[validators.InputRequired(message=lazy_gettext("You need to choose a license"))]) remember_license = BooleanField(lazy_gettext("Remember this license choice for further preference")) language = SelectField(lazy_gettext("You need to accept the license agreement!"), choices=languages) rating = IntegerField(lazy_gettext("Rating"), widget=Input(input_type='number'), validators=[validators.Optional()]) diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index 09162e06d..4e19ce63b 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -231,7 +231,7 @@ def create(entity_type=None, entity_id=None): review = reviews[0] if count != 0 else None if review: - flash.error(gettext("You have already published a review for this entity!")) + flash.error(gettext("You have already published a review for this entity")) return redirect(url_for('review.entity', id=review["id"])) if current_user.is_review_limit_exceeded: From fc6bb0030d7e73a115db56fd8a1810fe4a2ddd43 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 14:28:50 +0530 Subject: [PATCH 145/159] Create revision in same transaction as review It might be possible that there may be other uses or potential use case for creating a revision in a separate transaction. Hence, added the connection as an optional parameter. To enforce the creation in the same transaction we can make the parameter mandatory. --- critiquebrainz/db/review.py | 6 ++---- critiquebrainz/db/revision.py | 28 +++++++++++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index 7405208e2..8e95b93e5 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -240,8 +240,7 @@ def update(review_id, *, drafted, text=None, rating=None, license_id=None, langu updated_info["review_id"] = review_id with db.engine.connect() as connection: connection.execute(query, updated_info) - - db_revision.create(review_id, text, rating) + db_revision.create(review_id, text, rating, sql_connection=connection) cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) @@ -320,8 +319,7 @@ def create(*, entity_id, entity_type, user_id, is_draft, text=None, rating=None, "published_on": published_on, }) review_id = result.fetchone()[0] - # TODO(roman): It would be better to create review and revision in one transaction - db_revision.create(review_id, text, rating) + db_revision.create(review_id, text, rating, sql_connection=connection) cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) return get_by_id(review_id) diff --git a/critiquebrainz/db/revision.py b/critiquebrainz/db/revision.py index 772e51b0c..3949a79c9 100644 --- a/critiquebrainz/db/revision.py +++ b/critiquebrainz/db/revision.py @@ -157,13 +157,14 @@ def get_revision_number(review_id, revision_id): return rev_num -def create(review_id, text=None, rating=None): +def create(review_id, text=None, rating=None, sql_connection=None): """Creates a new revision for the given review. Args: review_id (uuid): ID of the review. text (str): Updated/New text part of the review. rating (int): Updated/New rating part of the review + sql_connection: connection to database to update/create the review """ if text is None and rating is None: raise db_exceptions.BadDataException("Text part and rating part of a revision can not be None simultaneously") @@ -172,16 +173,21 @@ def create(review_id, text=None, rating=None): # Convert ratings to values on a scale 0-100 rating = RATING_SCALE_0_100.get(rating) - with db.engine.connect() as connection: - connection.execute(sqlalchemy.text(""" - INSERT INTO revision(review_id, timestamp, text, rating) - VALUES (:review_id, :timestamp, :text, :rating) - """), { - "review_id": review_id, - "timestamp": datetime.now(), - "text": text, - "rating": rating, - }) + sql_query = sqlalchemy.text( + """INSERT INTO revision(review_id, timestamp, text, rating) + VALUES (:review_id, :timestamp, :text, :rating)""") + value_dict = { + "review_id": review_id, + "timestamp": datetime.now(), + "text": text, + "rating": rating, + } + + if sql_connection: + sql_connection.execute(sql_query, value_dict) + else: + with db.engine.connect() as connection: + connection.execute(sql_query, value_dict) # Update average rating if rating part of the review has changed review = db_review.get_by_id(review_id) From fa4016b3b6d3003934fc032624e1d6ae12c0ace8 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 14:36:24 +0530 Subject: [PATCH 146/159] Directly check whether list of reviews is empty --- critiquebrainz/frontend/views/event.py | 2 +- critiquebrainz/frontend/views/label.py | 2 +- critiquebrainz/frontend/views/place.py | 2 +- critiquebrainz/frontend/views/release_group.py | 2 +- critiquebrainz/frontend/views/work.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/critiquebrainz/frontend/views/event.py b/critiquebrainz/frontend/views/event.py index 500df0517..997cf9949 100644 --- a/critiquebrainz/frontend/views/event.py +++ b/critiquebrainz/frontend/views/event.py @@ -55,7 +55,7 @@ def entity(id): entity_type='event', user_id=current_user.id ) - my_review = my_reviews[0] if my_count else None + my_review = my_reviews[0] if my_reviews else None else: my_review = None diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index 86a46e43e..83594edfa 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -30,7 +30,7 @@ def entity(id): entity_type='label', user_id=current_user.id, ) - my_review = my_reviews[0] if my_count else None + my_review = my_reviews[0] if my_reviews else None else: my_review = None diff --git a/critiquebrainz/frontend/views/place.py b/critiquebrainz/frontend/views/place.py index 53506ce33..4eff92052 100644 --- a/critiquebrainz/frontend/views/place.py +++ b/critiquebrainz/frontend/views/place.py @@ -43,7 +43,7 @@ def entity(id): entity_type='place', user_id=current_user.id ) - my_review = my_reviews[0] if my_count else None + my_review = my_reviews[0] if my_reviews else None else: my_review = None diff --git a/critiquebrainz/frontend/views/release_group.py b/critiquebrainz/frontend/views/release_group.py index c36171e80..83ba38eea 100644 --- a/critiquebrainz/frontend/views/release_group.py +++ b/critiquebrainz/frontend/views/release_group.py @@ -66,7 +66,7 @@ def entity(id): entity_type='release_group', user_id=current_user.id, ) - my_review = my_reviews[0] if my_count else None + my_review = my_reviews[0] if my_reviews else None else: my_review = None reviews, count = db_review.list_reviews( diff --git a/critiquebrainz/frontend/views/work.py b/critiquebrainz/frontend/views/work.py index 899df794f..bd4b3d610 100644 --- a/critiquebrainz/frontend/views/work.py +++ b/critiquebrainz/frontend/views/work.py @@ -30,7 +30,7 @@ def entity(id): entity_type='work', user_id=current_user.id, ) - my_review = my_reviews[0] if my_count else None + my_review = my_reviews[0] if my_reviews else None else: my_review = None From 35070fc2e10f75bfca5e99cc8176d1d4f8310516 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 19:17:39 +0530 Subject: [PATCH 147/159] Delete --skip-create-db and create_extension The extension are already created in the Dockerfile. Hence, no need for the create_extension method. Therefore, --skip-create-db option becomes redundant and has been removed accordingly. --- docker/Dockerfile.test | 2 +- docs/intro.rst | 2 +- manage.py | 25 ++++--------------------- test.sh | 2 +- 4 files changed, 7 insertions(+), 24 deletions(-) diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test index cd65e635a..d9b3f978a 100644 --- a/docker/Dockerfile.test +++ b/docker/Dockerfile.test @@ -43,6 +43,6 @@ RUN pybabel compile -d critiquebrainz/frontend/translations CMD dockerize -wait tcp://db_test:5432 -timeout 60s \ dockerize -wait tcp://musicbrainz_db:5432 -timeout 360s \ - python manage.py init_db --skip-create-db --test-db \ + python manage.py init_db --test-db \ && py.test --junitxml=/data/test_report.xml \ --cov-report xml:/data/coverage.xml diff --git a/docs/intro.rst b/docs/intro.rst index f84c1876e..05589721a 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -124,7 +124,7 @@ a single command:: Next, initialize the CritiqueBrainz database:: - $ ./develop.sh run --rm critiquebrainz python3 manage.py init_db --skip-create-db + $ ./develop.sh run --rm critiquebrainz python3 manage.py init_db You will also need to run some commands to build the static assets (javascript and css files) for the first run:: diff --git a/manage.py b/manage.py index f81b4fe39..df266cf1a 100644 --- a/manage.py +++ b/manage.py @@ -84,14 +84,12 @@ def clear_memcached(): click.echo("Flushed everything from memcached.") -@click.option("--skip-create-db", "-s", is_flag=True, - help="Skip database creation step.") @click.option("--test-db", "-t", is_flag=True, help="Initialize the test database.") @click.option("--force", "-f", is_flag=True, help="Drop existing tables and types.") @cli.command() -def init_db(skip_create_db=False, test_db=False, force=False): +def init_db(test_db=False, force=False): """Initialize the database. * Creates the database. @@ -107,15 +105,12 @@ def init_db(skip_create_db=False, test_db=False, force=False): click.echo("Done!") if test_db: - db_uri = frontend.create_app(config_path=os.path.join( + frontend.create_app(config_path=os.path.join( os.path.dirname(os.path.realpath(__file__)), 'critiquebrainz', 'test_config.py' - )).config['SQLALCHEMY_DATABASE_URI'] + )) else: - db_uri = frontend.create_app().config['SQLALCHEMY_DATABASE_URI'] - - if not skip_create_db: - create_extension(db_uri) + frontend.create_app() click.echo("Creating tables... ", nl=False) data_utils.create_all() @@ -130,18 +125,6 @@ def init_db(skip_create_db=False, test_db=False, force=False): click.echo("Initialization has been completed!") -def create_extension(db_uri): - host, port, db, username, password = data_utils.explode_db_uri(db_uri) - psql_cmd = "psql -h %s -p %s -U %s -W %s %s" % (host, port, username, password, db) - exit_code = subprocess.call( - '%s -t -A -c "CREATE EXTENSION IF NOT EXISTS \\"%s\\";" %s' % - (psql_cmd, 'uuid-ossp', db), - shell=True, - ) - if exit_code != 0: - raise Exception('Failed to create PostgreSQL extension!') - - def _run_command(command): return subprocess.check_call(command, shell=True) diff --git a/test.sh b/test.sh index 376a2cd38..2afe44575 100755 --- a/test.sh +++ b/test.sh @@ -39,7 +39,7 @@ function setup { -p ${COMPOSE_PROJECT_NAME} \ run --rm critiquebrainz_test dockerize \ -wait tcp://db_test:5432 -timeout 60s \ - bash -c "python3 manage.py init_db --skip-create-db --test-db" + bash -c "python3 manage.py init_db --test-db" } function is_db_running { From 321781dc279268c91c7da108641b82c14a99ff1f Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 20:23:49 +0530 Subject: [PATCH 148/159] Remove ! from test_create_duplicate to fix regression --- critiquebrainz/frontend/views/test/test_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index 330501bf5..7c72813ab 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -150,7 +150,7 @@ def test_create_duplicate(self): self.temporary_login(self.user) response = self.client.get("/review/write/release_group/%s" % review["entity_id"], follow_redirects=True) - self.assertIn("You have already published a review for this entity!", str(response.data)) + self.assertIn("You have already published a review for this entity", str(response.data)) def test_edit(self): updated_text = "The text has now been updated" From ce2dcd885af7415c030ffeb02ce3ae07c80e410f Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 21:23:48 +0530 Subject: [PATCH 149/159] Run autopep8 on entire codebase --- critiquebrainz/data/mixins.py | 1 + critiquebrainz/db/comment.py | 16 ++++++++-------- critiquebrainz/db/comment_revision.py | 6 +++--- critiquebrainz/db/users.py | 2 +- .../frontend/views/test/test_review.py | 1 + import_musicbrainz_row_ids.py | 14 +++++++------- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/critiquebrainz/data/mixins.py b/critiquebrainz/data/mixins.py index 5afc36a80..42debb8d0 100644 --- a/critiquebrainz/data/mixins.py +++ b/critiquebrainz/data/mixins.py @@ -4,6 +4,7 @@ class AdminMixin(UserMixin): """Allows a method to check if the current user is admin.""" + def is_admin(self): return self.musicbrainz_username in current_app.config['ADMINS'] diff --git a/critiquebrainz/db/comment.py b/critiquebrainz/db/comment.py index 0893f4219..060b07048 100644 --- a/critiquebrainz/db/comment.py +++ b/critiquebrainz/db/comment.py @@ -42,10 +42,10 @@ def create(*, user_id, text, review_id, is_draft=False): VALUES (:user_id, :review_id, :is_draft) RETURNING id """), { - 'user_id': user_id, - 'review_id': review_id, - 'is_draft': is_draft, - }) + 'user_id': user_id, + 'review_id': review_id, + 'is_draft': is_draft, + }) comment_id = result.fetchone()['id'] db_comment_revision.create(comment_id, text) return get_by_id(comment_id) @@ -97,8 +97,8 @@ def get_by_id(comment_id): ORDER BY cr.timestamp DESC LIMIT 1 """), { - 'comment_id': comment_id, - }) + 'comment_id': comment_id, + }) comment = result.fetchone() if not comment: @@ -231,8 +231,8 @@ def delete(comment_id): FROM comment WHERE id = :comment_id """), { - 'comment_id': comment_id, - }) + 'comment_id': comment_id, + }) def update(comment_id, *, text=None, is_draft=None, is_hidden=None): diff --git a/critiquebrainz/db/comment_revision.py b/critiquebrainz/db/comment_revision.py index 67db5e6fb..f83855f42 100644 --- a/critiquebrainz/db/comment_revision.py +++ b/critiquebrainz/db/comment_revision.py @@ -36,8 +36,8 @@ def create(comment_id, text): VALUES (:comment_id, :text) RETURNING id """), { - 'comment_id': comment_id, - 'text': text, - }) + 'comment_id': comment_id, + 'text': text, + }) return result.fetchone()['id'] diff --git a/critiquebrainz/db/users.py b/critiquebrainz/db/users.py index cd874e7ff..e37c4091b 100644 --- a/critiquebrainz/db/users.py +++ b/critiquebrainz/db/users.py @@ -97,7 +97,7 @@ def get_user_by_id(connection, user_id): result = connection.execute(query, { "user_id": user_id - }) + }) row = result.fetchone() if not row: return None diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index 7c72813ab..78e423fdd 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -8,6 +8,7 @@ import critiquebrainz.db.license as db_license from urllib.parse import urlparse + def mock_get_entity_by_id(id, type='release_group'): if id == '6b3cd75d-7453-39f3-86c4-1441f360e121' and type == 'release_group': return { diff --git a/import_musicbrainz_row_ids.py b/import_musicbrainz_row_ids.py index 0433a9a27..00a50af09 100644 --- a/import_musicbrainz_row_ids.py +++ b/import_musicbrainz_row_ids.py @@ -13,8 +13,8 @@ def fix_user(mb_connection, cb_connection, user_name, cb_id): FROM editor WHERE name = :user_name """), { - 'user_name': user_name, - }) + 'user_name': user_name, + }) if r.rowcount > 0: musicbrainz_row_id = r.fetchone()['id'] if not DRY_RUN: @@ -63,8 +63,8 @@ def import_musicbrainz_row_ids(): FROM editor WHERE name = :musicbrainz_id """), { - 'musicbrainz_id': user['musicbrainz_username'], - }) + 'musicbrainz_id': user['musicbrainz_username'], + }) musicbrainz_row_id = None if r.rowcount > 0: musicbrainz_row_id = r.fetchone()['id'] @@ -76,9 +76,9 @@ def import_musicbrainz_row_ids(): SET musicbrainz_row_id = :musicbrainz_row_id WHERE id = :id """), { - 'musicbrainz_row_id': musicbrainz_row_id, - 'id': user['id'], - }) + 'musicbrainz_row_id': musicbrainz_row_id, + 'id': user['id'], + }) else: print('%s not found!' % name) not_found += 1 From 75ddff3569036bb7296097d0b61d90684581dd74 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 22:27:07 +0530 Subject: [PATCH 150/159] Fix flake8 warnings --- critiquebrainz/data/dump_manager.py | 46 ++++++++++--------- critiquebrainz/data/fixtures.py | 2 +- critiquebrainz/data/testing.py | 4 +- critiquebrainz/data/utils.py | 12 +++-- critiquebrainz/data/utils_test.py | 2 +- critiquebrainz/db/avg_rating.py | 1 + critiquebrainz/db/avg_rating_test.py | 8 ++-- critiquebrainz/db/comment.py | 18 ++++---- critiquebrainz/db/comment_revision.py | 7 +-- critiquebrainz/db/dump_manager_test.py | 8 ++-- critiquebrainz/db/license.py | 1 + critiquebrainz/db/license_test.py | 2 +- critiquebrainz/db/moderation_log.py | 2 + critiquebrainz/db/moderation_log_test.py | 8 ++-- critiquebrainz/db/oauth_client.py | 2 +- critiquebrainz/db/oauth_client_test.py | 2 +- critiquebrainz/db/oauth_grant.py | 1 + critiquebrainz/db/oauth_grant_test.py | 10 ++-- critiquebrainz/db/oauth_token.py | 1 + critiquebrainz/db/oauth_token_test.py | 7 +-- critiquebrainz/db/review.py | 9 ++-- critiquebrainz/db/review_test.py | 12 +++-- critiquebrainz/db/revision.py | 6 ++- critiquebrainz/db/revision_test.py | 9 ++-- critiquebrainz/db/spam_report.py | 3 +- critiquebrainz/db/spam_report_test.py | 9 ++-- critiquebrainz/db/statistics.py | 15 +++--- critiquebrainz/db/statistics_test.py | 12 +++-- critiquebrainz/db/user.py | 5 +- critiquebrainz/db/users.py | 4 +- critiquebrainz/db/users_test.py | 14 +++--- critiquebrainz/db/vote.py | 2 + critiquebrainz/db/vote_test.py | 7 +-- critiquebrainz/decorators.py | 6 ++- critiquebrainz/frontend/__init__.py | 9 ++-- critiquebrainz/frontend/error_handlers.py | 1 - critiquebrainz/frontend/external/mbspotify.py | 8 ++-- .../frontend/external/musicbrainz.py | 1 - .../external/musicbrainz_db/artist.py | 1 + .../external/musicbrainz_db/entities.py | 11 +++-- .../frontend/external/musicbrainz_db/event.py | 1 + .../external/musicbrainz_db/helpers.py | 27 ++++++----- .../external/musicbrainz_db/includes.py | 5 +- .../frontend/external/musicbrainz_db/label.py | 1 + .../frontend/external/musicbrainz_db/place.py | 1 + .../external/musicbrainz_db/release.py | 1 + .../external/musicbrainz_db/release_group.py | 3 +- .../external/musicbrainz_db/serialize.py | 1 + .../frontend/external/musicbrainz_db/utils.py | 8 ++-- .../frontend/external/musicbrainz_db/work.py | 1 + .../frontend/external/relationships/artist.py | 1 + .../frontend/external/relationships/label.py | 1 + .../external/relationships/release_group.py | 1 + .../frontend/external/soundcloud.py | 1 + critiquebrainz/frontend/external/spotify.py | 8 ++-- .../frontend/external/spotify_test.py | 6 ++- critiquebrainz/frontend/login/__init__.py | 6 ++- critiquebrainz/frontend/login/provider.py | 5 +- critiquebrainz/frontend/static_manager.py | 3 +- critiquebrainz/frontend/testing.py | 4 +- critiquebrainz/frontend/views/artist.py | 4 +- critiquebrainz/frontend/views/comment.py | 8 ++-- critiquebrainz/frontend/views/event.py | 5 +- critiquebrainz/frontend/views/index.py | 5 +- critiquebrainz/frontend/views/label.py | 10 ++-- critiquebrainz/frontend/views/log.py | 2 + critiquebrainz/frontend/views/login.py | 5 +- critiquebrainz/frontend/views/mapping.py | 14 +++--- critiquebrainz/frontend/views/moderators.py | 1 + critiquebrainz/frontend/views/oauth.py | 2 +- critiquebrainz/frontend/views/place.py | 7 +-- critiquebrainz/frontend/views/profile.py | 2 +- critiquebrainz/frontend/views/profile_apps.py | 6 +-- critiquebrainz/frontend/views/rate.py | 5 +- critiquebrainz/frontend/views/release.py | 1 + .../frontend/views/release_group.py | 13 +++--- critiquebrainz/frontend/views/reports.py | 3 +- critiquebrainz/frontend/views/review.py | 31 +++++++------ critiquebrainz/frontend/views/search.py | 4 +- critiquebrainz/frontend/views/statistics.py | 1 + .../frontend/views/test/profile_apps.py | 4 +- .../frontend/views/test/test_artist.py | 5 +- .../frontend/views/test/test_comment.py | 11 +++-- .../frontend/views/test/test_mapping.py | 16 ++++--- .../frontend/views/test/test_moderators.py | 1 + .../frontend/views/test/test_profile.py | 6 +-- .../frontend/views/test/test_rate.py | 10 ++-- .../frontend/views/test/test_release.py | 3 +- .../frontend/views/test/test_release_group.py | 9 ++-- .../frontend/views/test/test_review.py | 16 ++++--- .../frontend/views/test/test_search.py | 3 +- .../frontend/views/test/test_statistics.py | 8 ++-- .../frontend/views/test/test_user.py | 3 +- critiquebrainz/frontend/views/user.py | 11 +++-- critiquebrainz/frontend/views/work.py | 10 ++-- critiquebrainz/loggers.py | 1 + critiquebrainz/utils.py | 7 +-- critiquebrainz/utils_test.py | 1 + critiquebrainz/ws/__init__.py | 8 ++-- critiquebrainz/ws/errors.py | 2 +- critiquebrainz/ws/oauth/provider.py | 16 ++++--- critiquebrainz/ws/oauth/views.py | 6 ++- critiquebrainz/ws/parser.py | 4 +- critiquebrainz/ws/review/views.py | 7 +-- critiquebrainz/ws/review/views_test.py | 6 +-- critiquebrainz/ws/testing.py | 8 ++-- critiquebrainz/ws/user/views.py | 7 ++- critiquebrainz/ws/user/views_test.py | 2 +- import_musicbrainz_row_ids.py | 14 +++--- 109 files changed, 416 insertions(+), 291 deletions(-) diff --git a/critiquebrainz/data/dump_manager.py b/critiquebrainz/data/dump_manager.py index 03d665da9..b31e65818 100644 --- a/critiquebrainz/data/dump_manager.py +++ b/critiquebrainz/data/dump_manager.py @@ -1,25 +1,25 @@ -from time import gmtime, strftime -from datetime import datetime -import subprocess -import tempfile -import tarfile -import shutil import errno -import sys import os +import shutil +import subprocess +import sys +import tarfile +import tempfile +from datetime import datetime +from time import gmtime, strftime + +import click +import sqlalchemy from flask import current_app, jsonify from flask.json import JSONEncoder -import sqlalchemy -import click -from critiquebrainz.data.utils import create_path, remove_old_archives, slugify, explode_db_uri, with_request_context -from critiquebrainz.db import license as db_license, review as db_review -from critiquebrainz import db from psycopg2.sql import SQL, Identifier +from critiquebrainz import db +from critiquebrainz.data.utils import create_path, remove_old_archives, slugify, explode_db_uri, with_request_context +from critiquebrainz.db import license as db_license, review as db_review cli = click.Group() - _TABLES = { "review": ( "id", @@ -111,7 +111,7 @@ def full_db(location, rotate=False): # More info about it is available at http://www.postgresql.org/docs/9.3/static/app-pgdump.html dump_file = os.path.join(location, FILE_PREFIX + strftime("%Y%m%d-%H%M%S", gmtime())) print('pg_dump -h "%s" -p "%s" -U "%s" -d "%s" -Ft > "%s.tar"' % - (db_hostname, db_port, db_username, db_name, dump_file),) + (db_hostname, db_port, db_username, db_name, dump_file), ) result = subprocess.call( 'pg_dump -h "%s" -p "%s" -U "%s" -d "%s" -Ft > "%s.tar"' % (db_hostname, db_port, db_username, db_name, dump_file), @@ -166,7 +166,8 @@ def json(location, rotate=False): entity = str(entity) # Creating directory structure and dumping reviews dir_part = os.path.join(entity[0:1], entity[0:2]) - reviews = db_review.get_reviews_list(connection, entity_id=entity, license_id=license["id"], limit=None)[0] + reviews = db_review.get_reviews_list(connection, entity_id=entity, + license_id=license["id"], limit=None)[0] if reviews: rg_dir = '%s/%s' % (license_dir, dir_part) create_path(rg_dir) @@ -181,7 +182,8 @@ def json(location, rotate=False): tar.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), "licenses", safe_name + ".txt"), arcname='COPYING') - print(" + %s/critiquebrainz-%s-%s-json.tar.bz2" % (location, datetime.today().strftime('%Y%m%d'), safe_name)) + print(" + %s/critiquebrainz-%s-%s-json.tar.bz2" % ( + location, datetime.today().strftime('%Y%m%d'), safe_name)) shutil.rmtree(temp_dir) # Cleanup @@ -314,7 +316,8 @@ def create_base_archive(connection, *, location, meta_files_dir=None): # Including additional information about this archive # Copying the most restrictive license there (CC BY-NC-SA 3.0) - tar.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), "licenses", "cc-by-nc-sa-30.txt"), arcname='COPYING') + tar.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), "licenses", "cc-by-nc-sa-30.txt"), + arcname='COPYING') # Copy meta files if not meta_files_dir: prepare_meta_files(temp_dir) @@ -417,7 +420,8 @@ def create_reviews_archive(connection, *, location, meta_files_dir=None, license tar.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), "licenses", "cc-by-nc-sa-30.txt"), arcname='COPYING') else: - tar.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), "licenses", safe_name + ".txt"), arcname='COPYING') + tar.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), "licenses", safe_name + ".txt"), + arcname='COPYING') if not meta_files_dir: prepare_meta_files(temp_dir) @@ -480,7 +484,6 @@ def importer(archive): def import_data(file_name, table_name, columns=None): - connection = db.engine.raw_connection() try: cursor = connection.cursor() @@ -512,8 +515,9 @@ def reset_sequence(table_names): try: cursor = connection.cursor() for table_name in table_names: - cursor.execute(SQL("SELECT setval(pg_get_serial_sequence(%s, 'id'), coalesce(max(id),0) + 1, false) FROM {};") - .format(Identifier(table_name)), (table_name,)) + cursor.execute( + SQL("SELECT setval(pg_get_serial_sequence(%s, 'id'), coalesce(max(id),0) + 1, false) FROM {};") + .format(Identifier(table_name)), (table_name,)) connection.commit() finally: connection.close() diff --git a/critiquebrainz/data/fixtures.py b/critiquebrainz/data/fixtures.py index 09a55c3a9..181ad314d 100644 --- a/critiquebrainz/data/fixtures.py +++ b/critiquebrainz/data/fixtures.py @@ -37,4 +37,4 @@ class LicenseData: # Include all objects into this tuple. -all_data = (LicenseData, ) +all_data = (LicenseData,) diff --git a/critiquebrainz/data/testing.py b/critiquebrainz/data/testing.py index 4daaef5cb..2eca88fa1 100644 --- a/critiquebrainz/data/testing.py +++ b/critiquebrainz/data/testing.py @@ -1,7 +1,9 @@ import os + from flask_testing import TestCase -from critiquebrainz.frontend import create_app + from critiquebrainz.data.utils import create_all, drop_tables, drop_types +from critiquebrainz.frontend import create_app class DataTestCase(TestCase): diff --git a/critiquebrainz/data/utils.py b/critiquebrainz/data/utils.py index dce9b1b5b..a013bd8f7 100644 --- a/critiquebrainz/data/utils.py +++ b/critiquebrainz/data/utils.py @@ -1,11 +1,12 @@ -import urllib.parse -import unicodedata -import shutil import errno -import sys import os import re +import shutil +import sys +import unicodedata +import urllib.parse from functools import wraps + from critiquebrainz import db from critiquebrainz import frontend @@ -102,11 +103,13 @@ def with_request_context(f): def decorated(*args, **kwargs): with frontend.create_app().test_request_context(): return f(*args, **kwargs) + return decorated def with_test_request_context(f): """Decorator for providing request context for application using test_config.py.""" + @wraps(f) def decorated(*args, **kwargs): with frontend.create_app( @@ -114,4 +117,5 @@ def decorated(*args, **kwargs): os.path.dirname(os.path.realpath(__file__)), '..', 'test_config.py')).test_request_context(): return f(*args, **kwargs) + return decorated diff --git a/critiquebrainz/data/utils_test.py b/critiquebrainz/data/utils_test.py index 1e1899d67..76b134666 100644 --- a/critiquebrainz/data/utils_test.py +++ b/critiquebrainz/data/utils_test.py @@ -1,5 +1,5 @@ -from critiquebrainz.data.testing import DataTestCase from critiquebrainz.data import utils +from critiquebrainz.data.testing import DataTestCase class DataUtilsTestCase(DataTestCase): diff --git a/critiquebrainz/db/avg_rating.py b/critiquebrainz/db/avg_rating.py index 96436fb69..78576fbdf 100644 --- a/critiquebrainz/db/avg_rating.py +++ b/critiquebrainz/db/avg_rating.py @@ -1,4 +1,5 @@ import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import exceptions as db_exceptions diff --git a/critiquebrainz/db/avg_rating_test.py b/critiquebrainz/db/avg_rating_test.py index b9131fad7..84c1b5260 100644 --- a/critiquebrainz/db/avg_rating_test.py +++ b/critiquebrainz/db/avg_rating_test.py @@ -1,10 +1,10 @@ -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.users as db_users -from critiquebrainz.db.user import User -import critiquebrainz.db.review as db_review import critiquebrainz.db.avg_rating as db_avg_rating import critiquebrainz.db.exceptions as db_exceptions import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase +from critiquebrainz.db.user import User class AvgRatingTestCase(DataTestCase): diff --git a/critiquebrainz/db/comment.py b/critiquebrainz/db/comment.py index 060b07048..f39ca562f 100644 --- a/critiquebrainz/db/comment.py +++ b/critiquebrainz/db/comment.py @@ -17,10 +17,10 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sqlalchemy + import critiquebrainz.db as db import critiquebrainz.db.comment_revision as db_comment_revision import critiquebrainz.db.exceptions as db_exceptions - from critiquebrainz.db.user import User @@ -42,10 +42,10 @@ def create(*, user_id, text, review_id, is_draft=False): VALUES (:user_id, :review_id, :is_draft) RETURNING id """), { - 'user_id': user_id, - 'review_id': review_id, - 'is_draft': is_draft, - }) + 'user_id': user_id, + 'review_id': review_id, + 'is_draft': is_draft, + }) comment_id = result.fetchone()['id'] db_comment_revision.create(comment_id, text) return get_by_id(comment_id) @@ -97,8 +97,8 @@ def get_by_id(comment_id): ORDER BY cr.timestamp DESC LIMIT 1 """), { - 'comment_id': comment_id, - }) + 'comment_id': comment_id, + }) comment = result.fetchone() if not comment: @@ -231,8 +231,8 @@ def delete(comment_id): FROM comment WHERE id = :comment_id """), { - 'comment_id': comment_id, - }) + 'comment_id': comment_id, + }) def update(comment_id, *, text=None, is_draft=None, is_hidden=None): diff --git a/critiquebrainz/db/comment_revision.py b/critiquebrainz/db/comment_revision.py index f83855f42..23b5e2597 100644 --- a/critiquebrainz/db/comment_revision.py +++ b/critiquebrainz/db/comment_revision.py @@ -17,6 +17,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sqlalchemy + import critiquebrainz.db as db @@ -36,8 +37,8 @@ def create(comment_id, text): VALUES (:comment_id, :text) RETURNING id """), { - 'comment_id': comment_id, - 'text': text, - }) + 'comment_id': comment_id, + 'text': text, + }) return result.fetchone()['id'] diff --git a/critiquebrainz/db/dump_manager_test.py b/critiquebrainz/db/dump_manager_test.py index 24701dcc4..8206573e5 100644 --- a/critiquebrainz/db/dump_manager_test.py +++ b/critiquebrainz/db/dump_manager_test.py @@ -1,13 +1,15 @@ import os import tempfile from datetime import datetime + from click.testing import CliRunner -from critiquebrainz.data.testing import DataTestCase -from critiquebrainz.data import utils + import critiquebrainz.db.license as db_license -import critiquebrainz.db.users as db_users import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users import critiquebrainz.db.vote as db_vote +from critiquebrainz.data import utils +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db.user import User utils.with_request_context = utils.with_test_request_context # noqa diff --git a/critiquebrainz/db/license.py b/critiquebrainz/db/license.py index 00fb30215..91063f2f3 100644 --- a/critiquebrainz/db/license.py +++ b/critiquebrainz/db/license.py @@ -1,4 +1,5 @@ import sqlalchemy + from critiquebrainz import db diff --git a/critiquebrainz/db/license_test.py b/critiquebrainz/db/license_test.py index 97de5ecf5..e4088e3fb 100644 --- a/critiquebrainz/db/license_test.py +++ b/critiquebrainz/db/license_test.py @@ -1,5 +1,5 @@ -from critiquebrainz.data.testing import DataTestCase import critiquebrainz.db.license as db_license +from critiquebrainz.data.testing import DataTestCase class LicenseTestCase(DataTestCase): diff --git a/critiquebrainz/db/moderation_log.py b/critiquebrainz/db/moderation_log.py index 9d920b11f..03c6884f4 100644 --- a/critiquebrainz/db/moderation_log.py +++ b/critiquebrainz/db/moderation_log.py @@ -4,7 +4,9 @@ """ from datetime import datetime from enum import Enum + import sqlalchemy + from critiquebrainz import db diff --git a/critiquebrainz/db/moderation_log_test.py b/critiquebrainz/db/moderation_log_test.py index 9f007e3af..6a0417e67 100644 --- a/critiquebrainz/db/moderation_log_test.py +++ b/critiquebrainz/db/moderation_log_test.py @@ -1,9 +1,9 @@ -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.moderation_log as db_moderation_log -from critiquebrainz.db.moderation_log import AdminActions -import critiquebrainz.db.users as db_users import critiquebrainz.db.license as db_license +import critiquebrainz.db.moderation_log as db_moderation_log import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase +from critiquebrainz.db.moderation_log import AdminActions from critiquebrainz.db.user import User diff --git a/critiquebrainz/db/oauth_client.py b/critiquebrainz/db/oauth_client.py index 36c542cf6..35db176a6 100644 --- a/critiquebrainz/db/oauth_client.py +++ b/critiquebrainz/db/oauth_client.py @@ -1,9 +1,9 @@ import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import exceptions as db_exceptions from critiquebrainz.utils import generate_string - CLIENT_ID_LENGTH = 20 CLIENT_SECRET_LENGTH = 40 diff --git a/critiquebrainz/db/oauth_client_test.py b/critiquebrainz/db/oauth_client_test.py index 3129e6d65..a7da77038 100644 --- a/critiquebrainz/db/oauth_client_test.py +++ b/critiquebrainz/db/oauth_client_test.py @@ -1,6 +1,6 @@ -from critiquebrainz.data.testing import DataTestCase import critiquebrainz.db.oauth_client as db_oauth_client import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db.exceptions import NoDataFoundException from critiquebrainz.db.user import User diff --git a/critiquebrainz/db/oauth_grant.py b/critiquebrainz/db/oauth_grant.py index a07d438d4..f48e96a02 100644 --- a/critiquebrainz/db/oauth_grant.py +++ b/critiquebrainz/db/oauth_grant.py @@ -1,4 +1,5 @@ import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import exceptions as db_exceptions diff --git a/critiquebrainz/db/oauth_grant_test.py b/critiquebrainz/db/oauth_grant_test.py index 66e06b1b3..4b55cf16d 100644 --- a/critiquebrainz/db/oauth_grant_test.py +++ b/critiquebrainz/db/oauth_grant_test.py @@ -1,9 +1,10 @@ from datetime import datetime, timedelta -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.oauth_grant as db_oauth_grant + +import critiquebrainz.db.exceptions as db_exceptions import critiquebrainz.db.oauth_client as db_oauth_client +import critiquebrainz.db.oauth_grant as db_oauth_grant import critiquebrainz.db.users as db_users -import critiquebrainz.db.exceptions as db_exceptions +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db.user import User @@ -45,7 +46,8 @@ def test_list(self): scopes=None, ) self.assertEqual(len(db_oauth_grant.list_grants(client_id=self.oauth_client["client_id"])), 1) - self.assertEqual(len(db_oauth_grant.list_grants(client_id=self.oauth_client["client_id"], code=oauth_grant["code"])), 1) + self.assertEqual( + len(db_oauth_grant.list_grants(client_id=self.oauth_client["client_id"], code=oauth_grant["code"])), 1) def test_delete(self): oauth_grant = db_oauth_grant.create( diff --git a/critiquebrainz/db/oauth_token.py b/critiquebrainz/db/oauth_token.py index fb497d331..2398074d6 100644 --- a/critiquebrainz/db/oauth_token.py +++ b/critiquebrainz/db/oauth_token.py @@ -1,4 +1,5 @@ import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import exceptions as db_exceptions diff --git a/critiquebrainz/db/oauth_token_test.py b/critiquebrainz/db/oauth_token_test.py index b6c42f4d6..eea4728c0 100644 --- a/critiquebrainz/db/oauth_token_test.py +++ b/critiquebrainz/db/oauth_token_test.py @@ -1,9 +1,10 @@ from datetime import datetime, timedelta -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.oauth_token as db_oauth_token + +import critiquebrainz.db.exceptions as db_exceptions import critiquebrainz.db.oauth_client as db_oauth_client +import critiquebrainz.db.oauth_token as db_oauth_token import critiquebrainz.db.users as db_users -import critiquebrainz.db.exceptions as db_exceptions +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db.user import User diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index 7405208e2..ba8d0e283 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -1,9 +1,11 @@ -from random import shuffle -from datetime import datetime, timedelta import uuid +from datetime import datetime, timedelta +from random import shuffle + +import pycountry import sqlalchemy from brainzutils import cache -import pycountry + from critiquebrainz import db from critiquebrainz.db import (exceptions as db_exceptions, revision as db_revision, @@ -24,7 +26,6 @@ "label", ] - supported_languages = [] for lang in list(pycountry.languages): if 'iso639_1_code' in dir(lang): diff --git a/critiquebrainz/db/review_test.py b/critiquebrainz/db/review_test.py index c070c9a3d..7b339d1fc 100644 --- a/critiquebrainz/db/review_test.py +++ b/critiquebrainz/db/review_test.py @@ -1,12 +1,14 @@ from unittest.mock import MagicMock + from brainzutils import cache -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.users as db_users -from critiquebrainz.db.user import User -import critiquebrainz.db.review as db_review -import critiquebrainz.db.revision as db_revision + import critiquebrainz.db.exceptions as db_exceptions import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review +import critiquebrainz.db.revision as db_revision +import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase +from critiquebrainz.db.user import User class ReviewTestCase(DataTestCase): diff --git a/critiquebrainz/db/revision.py b/critiquebrainz/db/revision.py index 772e51b0c..c12564ed7 100644 --- a/critiquebrainz/db/revision.py +++ b/critiquebrainz/db/revision.py @@ -1,10 +1,12 @@ from datetime import datetime + import sqlalchemy + from critiquebrainz import db -from critiquebrainz.db import review as db_review +from critiquebrainz.db import VALID_RATING_VALUES, RATING_SCALE_1_5, RATING_SCALE_0_100 from critiquebrainz.db import avg_rating as db_avg_rating from critiquebrainz.db import exceptions as db_exceptions -from critiquebrainz.db import VALID_RATING_VALUES, RATING_SCALE_1_5, RATING_SCALE_0_100 +from critiquebrainz.db import review as db_review def get(review_id, limit=1, offset=0): diff --git a/critiquebrainz/db/revision_test.py b/critiquebrainz/db/revision_test.py index 8be037e92..68da34aa8 100644 --- a/critiquebrainz/db/revision_test.py +++ b/critiquebrainz/db/revision_test.py @@ -1,10 +1,11 @@ from datetime import datetime -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.review as db_review -from critiquebrainz.db.user import User -from critiquebrainz.db import revision, vote + import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase +from critiquebrainz.db import revision, vote +from critiquebrainz.db.user import User class RevisionTestCase(DataTestCase): diff --git a/critiquebrainz/db/spam_report.py b/critiquebrainz/db/spam_report.py index 983d50a4f..28863688f 100644 --- a/critiquebrainz/db/spam_report.py +++ b/critiquebrainz/db/spam_report.py @@ -1,5 +1,7 @@ from datetime import datetime + import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import revision as db_revision @@ -181,7 +183,6 @@ def list_reports(**kwargs): if spam_reports: spam_reports = [dict(spam_report) for spam_report in spam_reports] for spam_report in spam_reports: - spam_report["review"] = { "user": { "id": spam_report.pop("review_user_id"), diff --git a/critiquebrainz/db/spam_report_test.py b/critiquebrainz/db/spam_report_test.py index 483eb6cc0..4a05b08a3 100644 --- a/critiquebrainz/db/spam_report_test.py +++ b/critiquebrainz/db/spam_report_test.py @@ -1,8 +1,8 @@ -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.spam_report as db_spam_report -import critiquebrainz.db.review as db_review import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review +import critiquebrainz.db.spam_report as db_spam_report import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db.user import User @@ -63,7 +63,8 @@ def test_list_reports(self): text="Updated Review", ) self.review = db_review.get_by_id(self.review["id"]) - db_spam_report.create(self.review["last_revision"]["id"], self.user1.id, "This is again a report on the updated review") + db_spam_report.create(self.review["last_revision"]["id"], self.user1.id, + "This is again a report on the updated review") # two reports on the old revision and one on the new revision. reports, count = db_spam_report.list_reports(review_id=self.review["id"]) # pylint: disable=unused-variable self.assertEqual(count, 3) diff --git a/critiquebrainz/db/statistics.py b/critiquebrainz/db/statistics.py index 41a1d6850..02767d5ef 100644 --- a/critiquebrainz/db/statistics.py +++ b/critiquebrainz/db/statistics.py @@ -17,10 +17,12 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from datetime import date, timedelta + import sqlalchemy from brainzutils import cache -from critiquebrainz import db + import critiquebrainz.db.exceptions as db_exceptions +from critiquebrainz import db _CACHE_NAMESPACE = "cb_statistics" _DEFAULT_CACHE_EXPIRATION = 1 * 60 * 60 # seconds (1 hour) @@ -47,7 +49,7 @@ def merge_rows(list_1, list_2, key): return list(merged.values()) -def get_users_with_review_count(from_date=date(1970, 1, 1), to_date=date.today()+timedelta(1)): +def get_users_with_review_count(from_date=date(1970, 1, 1), to_date=date.today() + timedelta(1)): """ Gets list of users with number of reviews they've submitted Args: @@ -88,7 +90,7 @@ def get_users_with_review_count(from_date=date(1970, 1, 1), to_date=date.today() return reviewers -def get_users_with_vote_count(from_date=date(1970, 1, 1), to_date=date.today()+timedelta(1)): +def get_users_with_vote_count(from_date=date(1970, 1, 1), to_date=date.today() + timedelta(1)): """ Gets list of users with number of votes they've submitted Args: @@ -127,7 +129,7 @@ def get_users_with_vote_count(from_date=date(1970, 1, 1), to_date=date.today()+t return voters -def get_users_with_comment_count(from_date=date(1970, 1, 1), to_date=date.today()+timedelta(1)): +def get_users_with_comment_count(from_date=date(1970, 1, 1), to_date=date.today() + timedelta(1)): """ Gets list of users with number of comments they've submitted Args: @@ -171,7 +173,7 @@ def get_users_with_comment_count(from_date=date(1970, 1, 1), to_date=date.today( return commenters -def get_top_users(from_date=date(1970, 1, 1), to_date=date.today()+timedelta(1), review_weight=1, +def get_top_users(from_date=date(1970, 1, 1), to_date=date.today() + timedelta(1), review_weight=1, comment_weight=1, vote_weight=1, limit=10): """ Gets list of top contributors based on number of reviews, votes and comments along with their final scores. @@ -208,7 +210,8 @@ def get_top_users(from_date=date(1970, 1, 1), to_date=date.today()+timedelta(1), # add 'score' for each user for user in top_scorers: user["id"] = str(user["id"]) - user["score"] = user["review_count"]*review_weight + user["comment_count"]*comment_weight + user["vote_count"]*vote_weight + user["score"] = user["review_count"] * review_weight + user["comment_count"] * comment_weight + user[ + "vote_count"] * vote_weight # sort top_users by 'score' in descending order and keep only top 'limit' users top_scorers = sorted(top_scorers, key=lambda row: row["score"], reverse=True)[:limit] diff --git a/critiquebrainz/db/statistics_test.py b/critiquebrainz/db/statistics_test.py index d376d5228..f19b042d4 100644 --- a/critiquebrainz/db/statistics_test.py +++ b/critiquebrainz/db/statistics_test.py @@ -17,15 +17,17 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from unittest.mock import MagicMock + from brainzutils import cache -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.users as db_users -from critiquebrainz.db.user import User -import critiquebrainz.db.review as db_review -import critiquebrainz.db.vote as db_vote + import critiquebrainz.db.comment as db_comment import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review import critiquebrainz.db.statistics as db_statistics +import critiquebrainz.db.users as db_users +import critiquebrainz.db.vote as db_vote +from critiquebrainz.data.testing import DataTestCase +from critiquebrainz.db.user import User class StatisticsTestCase(DataTestCase): diff --git a/critiquebrainz/db/user.py b/critiquebrainz/db/user.py index 4401ce3db..531bfd114 100644 --- a/critiquebrainz/db/user.py +++ b/critiquebrainz/db/user.py @@ -1,11 +1,11 @@ from datetime import date, timedelta + from critiquebrainz.data.mixins import AdminMixin -from critiquebrainz.db import users as db_users from critiquebrainz.data.user_types import user_types +from critiquebrainz.db import users as db_users class User(AdminMixin): - # a list of allowed values of `inc` parameter in API calls allowed_includes = ('user_type', 'stats') @@ -91,6 +91,7 @@ def get_user_type(user): for user_type in user_types: if user_type.is_instance(user): return user_type + if hasattr(self, '_user_type') is False: self._user_type = get_user_type(self) return self._user_type diff --git a/critiquebrainz/db/users.py b/critiquebrainz/db/users.py index e37c4091b..ce0e2507b 100644 --- a/critiquebrainz/db/users.py +++ b/critiquebrainz/db/users.py @@ -1,7 +1,9 @@ -from datetime import datetime import uuid +from datetime import datetime from hashlib import md5 + import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import revision as db_revision diff --git a/critiquebrainz/db/users_test.py b/critiquebrainz/db/users_test.py index fc398e32b..02f3ed517 100644 --- a/critiquebrainz/db/users_test.py +++ b/critiquebrainz/db/users_test.py @@ -1,16 +1,17 @@ from datetime import datetime, date, timedelta from uuid import UUID -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.users as db_users -from critiquebrainz.db.users import gravatar_url, get_many_by_mb_username -import critiquebrainz.db.review as db_review -import critiquebrainz.db.spam_report as db_spam_report -import critiquebrainz.db.vote as db_vote + import critiquebrainz.db.comment as db_comment import critiquebrainz.db.license as db_license import critiquebrainz.db.oauth_client as db_oauth_client import critiquebrainz.db.oauth_token as db_oauth_token +import critiquebrainz.db.review as db_review +import critiquebrainz.db.spam_report as db_spam_report +import critiquebrainz.db.users as db_users +import critiquebrainz.db.vote as db_vote +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db.user import User +from critiquebrainz.db.users import gravatar_url, get_many_by_mb_username class UserTestCase(DataTestCase): @@ -163,7 +164,6 @@ def test_update(self): self.assertEqual(user1['email'], 'foo@foo.com') def test_delete(self): - user1_id = self.user1.id db_users.delete(self.user1.id) # Votes should be deleted as well diff --git a/critiquebrainz/db/vote.py b/critiquebrainz/db/vote.py index 0bcf660bd..3f9eaa1b7 100644 --- a/critiquebrainz/db/vote.py +++ b/critiquebrainz/db/vote.py @@ -1,5 +1,7 @@ from datetime import datetime + import sqlalchemy + from critiquebrainz import db from critiquebrainz.db import exceptions as db_exceptions diff --git a/critiquebrainz/db/vote_test.py b/critiquebrainz/db/vote_test.py index c653a4cd2..e70de8f04 100644 --- a/critiquebrainz/db/vote_test.py +++ b/critiquebrainz/db/vote_test.py @@ -1,9 +1,10 @@ from datetime import datetime from uuid import UUID -from critiquebrainz.data.testing import DataTestCase -import critiquebrainz.db.users as db_users -import critiquebrainz.db.review as db_review + import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users +from critiquebrainz.data.testing import DataTestCase from critiquebrainz.db import exceptions from critiquebrainz.db import vote from critiquebrainz.db.user import User diff --git a/critiquebrainz/decorators.py b/critiquebrainz/decorators.py index 952710664..c9440e1a0 100644 --- a/critiquebrainz/decorators.py +++ b/critiquebrainz/decorators.py @@ -1,5 +1,6 @@ -from functools import wraps, update_wrapper from datetime import timedelta +from functools import wraps, update_wrapper + from flask import request, current_app, make_response @@ -16,6 +17,7 @@ def decorated_function(*args, **kwargs): for header, value in headers.items(): h[header] = value return resp + return decorated_function return decorator @@ -26,6 +28,7 @@ def nocache(f): @add_response_headers({'Cache-Control': 'no-store'}) def decorated_function(*args, **kwargs): return f(*args, **kwargs) + return decorated_function @@ -69,4 +72,5 @@ def wrapped_function(*args, **kwargs): f.provide_automatic_options = False return update_wrapper(wrapped_function, f) + return decorator diff --git a/critiquebrainz/frontend/__init__.py b/critiquebrainz/frontend/__init__.py index 2cb560889..9d2754f99 100644 --- a/critiquebrainz/frontend/__init__.py +++ b/critiquebrainz/frontend/__init__.py @@ -2,6 +2,7 @@ import os import sys from time import sleep + from brainzutils.flask import CustomFlask from flask import send_from_directory @@ -32,7 +33,8 @@ def create_app(debug=None, config_path=None): sleep(1) if not os.path.exists(config_file): - print("No configuration file generated yet. Retried {} times, exiting.".format(CONSUL_CONFIG_FILE_RETRY_COUNT)) + print("No configuration file generated yet. Retried {} times, exiting.".format( + CONSUL_CONFIG_FILE_RETRY_COUNT)) sys.exit(-1) print("Loading consul config file {}".format(config_file)) @@ -76,8 +78,8 @@ def create_app(debug=None, config_path=None): # Redis (cache) from brainzutils import cache if "REDIS_HOST" in app.config and \ - "REDIS_PORT" in app.config and \ - "REDIS_NAMESPACE" in app.config: + "REDIS_PORT" in app.config and \ + "REDIS_NAMESPACE" in app.config: cache.init( host=app.config["REDIS_HOST"], port=app.config["REDIS_PORT"], @@ -178,7 +180,6 @@ def create_app(debug=None, config_path=None): def add_robots(app): - @app.route('/robots.txt') def robots_txt(): # pylint: disable=unused-variable return send_from_directory(app.static_folder, 'robots.txt') diff --git a/critiquebrainz/frontend/error_handlers.py b/critiquebrainz/frontend/error_handlers.py index 28c389d68..26720fe2b 100644 --- a/critiquebrainz/frontend/error_handlers.py +++ b/critiquebrainz/frontend/error_handlers.py @@ -15,7 +15,6 @@ def get_sentry_event_id(): def init_error_handlers(app): - @app.errorhandler(400) def bad_request(error): return render_template('errors/400.html', error=error), 400 diff --git a/critiquebrainz/frontend/external/mbspotify.py b/critiquebrainz/frontend/external/mbspotify.py index 1c2d1c95c..84f9fd818 100644 --- a/critiquebrainz/frontend/external/mbspotify.py +++ b/critiquebrainz/frontend/external/mbspotify.py @@ -4,11 +4,13 @@ Source code of mbspotify is available at https://github.com/metabrainz/mbspotify. """ import json + import requests -from requests.exceptions import RequestException -from requests.adapters import HTTPAdapter -from flask_babel import lazy_gettext from brainzutils import cache +from flask_babel import lazy_gettext +from requests.adapters import HTTPAdapter +from requests.exceptions import RequestException + from critiquebrainz.frontend import flash _base_url = "" diff --git a/critiquebrainz/frontend/external/musicbrainz.py b/critiquebrainz/frontend/external/musicbrainz.py index 492bad6e9..a3c625cd4 100644 --- a/critiquebrainz/frontend/external/musicbrainz.py +++ b/critiquebrainz/frontend/external/musicbrainz.py @@ -8,7 +8,6 @@ """ import musicbrainzngs - DEFAULT_CACHE_EXPIRATION = 12 * 60 * 60 # seconds (12 hours) THREAD_POOL_PROCESSES = 10 diff --git a/critiquebrainz/frontend/external/musicbrainz_db/artist.py b/critiquebrainz/frontend/external/musicbrainz_db/artist.py index d72bf8364..ebdc988ff 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/artist.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/artist.py @@ -1,5 +1,6 @@ from brainzutils import cache from brainzutils.musicbrainz_db.artist import fetch_multiple_artists + from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import artist as artist_rel diff --git a/critiquebrainz/frontend/external/musicbrainz_db/entities.py b/critiquebrainz/frontend/external/musicbrainz_db/entities.py index b8b12d481..b28827627 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/entities.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/entities.py @@ -1,14 +1,15 @@ -from brainzutils.musicbrainz_db.work import fetch_multiple_works from brainzutils.musicbrainz_db.artist import fetch_multiple_artists +from brainzutils.musicbrainz_db.event import fetch_multiple_events from brainzutils.musicbrainz_db.label import fetch_multiple_labels from brainzutils.musicbrainz_db.place import fetch_multiple_places -from brainzutils.musicbrainz_db.event import fetch_multiple_events from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups -from critiquebrainz.frontend.external.musicbrainz_db.release_group import get_release_group_by_id -from critiquebrainz.frontend.external.musicbrainz_db.place import get_place_by_id +from brainzutils.musicbrainz_db.work import fetch_multiple_works + +from critiquebrainz.frontend.external.musicbrainz_db.artist import get_artist_by_id from critiquebrainz.frontend.external.musicbrainz_db.event import get_event_by_id from critiquebrainz.frontend.external.musicbrainz_db.label import get_label_by_id -from critiquebrainz.frontend.external.musicbrainz_db.artist import get_artist_by_id +from critiquebrainz.frontend.external.musicbrainz_db.place import get_place_by_id +from critiquebrainz.frontend.external.musicbrainz_db.release_group import get_release_group_by_id from critiquebrainz.frontend.external.musicbrainz_db.work import get_work_by_id diff --git a/critiquebrainz/frontend/external/musicbrainz_db/event.py b/critiquebrainz/frontend/external/musicbrainz_db/event.py index 06cd2c70c..3c7662d3d 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/event.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/event.py @@ -1,5 +1,6 @@ from brainzutils import cache from brainzutils.musicbrainz_db.event import fetch_multiple_events + from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION diff --git a/critiquebrainz/frontend/external/musicbrainz_db/helpers.py b/critiquebrainz/frontend/external/musicbrainz_db/helpers.py index 2ddd90ab1..6be40b2dd 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/helpers.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/helpers.py @@ -1,7 +1,8 @@ -from mbdata.utils.models import get_link_model from mbdata.models import Tag -from sqlalchemy.orm import joinedload +from mbdata.utils.models import get_link_model from sqlalchemy import func +from sqlalchemy.orm import joinedload + from critiquebrainz.frontend.external.musicbrainz_db.utils import ENTITY_MODELS @@ -22,17 +23,19 @@ def get_relationship_info(*, db, target_type, source_type, source_entity_ids, in target_model = ENTITY_MODELS[target_type] relation = get_link_model(source_model, target_model) - query = db.query(relation).\ - options(joinedload("link", innerjoin=True)).\ + query = db.query(relation). \ + options(joinedload("link", innerjoin=True)). \ options(joinedload("link.link_type", innerjoin=True)) if relation.entity0.property.mapper.class_ == relation.entity1.property.mapper.class_: _relationship_link_helper(relation, query, "entity0", "entity1", target_type, source_entity_ids, includes_data) _relationship_link_helper(relation, query, "entity1", "entity0", target_type, source_entity_ids, includes_data) else: if source_model == relation.entity0.property.mapper.class_: - _relationship_link_helper(relation, query, "entity0", "entity1", target_type, source_entity_ids, includes_data) + _relationship_link_helper(relation, query, "entity0", "entity1", target_type, source_entity_ids, + includes_data) else: - _relationship_link_helper(relation, query, "entity1", "entity0", target_type, source_entity_ids, includes_data) + _relationship_link_helper(relation, query, "entity1", "entity0", target_type, source_entity_ids, + includes_data) def _relationship_link_helper(relation, query, source_attr, target_attr, target_type, source_entity_ids, includes_data): @@ -55,7 +58,7 @@ def _relationship_link_helper(relation, query, source_attr, target_attr, target_ query = query.options(joinedload(target_attr, innerjoin=True)) relation_type = target_type + "-rels" for link in query: - includes_data[getattr(link, source_id_attr)].setdefault('relationship_objs', {}).\ + includes_data[getattr(link, source_id_attr)].setdefault('relationship_objs', {}). \ setdefault(relation_type, []).append(link) @@ -72,10 +75,10 @@ def get_tags(*, db, entity_model, tag_model, foreign_tag_id, entity_ids): Returns: List of tuples containing the entity_ids and the list of associated tags. """ - tags = db.query(entity_model.id, func.array_agg(Tag.name)).\ - join(tag_model, entity_model.id == foreign_tag_id).\ - join(Tag).\ - filter(entity_model.id.in_(entity_ids)).\ - group_by(entity_model.id).\ + tags = db.query(entity_model.id, func.array_agg(Tag.name)). \ + join(tag_model, entity_model.id == foreign_tag_id). \ + join(Tag). \ + filter(entity_model.id.in_(entity_ids)). \ + group_by(entity_model.id). \ all() return tags diff --git a/critiquebrainz/frontend/external/musicbrainz_db/includes.py b/critiquebrainz/frontend/external/musicbrainz_db/includes.py index 325d83ea9..5626db772 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/includes.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/includes.py @@ -21,9 +21,8 @@ 'place': ["aliases", "annotation"] + RELATION_INCLUDES + TAG_INCLUDES, 'event': ["aliases"] + RELATION_INCLUDES + TAG_INCLUDES, 'release_group': ["artists", "media", "releases"] + TAG_INCLUDES + RELATION_INCLUDES, - 'release': [ - "artists", "labels", "recordings", "release-groups", "media", "annotation", "aliases" - ] + TAG_INCLUDES + RELATION_INCLUDES, + 'release': ["artists", "labels", "recordings", "release-groups", "media", "annotation", "aliases"] + + TAG_INCLUDES + RELATION_INCLUDES, 'artist': ["recordings", "releases", "media", "aliases", "annotation"] + RELATION_INCLUDES + TAG_INCLUDES, } diff --git a/critiquebrainz/frontend/external/musicbrainz_db/label.py b/critiquebrainz/frontend/external/musicbrainz_db/label.py index 0cb48995b..241452a96 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/label.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/label.py @@ -1,5 +1,6 @@ from brainzutils import cache from brainzutils.musicbrainz_db.label import fetch_multiple_labels + from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import label as label_rel diff --git a/critiquebrainz/frontend/external/musicbrainz_db/place.py b/critiquebrainz/frontend/external/musicbrainz_db/place.py index aa40d9e75..fa525afac 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/place.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/place.py @@ -1,5 +1,6 @@ from brainzutils import cache from brainzutils.musicbrainz_db.place import fetch_multiple_places + from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import place as place_rel diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release.py b/critiquebrainz/frontend/external/musicbrainz_db/release.py index 37176aa68..a63033f31 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release.py @@ -1,5 +1,6 @@ from brainzutils import cache from brainzutils.musicbrainz_db.release import fetch_multiple_releases + from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py index 62549f3b0..243f1397b 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py @@ -1,7 +1,8 @@ from brainzutils import cache from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups, get_release_groups_for_artist -from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION + import critiquebrainz.frontend.external.relationships.release_group as release_group_rel +from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION def get_release_group_by_id(mbid): diff --git a/critiquebrainz/frontend/external/musicbrainz_db/serialize.py b/critiquebrainz/frontend/external/musicbrainz_db/serialize.py index ca0c54eec..aae40c6f0 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/serialize.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/serialize.py @@ -1,4 +1,5 @@ from mbdata.utils.models import get_link_target + from critiquebrainz.frontend.external.musicbrainz_db.utils import ENTITY_MODELS diff --git a/critiquebrainz/frontend/external/musicbrainz_db/utils.py b/critiquebrainz/frontend/external/musicbrainz_db/utils.py index 3bc698209..7fdfbd1fe 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/utils.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/utils.py @@ -1,8 +1,8 @@ from mbdata import models + import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -from critiquebrainz.frontend.external.musicbrainz_db import special_entities from critiquebrainz.db.review import reviewed_entities, ENTITY_TYPES as CB_ENTITIES - +from critiquebrainz.frontend.external.musicbrainz_db import special_entities # Entity models ENTITY_MODELS = { @@ -15,7 +15,6 @@ 'url': models.URL, } - # Redirect models REDIRECT_MODELS = { 'place': models.PlaceGIDRedirect, @@ -84,5 +83,6 @@ def get_entities_by_gids(*, query, entity_type, mbids): remaining_gids = list(set(remaining_gids) - set(reviewed_gids)) if remaining_gids: - raise mb_exceptions.NoDataFoundException("Couldn't find entities with IDs: {mbids}".format(mbids=remaining_gids)) + raise mb_exceptions.NoDataFoundException( + "Couldn't find entities with IDs: {mbids}".format(mbids=remaining_gids)) return entities diff --git a/critiquebrainz/frontend/external/musicbrainz_db/work.py b/critiquebrainz/frontend/external/musicbrainz_db/work.py index 7c017f8b5..e0e0e4d4a 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/work.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/work.py @@ -1,5 +1,6 @@ from brainzutils import cache from brainzutils.musicbrainz_db.work import fetch_multiple_works + from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION diff --git a/critiquebrainz/frontend/external/relationships/artist.py b/critiquebrainz/frontend/external/relationships/artist.py index 009e19141..d6cd4cd98 100644 --- a/critiquebrainz/frontend/external/relationships/artist.py +++ b/critiquebrainz/frontend/external/relationships/artist.py @@ -2,6 +2,7 @@ Relationship processor for artist entity. """ import urllib.parse + from flask_babel import lazy_gettext diff --git a/critiquebrainz/frontend/external/relationships/label.py b/critiquebrainz/frontend/external/relationships/label.py index 150684f43..200119872 100644 --- a/critiquebrainz/frontend/external/relationships/label.py +++ b/critiquebrainz/frontend/external/relationships/label.py @@ -2,6 +2,7 @@ Relationship processor for label entity. """ import urllib.parse + from flask_babel import lazy_gettext diff --git a/critiquebrainz/frontend/external/relationships/release_group.py b/critiquebrainz/frontend/external/relationships/release_group.py index dd2f3ccda..ff84bb8c0 100644 --- a/critiquebrainz/frontend/external/relationships/release_group.py +++ b/critiquebrainz/frontend/external/relationships/release_group.py @@ -2,6 +2,7 @@ Relationship processor for release group entity. """ import urllib.parse + from flask_babel import lazy_gettext diff --git a/critiquebrainz/frontend/external/soundcloud.py b/critiquebrainz/frontend/external/soundcloud.py index 84f4fc053..3c242faa6 100644 --- a/critiquebrainz/frontend/external/soundcloud.py +++ b/critiquebrainz/frontend/external/soundcloud.py @@ -1,4 +1,5 @@ import re + import brainzutils.musicbrainz_db.release as mb_release diff --git a/critiquebrainz/frontend/external/spotify.py b/critiquebrainz/frontend/external/spotify.py index 0dd74e721..5563634c5 100644 --- a/critiquebrainz/frontend/external/spotify.py +++ b/critiquebrainz/frontend/external/spotify.py @@ -3,14 +3,16 @@ More information about it is available at https://developer.spotify.com/web-api/. """ -from base64 import b64encode -from typing import List -from http import HTTPStatus import logging import urllib.parse +from base64 import b64encode +from http import HTTPStatus +from typing import List + import requests from brainzutils import cache from flask import current_app as app + from critiquebrainz.frontend.external.exceptions import ExternalServiceException _DEFAULT_CACHE_EXPIRATION = 12 * 60 * 60 # seconds (12 hours) diff --git a/critiquebrainz/frontend/external/spotify_test.py b/critiquebrainz/frontend/external/spotify_test.py index 6099a9367..f10d3b539 100644 --- a/critiquebrainz/frontend/external/spotify_test.py +++ b/critiquebrainz/frontend/external/spotify_test.py @@ -1,9 +1,11 @@ -from unittest.mock import MagicMock from http import HTTPStatus +from unittest.mock import MagicMock + import requests from brainzutils import cache -from critiquebrainz.frontend.testing import FrontendTestCase + from critiquebrainz.frontend.external import spotify +from critiquebrainz.frontend.testing import FrontendTestCase class MockResponse: diff --git a/critiquebrainz/frontend/login/__init__.py b/critiquebrainz/frontend/login/__init__.py index 6fe258a22..956d4b7a7 100644 --- a/critiquebrainz/frontend/login/__init__.py +++ b/critiquebrainz/frontend/login/__init__.py @@ -4,12 +4,14 @@ It is based on OAuth2 protocol. MusicBrainz is the only supported provider. """ from functools import wraps + from flask import redirect, url_for -from flask_login import LoginManager, current_user from flask_babel import lazy_gettext, gettext +from flask_login import LoginManager, current_user from werkzeug.exceptions import Unauthorized -from critiquebrainz.data.mixins import AnonymousUser + import critiquebrainz.db.users as db_users +from critiquebrainz.data.mixins import AnonymousUser from critiquebrainz.db.user import User mb_auth = None diff --git a/critiquebrainz/frontend/login/provider.py b/critiquebrainz/frontend/login/provider.py index 41af1f0b8..870c09fba 100644 --- a/critiquebrainz/frontend/login/provider.py +++ b/critiquebrainz/frontend/login/provider.py @@ -1,9 +1,10 @@ import json -from rauth import OAuth2Service + from flask import request, session, url_for +from rauth import OAuth2Service -from critiquebrainz.db.user import User import critiquebrainz.db.users as db_users +from critiquebrainz.db.user import User from critiquebrainz.utils import generate_string diff --git a/critiquebrainz/frontend/static_manager.py b/critiquebrainz/frontend/static_manager.py index 53b98901c..04ceb67b4 100644 --- a/critiquebrainz/frontend/static_manager.py +++ b/critiquebrainz/frontend/static_manager.py @@ -1,5 +1,5 @@ -import os.path import json +import os.path MANIFEST_PATH = os.path.join(os.path.dirname(__file__), "static", "build", "manifest.json") @@ -14,7 +14,6 @@ def read_manifest(): def get_static_path(resource_name): - if resource_name not in manifest_content: return "/static/%s" % resource_name return "/static/build/%s" % manifest_content[resource_name] diff --git a/critiquebrainz/frontend/testing.py b/critiquebrainz/frontend/testing.py index c25bda930..b02971893 100644 --- a/critiquebrainz/frontend/testing.py +++ b/critiquebrainz/frontend/testing.py @@ -1,7 +1,9 @@ import os + from flask_testing import TestCase -from critiquebrainz.frontend import create_app + from critiquebrainz.data.utils import create_all, drop_tables, drop_types +from critiquebrainz.frontend import create_app class FrontendTestCase(TestCase): diff --git a/critiquebrainz/frontend/views/artist.py b/critiquebrainz/frontend/views/artist.py index b343adc34..2e66b5301 100644 --- a/critiquebrainz/frontend/views/artist.py +++ b/critiquebrainz/frontend/views/artist.py @@ -1,11 +1,13 @@ from collections import OrderedDict + from flask import Blueprint, render_template, request, redirect, url_for from flask_babel import gettext from werkzeug.exceptions import BadRequest, NotFound + import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.artist as mb_artist -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group from critiquebrainz.frontend.views import BROWSE_RELEASE_GROUPS_LIMIT, ARTIST_REVIEWS_LIMIT artist_bp = Blueprint('artist', __name__) diff --git a/critiquebrainz/frontend/views/comment.py b/critiquebrainz/frontend/views/comment.py index d2f823d8e..ed59e686f 100644 --- a/critiquebrainz/frontend/views/comment.py +++ b/critiquebrainz/frontend/views/comment.py @@ -17,16 +17,16 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from flask import Blueprint, redirect, url_for, render_template, request -from flask_login import current_user, login_required from flask_babel import gettext +from flask_login import current_user, login_required from markdown import markdown from werkzeug.exceptions import Unauthorized, NotFound + +import critiquebrainz.db.comment as db_comment +from critiquebrainz.db import exceptions as db_exceptions from critiquebrainz.frontend import flash from critiquebrainz.frontend.forms.comment import CommentEditForm from critiquebrainz.frontend.views.review import get_review_or_404 -from critiquebrainz.db import exceptions as db_exceptions -import critiquebrainz.db.comment as db_comment - comment_bp = Blueprint('comment', __name__) diff --git a/critiquebrainz/frontend/views/event.py b/critiquebrainz/frontend/views/event.py index 500df0517..31cb8ce20 100644 --- a/critiquebrainz/frontend/views/event.py +++ b/critiquebrainz/frontend/views/event.py @@ -18,17 +18,18 @@ from itertools import groupby from operator import itemgetter + from flask import Blueprint, render_template, request -from flask_login import current_user from flask_babel import gettext +from flask_login import current_user from werkzeug.exceptions import NotFound + import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.event as mb_event import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions from critiquebrainz.frontend.forms.rate import RatingEditForm from critiquebrainz.frontend.views import get_avg_rating - event_bp = Blueprint('event', __name__) diff --git a/critiquebrainz/frontend/views/index.py b/critiquebrainz/frontend/views/index.py index 2d784cef8..58a830f02 100644 --- a/critiquebrainz/frontend/views/index.py +++ b/critiquebrainz/frontend/views/index.py @@ -1,9 +1,10 @@ +from bs4 import BeautifulSoup from flask import Blueprint, render_template from flask_babel import format_number -from bs4 import BeautifulSoup from markdown import markdown -import critiquebrainz.db.users as db_users + import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users DEFAULT_CACHE_EXPIRATION = 10 * 60 # seconds diff --git a/critiquebrainz/frontend/views/label.py b/critiquebrainz/frontend/views/label.py index 86a46e43e..bf47a78a5 100644 --- a/critiquebrainz/frontend/views/label.py +++ b/critiquebrainz/frontend/views/label.py @@ -1,13 +1,13 @@ from flask import Blueprint, render_template, request -from werkzeug.exceptions import NotFound -from flask_login import current_user from flask_babel import gettext +from flask_login import current_user +from werkzeug.exceptions import NotFound + import critiquebrainz.db.review as db_review -import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -from critiquebrainz.frontend.views import get_avg_rating, LABEL_REVIEWS_LIMIT +import critiquebrainz.frontend.external.musicbrainz_db.label as mb_label from critiquebrainz.frontend.forms.rate import RatingEditForm - +from critiquebrainz.frontend.views import get_avg_rating, LABEL_REVIEWS_LIMIT label_bp = Blueprint('label', __name__) diff --git a/critiquebrainz/frontend/views/log.py b/critiquebrainz/frontend/views/log.py index 58a76920a..9eeaea3ee 100644 --- a/critiquebrainz/frontend/views/log.py +++ b/critiquebrainz/frontend/views/log.py @@ -1,6 +1,8 @@ from itertools import groupby + from flask import Blueprint, render_template, request, jsonify from flask_babel import gettext + import critiquebrainz.db.moderation_log as db_moderation_log from critiquebrainz.frontend import flash diff --git a/critiquebrainz/frontend/views/login.py b/critiquebrainz/frontend/views/login.py index df2d7512d..40a3d1ba7 100644 --- a/critiquebrainz/frontend/views/login.py +++ b/critiquebrainz/frontend/views/login.py @@ -1,8 +1,9 @@ from flask import Blueprint, request, redirect, render_template, url_for, session -from flask_login import login_user, logout_user, login_required from flask_babel import gettext -from critiquebrainz.frontend.login import mb_auth, login_forbidden +from flask_login import login_user, logout_user, login_required + from critiquebrainz.frontend import flash +from critiquebrainz.frontend.login import mb_auth, login_forbidden login_bp = Blueprint('login', __name__) diff --git a/critiquebrainz/frontend/views/mapping.py b/critiquebrainz/frontend/views/mapping.py index d362637bd..c4f7cbc30 100644 --- a/critiquebrainz/frontend/views/mapping.py +++ b/critiquebrainz/frontend/views/mapping.py @@ -6,19 +6,21 @@ pages. See https://github.com/metabrainz/mbspotify for more info about this project. """ -import urllib.parse import os.path import string +import urllib.parse + from flask import Blueprint, render_template, request, url_for, redirect, current_app -from flask_login import login_required, current_user from flask_babel import gettext +from flask_login import login_required, current_user from werkzeug.exceptions import NotFound, BadRequest, ServiceUnavailable -import critiquebrainz.frontend.external.spotify as spotify_api -from critiquebrainz.frontend.external.exceptions import ExternalServiceException -from critiquebrainz.frontend.external import mbspotify -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group + import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group +import critiquebrainz.frontend.external.spotify as spotify_api from critiquebrainz.frontend import flash +from critiquebrainz.frontend.external import mbspotify +from critiquebrainz.frontend.external.exceptions import ExternalServiceException mapping_bp = Blueprint('mapping', __name__) diff --git a/critiquebrainz/frontend/views/moderators.py b/critiquebrainz/frontend/views/moderators.py index 04db5af98..986d14f1a 100644 --- a/critiquebrainz/frontend/views/moderators.py +++ b/critiquebrainz/frontend/views/moderators.py @@ -1,5 +1,6 @@ from flask import Blueprint, render_template from flask import current_app + from critiquebrainz.db import users as db_users from critiquebrainz.db.users import gravatar_url diff --git a/critiquebrainz/frontend/views/oauth.py b/critiquebrainz/frontend/views/oauth.py index 54682e74b..b33c705ef 100644 --- a/critiquebrainz/frontend/views/oauth.py +++ b/critiquebrainz/frontend/views/oauth.py @@ -1,9 +1,9 @@ from flask import Blueprint, render_template, redirect, request from flask_login import login_required, current_user +import critiquebrainz.db.oauth_client as db_oauth_client from critiquebrainz.utils import build_url from critiquebrainz.ws.oauth import oauth -import critiquebrainz.db.oauth_client as db_oauth_client oauth_bp = Blueprint('oauth', __name__) diff --git a/critiquebrainz/frontend/views/place.py b/critiquebrainz/frontend/views/place.py index 53506ce33..75f0f90c2 100644 --- a/critiquebrainz/frontend/views/place.py +++ b/critiquebrainz/frontend/views/place.py @@ -17,14 +17,15 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from flask import Blueprint, render_template, request -from flask_login import current_user from flask_babel import gettext +from flask_login import current_user from werkzeug.exceptions import NotFound -import critiquebrainz.frontend.external.musicbrainz_db.place as mb_place + +import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +import critiquebrainz.frontend.external.musicbrainz_db.place as mb_place from critiquebrainz.frontend.forms.rate import RatingEditForm from critiquebrainz.frontend.views import get_avg_rating -import critiquebrainz.db.review as db_review place_bp = Blueprint('place', __name__) diff --git a/critiquebrainz/frontend/views/profile.py b/critiquebrainz/frontend/views/profile.py index 1a8acc305..1787e1cb0 100644 --- a/critiquebrainz/frontend/views/profile.py +++ b/critiquebrainz/frontend/views/profile.py @@ -1,8 +1,8 @@ from flask import Blueprint, render_template, request, redirect, url_for from flask_babel import gettext from flask_login import login_required, current_user -import critiquebrainz.db.users as db_users +import critiquebrainz.db.users as db_users from critiquebrainz.frontend import flash from critiquebrainz.frontend.forms.profile import ProfileEditForm diff --git a/critiquebrainz/frontend/views/profile_apps.py b/critiquebrainz/frontend/views/profile_apps.py index a9b8e053b..fee6427f5 100644 --- a/critiquebrainz/frontend/views/profile_apps.py +++ b/critiquebrainz/frontend/views/profile_apps.py @@ -3,12 +3,12 @@ from flask_login import login_required, current_user from werkzeug.exceptions import NotFound -import critiquebrainz.db.oauth_client as db_oauth_client import critiquebrainz.db.exceptions as db_exceptions +import critiquebrainz.db.oauth_client as db_oauth_client import critiquebrainz.db.oauth_token as db_oauth_token -from critiquebrainz.frontend.forms.profile_apps import ApplicationForm -from critiquebrainz.frontend import flash import critiquebrainz.db.users as db_users +from critiquebrainz.frontend import flash +from critiquebrainz.frontend.forms.profile_apps import ApplicationForm profile_apps_bp = Blueprint('profile_applications', __name__) diff --git a/critiquebrainz/frontend/views/rate.py b/critiquebrainz/frontend/views/rate.py index 090ed0f34..71e22ccc7 100644 --- a/critiquebrainz/frontend/views/rate.py +++ b/critiquebrainz/frontend/views/rate.py @@ -17,9 +17,10 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from flask import Blueprint, redirect, url_for -from werkzeug.exceptions import BadRequest -from flask_login import current_user, login_required from flask_babel import gettext +from flask_login import current_user, login_required +from werkzeug.exceptions import BadRequest + import critiquebrainz.db.review as db_review from critiquebrainz.frontend import flash from critiquebrainz.frontend.forms.rate import RatingEditForm diff --git a/critiquebrainz/frontend/views/release.py b/critiquebrainz/frontend/views/release.py index 3b0c1ea54..d08f95f11 100644 --- a/critiquebrainz/frontend/views/release.py +++ b/critiquebrainz/frontend/views/release.py @@ -1,6 +1,7 @@ from flask import Blueprint, redirect from flask_babel import gettext from werkzeug.exceptions import NotFound + import critiquebrainz.frontend.external.musicbrainz_db.release as mb_release release_bp = Blueprint('release', __name__) diff --git a/critiquebrainz/frontend/views/release_group.py b/critiquebrainz/frontend/views/release_group.py index c36171e80..4a3163a1e 100644 --- a/critiquebrainz/frontend/views/release_group.py +++ b/critiquebrainz/frontend/views/release_group.py @@ -17,18 +17,18 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from flask import Blueprint, render_template, request -from flask_login import current_user from flask_babel import gettext +from flask_login import current_user from werkzeug.exceptions import NotFound -from critiquebrainz.frontend.external import mbspotify, soundcloud -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group + +import critiquebrainz.db.review as db_review import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions import critiquebrainz.frontend.external.musicbrainz_db.release as mb_release -import critiquebrainz.db.review as db_review +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group +from critiquebrainz.frontend.external import mbspotify, soundcloud from critiquebrainz.frontend.forms.rate import RatingEditForm from critiquebrainz.frontend.views import get_avg_rating - release_group_bp = Blueprint('release_group', __name__) @@ -81,7 +81,8 @@ def entity(id): rating_form = RatingEditForm(entity_id=id, entity_type='release_group') rating_form.rating.data = my_review['rating'] if my_review else None - return render_template('release_group/entity.html', id=release_group['id'], release_group=release_group, reviews=reviews, + return render_template('release_group/entity.html', id=release_group['id'], release_group=release_group, + reviews=reviews, release=release, my_review=my_review, spotify_mappings=spotify_mappings, tags=tags, soundcloud_url=soundcloud_url, external_reviews=external_reviews, limit=limit, offset=offset, count=count, avg_rating=avg_rating, rating_form=rating_form, current_user=current_user) diff --git a/critiquebrainz/frontend/views/reports.py b/critiquebrainz/frontend/views/reports.py index 9086ac816..e2c96832b 100644 --- a/critiquebrainz/frontend/views/reports.py +++ b/critiquebrainz/frontend/views/reports.py @@ -1,7 +1,8 @@ from flask import Blueprint, render_template, flash, url_for, redirect, request, jsonify -from flask_login import login_required from flask_babel import gettext +from flask_login import login_required from werkzeug.exceptions import NotFound + import critiquebrainz.db.spam_report as db_spam_report from critiquebrainz.frontend.login import admin_view diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index 4e19ce63b..8e330fee5 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -1,28 +1,30 @@ from math import ceil + +from brainzutils.musicbrainz_db.exceptions import NoDataFoundException from flask import Blueprint, render_template, request, redirect, url_for, jsonify from flask_babel import gettext, get_locale, lazy_gettext from flask_login import login_required, current_user +from langdetect import detect from markdown import markdown from werkzeug.exceptions import Unauthorized, NotFound, Forbidden, BadRequest -from langdetect import detect -from critiquebrainz.db.review import ENTITY_TYPES -from critiquebrainz.db.moderation_log import AdminActions + +import critiquebrainz.db.comment as db_comment +import critiquebrainz.db.moderation_log as db_moderation_log +import critiquebrainz.db.review as db_review +import critiquebrainz.db.spam_report as db_spam_report +import critiquebrainz.db.users as db_users from critiquebrainz.db import vote as db_vote, exceptions as db_exceptions, revision as db_revision +from critiquebrainz.db.moderation_log import AdminActions +from critiquebrainz.db.review import ENTITY_TYPES from critiquebrainz.frontend import flash from critiquebrainz.frontend.external import mbspotify, soundcloud +from critiquebrainz.frontend.external.musicbrainz_db.entities import get_multiple_entities, get_entity_by_id +from critiquebrainz.frontend.forms.comment import CommentEditForm from critiquebrainz.frontend.forms.log import AdminActionForm from critiquebrainz.frontend.forms.review import ReviewCreateForm, ReviewEditForm, ReviewReportForm -from critiquebrainz.frontend.forms.comment import CommentEditForm from critiquebrainz.frontend.login import admin_view from critiquebrainz.frontend.views import get_avg_rating from critiquebrainz.utils import side_by_side_diff -import critiquebrainz.db.spam_report as db_spam_report -import critiquebrainz.db.review as db_review -import critiquebrainz.db.moderation_log as db_moderation_log -import critiquebrainz.db.users as db_users -import critiquebrainz.db.comment as db_comment -from critiquebrainz.frontend.external.musicbrainz_db.entities import get_multiple_entities, get_entity_by_id -from brainzutils.musicbrainz_db.exceptions import NoDataFoundException review_bp = Blueprint('review', __name__) RESULTS_LIMIT = 10 @@ -204,7 +206,6 @@ def revisions_more(id): @review_bp.route('/write/') @login_required def create(entity_type=None, entity_id=None): - if not (entity_id or entity_type): for allowed_type in ENTITY_TYPES: if mbid := request.args.get(allowed_type): @@ -214,9 +215,9 @@ def create(entity_type=None, entity_id=None): if entity_type: return redirect(url_for('.create', entity_type=entity_type, entity_id=entity_id)) - else: - flash.info(gettext("Please choose an entity to review.")) - return redirect(url_for('search.selector', next=url_for('.create'))) + + flash.info(gettext("Please choose an entity to review.")) + return redirect(url_for('search.selector', next=url_for('.create'))) if entity_type not in ENTITY_TYPES: raise BadRequest("You can't write reviews about this type of entity.") diff --git a/critiquebrainz/frontend/views/search.py b/critiquebrainz/frontend/views/search.py index 2bbfdab09..ae31e1464 100644 --- a/critiquebrainz/frontend/views/search.py +++ b/critiquebrainz/frontend/views/search.py @@ -1,4 +1,5 @@ from flask import Blueprint, request, render_template, redirect, jsonify, url_for + from critiquebrainz.frontend.external import musicbrainz search_bp = Blueprint('search', __name__) @@ -32,7 +33,8 @@ def index(): query = request.args.get('query') type = request.args.get('type') count, results = search_wrapper(query, type) - return render_template('search/index.html', query=query, type=type, results=results, count=count, limit=RESULTS_LIMIT) + return render_template('search/index.html', query=query, type=type, results=results, count=count, + limit=RESULTS_LIMIT) @search_bp.route('/more') diff --git a/critiquebrainz/frontend/views/statistics.py b/critiquebrainz/frontend/views/statistics.py index b3236abf3..24194c6ca 100644 --- a/critiquebrainz/frontend/views/statistics.py +++ b/critiquebrainz/frontend/views/statistics.py @@ -17,6 +17,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from flask import Blueprint, render_template + import critiquebrainz.db.statistics as db_statistics statistics_bp = Blueprint('statistics', __name__) diff --git a/critiquebrainz/frontend/views/test/profile_apps.py b/critiquebrainz/frontend/views/test/profile_apps.py index 454cccf18..baba95433 100644 --- a/critiquebrainz/frontend/views/test/profile_apps.py +++ b/critiquebrainz/frontend/views/test/profile_apps.py @@ -1,7 +1,7 @@ -from critiquebrainz.frontend.testing import FrontendTestCase -from critiquebrainz.db.user import User import critiquebrainz.db.oauth_client as db_oauth_client import critiquebrainz.db.users as db_users +from critiquebrainz.db.user import User +from critiquebrainz.frontend.testing import FrontendTestCase class ProfileApplicationsViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_artist.py b/critiquebrainz/frontend/views/test/test_artist.py index ac41b36c9..dda8fd064 100644 --- a/critiquebrainz/frontend/views/test/test_artist.py +++ b/critiquebrainz/frontend/views/test/test_artist.py @@ -1,7 +1,8 @@ from unittest.mock import MagicMock -from critiquebrainz.frontend.testing import FrontendTestCase -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group + import critiquebrainz.frontend.external.musicbrainz_db.artist as mb_artist +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group +from critiquebrainz.frontend.testing import FrontendTestCase def return_release_groups(*, artist_id, release_types=None, limit=None, offset=None): diff --git a/critiquebrainz/frontend/views/test/test_comment.py b/critiquebrainz/frontend/views/test/test_comment.py index 76c1b4a26..45e4d06c4 100644 --- a/critiquebrainz/frontend/views/test/test_comment.py +++ b/critiquebrainz/frontend/views/test/test_comment.py @@ -17,12 +17,13 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from flask import current_app, url_for -from critiquebrainz.frontend.testing import FrontendTestCase -import critiquebrainz.db.users as db_users -from critiquebrainz.db.user import User + import critiquebrainz.db.comment as db_comment import critiquebrainz.db.license as db_license import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users +from critiquebrainz.db.user import User +from critiquebrainz.frontend.testing import FrontendTestCase def mock_get_entity_by_id(id, type='release_group'): @@ -117,7 +118,7 @@ def test_create(self): data=payload, ) self.assertRedirects(response, url_for("review.entity", id=self.review["id"])) - self.assertEqual(comment_count+1, db_comment.count_comments(review_id=self.review["id"])) + self.assertEqual(comment_count + 1, db_comment.count_comments(review_id=self.review["id"])) response = self.client.get(url_for("review.entity", id=self.review["id"])) self.assert200(response) @@ -161,7 +162,7 @@ def test_delete(self): follow_redirects=True, ) self.assert200(response) - self.assertEqual(comment_count-1, db_comment.count_comments(review_id=self.review["id"])) + self.assertEqual(comment_count - 1, db_comment.count_comments(review_id=self.review["id"])) self.assertIn("Comment has been deleted.", str(response.data)) def test_edit(self): diff --git a/critiquebrainz/frontend/views/test/test_mapping.py b/critiquebrainz/frontend/views/test/test_mapping.py index 273daab74..4c3f80517 100644 --- a/critiquebrainz/frontend/views/test/test_mapping.py +++ b/critiquebrainz/frontend/views/test/test_mapping.py @@ -17,15 +17,17 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from unittest.mock import MagicMock + from flask import url_for + import critiquebrainz.db.users as db_users +import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group +import critiquebrainz.frontend.external.spotify as spotify_api from critiquebrainz.db.user import User -from critiquebrainz.frontend.testing import FrontendTestCase from critiquebrainz.frontend.external import mbspotify -import critiquebrainz.frontend.external.spotify as spotify_api from critiquebrainz.frontend.external.exceptions import ExternalServiceException -import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group +from critiquebrainz.frontend.testing import FrontendTestCase class SpotifyMappingViewsTestCase(FrontendTestCase): @@ -188,7 +190,8 @@ def test_spotify_confirm(self): self.assertIn("You need to specify existing album from Spotify!", str(response.data)) # test when uri supplied is available on Spotify - spotify_api.get_album = MagicMock(return_value=self.test_spotify_get_multiple_albums_response[self.test_spotify_id]) + spotify_api.get_album = MagicMock( + return_value=self.test_spotify_get_multiple_albums_response[self.test_spotify_id]) response = self.client.get("/mapping/spotify/confirm", query_string={ "release_group_id": "6b3cd75d-7453-39f3-86c4-1441f360e121", @@ -276,7 +279,8 @@ def test_spotify_report(self): self.assertIn("You need to specify existing album from Spotify!", str(response.data)) # test confirmation page for reporting - spotify_api.get_album = MagicMock(return_value=self.test_spotify_get_multiple_albums_response[self.test_spotify_id]) + spotify_api.get_album = MagicMock( + return_value=self.test_spotify_get_multiple_albums_response[self.test_spotify_id]) response = self.client.get("/mapping/spotify/report", query_string={ "release_group_id": "6b3cd75d-7453-39f3-86c4-1441f360e121", diff --git a/critiquebrainz/frontend/views/test/test_moderators.py b/critiquebrainz/frontend/views/test/test_moderators.py index 1b46526d8..7cdce9b69 100644 --- a/critiquebrainz/frontend/views/test/test_moderators.py +++ b/critiquebrainz/frontend/views/test/test_moderators.py @@ -1,4 +1,5 @@ from flask import current_app + from critiquebrainz.frontend.testing import FrontendTestCase diff --git a/critiquebrainz/frontend/views/test/test_profile.py b/critiquebrainz/frontend/views/test/test_profile.py index 2f4780c57..f1cce7d76 100644 --- a/critiquebrainz/frontend/views/test/test_profile.py +++ b/critiquebrainz/frontend/views/test/test_profile.py @@ -1,7 +1,7 @@ -from critiquebrainz.frontend.testing import FrontendTestCase -from critiquebrainz.db.user import User -import critiquebrainz.db.users as db_users import critiquebrainz.db.license as db_license +import critiquebrainz.db.users as db_users +from critiquebrainz.db.user import User +from critiquebrainz.frontend.testing import FrontendTestCase class ProfileViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_rate.py b/critiquebrainz/frontend/views/test/test_rate.py index 252fb4e1d..faf138fa6 100644 --- a/critiquebrainz/frontend/views/test/test_rate.py +++ b/critiquebrainz/frontend/views/test/test_rate.py @@ -17,13 +17,15 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from unittest import mock + from flask import url_for -from critiquebrainz.frontend.testing import FrontendTestCase -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group + +import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review import critiquebrainz.db.users as db_users +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group from critiquebrainz.db.user import User -import critiquebrainz.db.review as db_review -import critiquebrainz.db.license as db_license +from critiquebrainz.frontend.testing import FrontendTestCase class RateViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_release.py b/critiquebrainz/frontend/views/test/test_release.py index ef208c2d2..09a5ceb4a 100644 --- a/critiquebrainz/frontend/views/test/test_release.py +++ b/critiquebrainz/frontend/views/test/test_release.py @@ -1,6 +1,7 @@ from unittest.mock import MagicMock -from critiquebrainz.frontend.testing import FrontendTestCase + import critiquebrainz.frontend.external.musicbrainz_db.release as mb_release +from critiquebrainz.frontend.testing import FrontendTestCase class ReleaseViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_release_group.py b/critiquebrainz/frontend/views/test/test_release_group.py index f93398279..a2fd9afa2 100644 --- a/critiquebrainz/frontend/views/test/test_release_group.py +++ b/critiquebrainz/frontend/views/test/test_release_group.py @@ -1,10 +1,11 @@ from unittest.mock import MagicMock -from critiquebrainz.frontend.testing import FrontendTestCase -import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group + +import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review import critiquebrainz.db.users as db_users +import critiquebrainz.frontend.external.musicbrainz_db.release_group as mb_release_group from critiquebrainz.db.user import User -import critiquebrainz.db.review as db_review -import critiquebrainz.db.license as db_license +from critiquebrainz.frontend.testing import FrontendTestCase class ReleaseGroupViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index 78e423fdd..af7d2d9ea 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -1,12 +1,14 @@ from unittest.mock import patch, MagicMock -from flask import current_app, url_for +from urllib.parse import urlparse + import brainzutils.musicbrainz_db.release as mb_release -from critiquebrainz.frontend.testing import FrontendTestCase +from flask import current_app, url_for + +import critiquebrainz.db.license as db_license import critiquebrainz.db.review as db_review -from critiquebrainz.db.user import User import critiquebrainz.db.users as db_users -import critiquebrainz.db.license as db_license -from urllib.parse import urlparse +from critiquebrainz.db.user import User +from critiquebrainz.frontend.testing import FrontendTestCase def mock_get_entity_by_id(id, type='release_group'): @@ -142,8 +144,8 @@ def test_create(self): data = dict(release_group='6b3cd75d-7453-39f3-86c4-1441f360e121') response = self.client.get("/review/write/", query_string=data) redirect_url = urlparse(response.location) - self.assertEquals(redirect_url.path, url_for("review.create", entity_type="release_group", - entity_id=data["release_group"])) + self.assertEqual(redirect_url.path, url_for("review.create", entity_type="release_group", + entity_id=data["release_group"])) def test_create_duplicate(self): review = self.create_dummy_review() diff --git a/critiquebrainz/frontend/views/test/test_search.py b/critiquebrainz/frontend/views/test/test_search.py index 49bd855e4..a3c8b71b2 100644 --- a/critiquebrainz/frontend/views/test/test_search.py +++ b/critiquebrainz/frontend/views/test/test_search.py @@ -1,6 +1,7 @@ from unittest.mock import MagicMock -from critiquebrainz.frontend.testing import FrontendTestCase + from critiquebrainz.frontend.external import musicbrainz +from critiquebrainz.frontend.testing import FrontendTestCase class SearchViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_statistics.py b/critiquebrainz/frontend/views/test/test_statistics.py index f6c5de306..baef11da7 100644 --- a/critiquebrainz/frontend/views/test/test_statistics.py +++ b/critiquebrainz/frontend/views/test/test_statistics.py @@ -17,12 +17,14 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from unittest.mock import MagicMock + from brainzutils import cache -from critiquebrainz.frontend.testing import FrontendTestCase -import critiquebrainz.db.users as db_users -import critiquebrainz.db.review as db_review + import critiquebrainz.db.license as db_license +import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users from critiquebrainz.db.user import User +from critiquebrainz.frontend.testing import FrontendTestCase class StatisticsViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/test/test_user.py b/critiquebrainz/frontend/views/test/test_user.py index 25599f807..7beaf8dbe 100644 --- a/critiquebrainz/frontend/views/test/test_user.py +++ b/critiquebrainz/frontend/views/test/test_user.py @@ -1,7 +1,8 @@ from unittest.mock import MagicMock -from critiquebrainz.frontend.testing import FrontendTestCase + import critiquebrainz.db.users as db_users from critiquebrainz.db.user import User +from critiquebrainz.frontend.testing import FrontendTestCase class UserViewsTestCase(FrontendTestCase): diff --git a/critiquebrainz/frontend/views/user.py b/critiquebrainz/frontend/views/user.py index 67489b8fd..649864d04 100644 --- a/critiquebrainz/frontend/views/user.py +++ b/critiquebrainz/frontend/views/user.py @@ -1,15 +1,16 @@ from flask import Blueprint, render_template, request, redirect, url_for -from werkzeug.exceptions import NotFound from flask_babel import gettext from flask_login import login_required, current_user +from werkzeug.exceptions import NotFound + +import critiquebrainz.db.moderation_log as db_moderation_log +import critiquebrainz.db.review as db_review +import critiquebrainz.db.users as db_users from critiquebrainz.db.moderation_log import AdminActions from critiquebrainz.db.user import User +from critiquebrainz.frontend import flash from critiquebrainz.frontend.forms.log import AdminActionForm from critiquebrainz.frontend.login import admin_view -from critiquebrainz.frontend import flash -import critiquebrainz.db.users as db_users -import critiquebrainz.db.review as db_review -import critiquebrainz.db.moderation_log as db_moderation_log user_bp = Blueprint('user', __name__) diff --git a/critiquebrainz/frontend/views/work.py b/critiquebrainz/frontend/views/work.py index 899df794f..fc6c68720 100644 --- a/critiquebrainz/frontend/views/work.py +++ b/critiquebrainz/frontend/views/work.py @@ -1,13 +1,13 @@ from flask import Blueprint, render_template, request, redirect, url_for -from werkzeug.exceptions import NotFound -from flask_login import current_user from flask_babel import gettext +from flask_login import current_user +from werkzeug.exceptions import NotFound + import critiquebrainz.db.review as db_review -import critiquebrainz.frontend.external.musicbrainz_db.work as mb_work import critiquebrainz.frontend.external.musicbrainz_db.exceptions as mb_exceptions -from critiquebrainz.frontend.views import get_avg_rating, WORK_REVIEWS_LIMIT, BROWSE_RECORDING_LIMIT +import critiquebrainz.frontend.external.musicbrainz_db.work as mb_work from critiquebrainz.frontend.forms.rate import RatingEditForm - +from critiquebrainz.frontend.views import get_avg_rating, WORK_REVIEWS_LIMIT, BROWSE_RECORDING_LIMIT work_bp = Blueprint('work', __name__) diff --git a/critiquebrainz/loggers.py b/critiquebrainz/loggers.py index 59dbe770b..581733962 100644 --- a/critiquebrainz/loggers.py +++ b/critiquebrainz/loggers.py @@ -1,5 +1,6 @@ import logging from logging.handlers import RotatingFileHandler, SMTPHandler + from raven.contrib.flask import Sentry diff --git a/critiquebrainz/utils.py b/critiquebrainz/utils.py index 9d3e892c6..d9f34142b 100644 --- a/critiquebrainz/utils.py +++ b/critiquebrainz/utils.py @@ -1,10 +1,11 @@ import difflib -import urllib.parse -import string import random +import string +import urllib.parse + from flask import request -from flask_uuid import UUID_RE from flask_babel import format_datetime, format_date +from flask_uuid import UUID_RE tags = {'+': ('', ''), '-': ('', ''), ' ': (' ', '')} diff --git a/critiquebrainz/utils_test.py b/critiquebrainz/utils_test.py index 8a2d894ef..7ba393c91 100644 --- a/critiquebrainz/utils_test.py +++ b/critiquebrainz/utils_test.py @@ -1,4 +1,5 @@ import unittest + from critiquebrainz import utils diff --git a/critiquebrainz/ws/__init__.py b/critiquebrainz/ws/__init__.py index ccb7293aa..0cc617606 100644 --- a/critiquebrainz/ws/__init__.py +++ b/critiquebrainz/ws/__init__.py @@ -2,6 +2,7 @@ import os import sys from time import sleep + from brainzutils.flask import CustomFlask deploy_env = os.environ.get('DEPLOY_ENV', '') @@ -31,7 +32,8 @@ def create_app(debug=None, config_path=None): sleep(1) if not os.path.exists(config_file): - print("No configuration file generated yet. Retried {} times, exiting.".format(CONSUL_CONFIG_FILE_RETRY_COUNT)) + print("No configuration file generated yet. Retried {} times, exiting.".format( + CONSUL_CONFIG_FILE_RETRY_COUNT)) sys.exit(-1) print("Loading consul config file {}".format(config_file)) @@ -67,8 +69,8 @@ def create_app(debug=None, config_path=None): # Redis (cache) from brainzutils import cache if "REDIS_HOST" in app.config and \ - "REDIS_PORT" in app.config and \ - "REDIS_NAMESPACE" in app.config: + "REDIS_PORT" in app.config and \ + "REDIS_NAMESPACE" in app.config: cache.init( host=app.config["REDIS_HOST"], port=app.config["REDIS_PORT"], diff --git a/critiquebrainz/ws/errors.py b/critiquebrainz/ws/errors.py index 61ac60032..eacc5172d 100644 --- a/critiquebrainz/ws/errors.py +++ b/critiquebrainz/ws/errors.py @@ -1,10 +1,10 @@ # pylint: disable=unused-variable from flask import jsonify + from critiquebrainz.ws import exceptions as ws_exceptions def init_error_handlers(app): - @app.errorhandler(ws_exceptions.WebServiceError) def base_error_handler(error): return jsonify(error=error.code, description=error.desc), error.status diff --git a/critiquebrainz/ws/oauth/provider.py b/critiquebrainz/ws/oauth/provider.py index 4c6c88bc3..002a28961 100644 --- a/critiquebrainz/ws/oauth/provider.py +++ b/critiquebrainz/ws/oauth/provider.py @@ -1,16 +1,18 @@ from datetime import datetime, timedelta from functools import wraps + from flask import request -from critiquebrainz.ws.constants import available_scopes -from critiquebrainz.ws.exceptions import NotAuthorized -from critiquebrainz.ws.oauth import exceptions -from critiquebrainz.utils import generate_string + +import critiquebrainz.db.exceptions as db_exceptions import critiquebrainz.db.oauth_client as db_oauth_client +import critiquebrainz.db.oauth_grant as db_oauth_grant import critiquebrainz.db.oauth_token as db_oauth_token -import critiquebrainz.db.exceptions as db_exceptions import critiquebrainz.db.users as db_users -import critiquebrainz.db.oauth_grant as db_oauth_grant from critiquebrainz.db.user import User +from critiquebrainz.utils import generate_string +from critiquebrainz.ws.constants import available_scopes +from critiquebrainz.ws.exceptions import NotAuthorized +from critiquebrainz.ws.oauth import exceptions class CritiqueBrainzAuthorizationProvider: @@ -208,5 +210,7 @@ def decorated(*args, **kwargs): user = self.get_authorized_user(scopes) kwargs.update(dict(user=user)) return f(*args, **kwargs) + return decorated + return decorator diff --git a/critiquebrainz/ws/oauth/views.py b/critiquebrainz/ws/oauth/views.py index a4b4be566..e0ef362f3 100644 --- a/critiquebrainz/ws/oauth/views.py +++ b/critiquebrainz/ws/oauth/views.py @@ -1,7 +1,8 @@ from flask import Blueprint, request, jsonify + +from critiquebrainz.decorators import nocache, crossdomain from critiquebrainz.ws.oauth import oauth from critiquebrainz.ws.oauth.exceptions import UnsupportedGrantType -from critiquebrainz.decorators import nocache, crossdomain oauth_bp = Blueprint('ws_oauth', __name__) @@ -39,7 +40,8 @@ def oauth_token_handler(): user_id = token['user_id'] scope = token['scopes'] else: - raise UnsupportedGrantType("Specified grant_type is unsupported. Please, use authorization_code or refresh_token.") + raise UnsupportedGrantType( + "Specified grant_type is unsupported. Please, use authorization_code or refresh_token.") # Deleting grant and/or existing token(s) # TODO(roman): Check if that's necessary: diff --git a/critiquebrainz/ws/parser.py b/critiquebrainz/ws/parser.py index 66a9e9ef7..f9a55a6d5 100644 --- a/critiquebrainz/ws/parser.py +++ b/critiquebrainz/ws/parser.py @@ -1,6 +1,8 @@ -import urllib.parse import re +import urllib.parse + from flask import request + from critiquebrainz.utils import validate_uuid from critiquebrainz.ws.exceptions import MissingDataError, ParserError diff --git a/critiquebrainz/ws/review/views.py b/critiquebrainz/ws/review/views.py index b28bacbc4..18f76373d 100644 --- a/critiquebrainz/ws/review/views.py +++ b/critiquebrainz/ws/review/views.py @@ -1,6 +1,6 @@ -from flask import Blueprint, jsonify from brainzutils import cache -from critiquebrainz.db.review import supported_languages, ENTITY_TYPES +from flask import Blueprint, jsonify + import critiquebrainz.db.review as db_review from critiquebrainz.db import ( vote as db_vote, @@ -13,10 +13,11 @@ REVIEW_TEXT_MIN_LENGTH, REVIEW_TEXT_MAX_LENGTH ) +from critiquebrainz.db.review import supported_languages, ENTITY_TYPES +from critiquebrainz.decorators import crossdomain from critiquebrainz.ws.exceptions import NotFound, AccessDenied, InvalidRequest, LimitExceeded, MissingDataError from critiquebrainz.ws.oauth import oauth from critiquebrainz.ws.parser import Parser -from critiquebrainz.decorators import crossdomain review_bp = Blueprint('ws_review', __name__) diff --git a/critiquebrainz/ws/review/views_test.py b/critiquebrainz/ws/review/views_test.py index d5e19f550..4567abc08 100644 --- a/critiquebrainz/ws/review/views_test.py +++ b/critiquebrainz/ws/review/views_test.py @@ -1,10 +1,10 @@ import json -from critiquebrainz.ws.testing import WebServiceTestCase +import critiquebrainz.db.license as db_license import critiquebrainz.db.review as db_review import critiquebrainz.db.users as db_users from critiquebrainz.db.user import User -import critiquebrainz.db.license as db_license +from critiquebrainz.ws.testing import WebServiceTestCase class ReviewViewsTestCase(WebServiceTestCase): @@ -56,7 +56,7 @@ def test_review_sort(self): response = self.client.get('/review/', query_string={'sort': 'hello'}) self.assert400(response) - self.assertEquals(response.json['description'], 'Parameter `sort`: is not valid') + self.assertEqual(response.json['description'], 'Parameter `sort`: is not valid') def test_review_count(self): resp = self.client.get('/review/').json diff --git a/critiquebrainz/ws/testing.py b/critiquebrainz/ws/testing.py index 5dcabbb05..0a0dbdae7 100644 --- a/critiquebrainz/ws/testing.py +++ b/critiquebrainz/ws/testing.py @@ -1,10 +1,12 @@ import os + from flask_testing import TestCase -from critiquebrainz.ws import create_app -from critiquebrainz.data.utils import create_all, drop_tables, drop_types -from critiquebrainz.ws.oauth import oauth + import critiquebrainz.db.oauth_client as db_oauth_client import critiquebrainz.db.users as db_users +from critiquebrainz.data.utils import create_all, drop_tables, drop_types +from critiquebrainz.ws import create_app +from critiquebrainz.ws.oauth import oauth class WebServiceTestCase(TestCase): diff --git a/critiquebrainz/ws/user/views.py b/critiquebrainz/ws/user/views.py index 33218d0a3..70dac2ce2 100644 --- a/critiquebrainz/ws/user/views.py +++ b/critiquebrainz/ws/user/views.py @@ -1,10 +1,11 @@ from flask import Blueprint, jsonify, request, redirect, url_for -from critiquebrainz.db.user import User + from critiquebrainz.db import users as db_users +from critiquebrainz.db.user import User from critiquebrainz.decorators import crossdomain +from critiquebrainz.ws.exceptions import NotFound from critiquebrainz.ws.oauth import oauth from critiquebrainz.ws.parser import Parser -from critiquebrainz.ws.exceptions import NotFound user_bp = Blueprint('ws_user', __name__) @@ -154,6 +155,7 @@ def user_modify_handler(user): :resheader Content-Type: *application/json* """ + def fetch_params(): display_name = Parser.string('json', 'display_name', optional=True) email = Parser.email('json', 'email', optional=True) @@ -280,6 +282,7 @@ def review_list_handler(): :resheader Content-Type: *application/json* """ + def fetch_params(): limit = Parser.int('uri', 'limit', min=1, max=50, optional=True) or 50 offset = Parser.int('uri', 'offset', optional=True) or 0 diff --git a/critiquebrainz/ws/user/views_test.py b/critiquebrainz/ws/user/views_test.py index 35293295b..d808a45b7 100644 --- a/critiquebrainz/ws/user/views_test.py +++ b/critiquebrainz/ws/user/views_test.py @@ -1,6 +1,6 @@ -from critiquebrainz.ws.testing import WebServiceTestCase from critiquebrainz.db import users as db_users from critiquebrainz.db.user import User +from critiquebrainz.ws.testing import WebServiceTestCase class UserViewsTestCase(WebServiceTestCase): diff --git a/import_musicbrainz_row_ids.py b/import_musicbrainz_row_ids.py index 00a50af09..fdc8e0279 100644 --- a/import_musicbrainz_row_ids.py +++ b/import_musicbrainz_row_ids.py @@ -13,8 +13,8 @@ def fix_user(mb_connection, cb_connection, user_name, cb_id): FROM editor WHERE name = :user_name """), { - 'user_name': user_name, - }) + 'user_name': user_name, + }) if r.rowcount > 0: musicbrainz_row_id = r.fetchone()['id'] if not DRY_RUN: @@ -63,8 +63,8 @@ def import_musicbrainz_row_ids(): FROM editor WHERE name = :musicbrainz_id """), { - 'musicbrainz_id': user['musicbrainz_username'], - }) + 'musicbrainz_id': user['musicbrainz_username'], + }) musicbrainz_row_id = None if r.rowcount > 0: musicbrainz_row_id = r.fetchone()['id'] @@ -76,9 +76,9 @@ def import_musicbrainz_row_ids(): SET musicbrainz_row_id = :musicbrainz_row_id WHERE id = :id """), { - 'musicbrainz_row_id': musicbrainz_row_id, - 'id': user['id'], - }) + 'musicbrainz_row_id': musicbrainz_row_id, + 'id': user['id'], + }) else: print('%s not found!' % name) not_found += 1 From dd95e1a40e0dd01a824f2d1d956e1593e9c72ff6 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 23:29:46 +0530 Subject: [PATCH 151/159] Make sql_connection mandatory --- critiquebrainz/db/review.py | 4 ++-- critiquebrainz/db/revision.py | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index 8e95b93e5..32e6af647 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -240,7 +240,7 @@ def update(review_id, *, drafted, text=None, rating=None, license_id=None, langu updated_info["review_id"] = review_id with db.engine.connect() as connection: connection.execute(query, updated_info) - db_revision.create(review_id, text, rating, sql_connection=connection) + db_revision.create(connection, review_id, text, rating) cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) @@ -319,7 +319,7 @@ def create(*, entity_id, entity_type, user_id, is_draft, text=None, rating=None, "published_on": published_on, }) review_id = result.fetchone()[0] - db_revision.create(review_id, text, rating, sql_connection=connection) + db_revision.create(connection, review_id, text, rating) cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) return get_by_id(review_id) diff --git a/critiquebrainz/db/revision.py b/critiquebrainz/db/revision.py index 3949a79c9..ed80b5e15 100644 --- a/critiquebrainz/db/revision.py +++ b/critiquebrainz/db/revision.py @@ -157,14 +157,14 @@ def get_revision_number(review_id, revision_id): return rev_num -def create(review_id, text=None, rating=None, sql_connection=None): +def create(sql_connection, review_id, text=None, rating=None): """Creates a new revision for the given review. Args: + sql_connection: connection to database to update/create the review review_id (uuid): ID of the review. text (str): Updated/New text part of the review. rating (int): Updated/New rating part of the review - sql_connection: connection to database to update/create the review """ if text is None and rating is None: raise db_exceptions.BadDataException("Text part and rating part of a revision can not be None simultaneously") @@ -183,11 +183,7 @@ def create(review_id, text=None, rating=None, sql_connection=None): "rating": rating, } - if sql_connection: - sql_connection.execute(sql_query, value_dict) - else: - with db.engine.connect() as connection: - connection.execute(sql_query, value_dict) + sql_connection.execute(sql_query, value_dict) # Update average rating if rating part of the review has changed review = db_review.get_by_id(review_id) From d68b96529f2e92943e0fceb5555be2b92b581048 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Sat, 26 Sep 2020 18:46:10 +0530 Subject: [PATCH 152/159] Fix ordering of SQL queries --- critiquebrainz/db/review.py | 14 +++++++++----- critiquebrainz/db/revision.py | 15 ++++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/critiquebrainz/db/review.py b/critiquebrainz/db/review.py index 32e6af647..bad525764 100644 --- a/critiquebrainz/db/review.py +++ b/critiquebrainz/db/review.py @@ -236,11 +236,12 @@ def update(review_id, *, drafted, text=None, rating=None, license_id=None, langu WHERE id = :review_id """.format(setstr=setstr)) - if setstr: - updated_info["review_id"] = review_id - with db.engine.connect() as connection: + with db.engine.connect() as connection: + if setstr: + updated_info["review_id"] = review_id connection.execute(query, updated_info) - db_revision.create(connection, review_id, text, rating) + db_revision.create(connection, review_id, text, rating) + db_revision.update_rating(review_id) cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) @@ -320,7 +321,10 @@ def create(*, entity_id, entity_type, user_id, is_draft, text=None, rating=None, }) review_id = result.fetchone()[0] db_revision.create(connection, review_id, text, rating) - cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) + if rating: + db_revision.update_rating(review_id) + + cache.invalidate_namespace(REVIEW_CACHE_NAMESPACE) return get_by_id(review_id) diff --git a/critiquebrainz/db/revision.py b/critiquebrainz/db/revision.py index ed80b5e15..d8df636b8 100644 --- a/critiquebrainz/db/revision.py +++ b/critiquebrainz/db/revision.py @@ -157,11 +157,11 @@ def get_revision_number(review_id, revision_id): return rev_num -def create(sql_connection, review_id, text=None, rating=None): +def create(connection, review_id, text=None, rating=None): """Creates a new revision for the given review. Args: - sql_connection: connection to database to update/create the review + connection: connection to database to update/create the review review_id (uuid): ID of the review. text (str): Updated/New text part of the review. rating (int): Updated/New rating part of the review @@ -173,18 +173,19 @@ def create(sql_connection, review_id, text=None, rating=None): # Convert ratings to values on a scale 0-100 rating = RATING_SCALE_0_100.get(rating) - sql_query = sqlalchemy.text( - """INSERT INTO revision(review_id, timestamp, text, rating) + query = sqlalchemy.text("""INSERT INTO revision(review_id, timestamp, text, rating) VALUES (:review_id, :timestamp, :text, :rating)""") - value_dict = { + params = { "review_id": review_id, "timestamp": datetime.now(), "text": text, "rating": rating, } - sql_connection.execute(sql_query, value_dict) + connection.execute(query, params) + +def update_rating(review_id): # Update average rating if rating part of the review has changed review = db_review.get_by_id(review_id) rev_num = get_revision_number(review["id"], review["last_revision"]["id"]) @@ -192,7 +193,7 @@ def create(sql_connection, review_id, text=None, rating=None): revisions = get(review["id"], limit=2, offset=0) if revisions[0]["rating"] != revisions[1]["rating"]: db_avg_rating.update(review["entity_id"], review["entity_type"]) - elif rating is not None: + else: db_avg_rating.update(review["entity_id"], review["entity_type"]) From 73e09c3761cdac01786b7fe9feb5ac49c66bb793 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Wed, 23 Sep 2020 19:44:13 +0530 Subject: [PATCH 153/159] Use both entity_type and mbid for cache key --- critiquebrainz/frontend/external/musicbrainz_db/artist.py | 2 +- critiquebrainz/frontend/external/musicbrainz_db/event.py | 2 +- critiquebrainz/frontend/external/musicbrainz_db/label.py | 2 +- critiquebrainz/frontend/external/musicbrainz_db/place.py | 2 +- critiquebrainz/frontend/external/musicbrainz_db/release.py | 2 +- .../frontend/external/musicbrainz_db/release_group.py | 2 +- critiquebrainz/frontend/external/musicbrainz_db/work.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/artist.py b/critiquebrainz/frontend/external/musicbrainz_db/artist.py index ebdc988ff..a6a578f72 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/artist.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/artist.py @@ -13,7 +13,7 @@ def get_artist_by_id(mbid): Returns: Dictionary containing the artist information """ - key = cache.gen_key(mbid) + key = cache.gen_key('artist', mbid) artist = cache.get(key) if not artist: artist = fetch_multiple_artists( diff --git a/critiquebrainz/frontend/external/musicbrainz_db/event.py b/critiquebrainz/frontend/external/musicbrainz_db/event.py index 3c7662d3d..aee9e2c1f 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/event.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/event.py @@ -12,7 +12,7 @@ def get_event_by_id(mbid): Returns: Dictionary containing the event information. """ - key = cache.gen_key(mbid) + key = cache.gen_key('event', mbid) event = cache.get(key) if not event: event = fetch_multiple_events( diff --git a/critiquebrainz/frontend/external/musicbrainz_db/label.py b/critiquebrainz/frontend/external/musicbrainz_db/label.py index 241452a96..6965c698f 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/label.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/label.py @@ -13,7 +13,7 @@ def get_label_by_id(mbid): Returns: Dictionary containing the label information """ - key = cache.gen_key(mbid) + key = cache.gen_key('label', mbid) label = cache.get(key) if not label: label = fetch_multiple_labels( diff --git a/critiquebrainz/frontend/external/musicbrainz_db/place.py b/critiquebrainz/frontend/external/musicbrainz_db/place.py index fa525afac..d882a0044 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/place.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/place.py @@ -13,7 +13,7 @@ def get_place_by_id(mbid): Returns: Dictionary containing the place information. """ - key = cache.gen_key(mbid) + key = cache.gen_key('place', mbid) place = cache.get(key) if not place: place = fetch_multiple_places( diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release.py b/critiquebrainz/frontend/external/musicbrainz_db/release.py index a63033f31..a86b752da 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release.py @@ -12,7 +12,7 @@ def get_release_by_id(mbid): Returns: Dictionary containing the release information """ - key = cache.gen_key(mbid) + key = cache.gen_key('release', mbid) release = cache.get(key) if not release: release = fetch_multiple_releases( diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py index 243f1397b..bd9307cf0 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py @@ -7,7 +7,7 @@ def get_release_group_by_id(mbid): """Get release group using the MusicBrainz ID.""" - key = cache.gen_key(mbid) + key = cache.gen_key('release-group', mbid) release_group = cache.get(key) if not release_group: release_group = fetch_multiple_release_groups( diff --git a/critiquebrainz/frontend/external/musicbrainz_db/work.py b/critiquebrainz/frontend/external/musicbrainz_db/work.py index e0e0e4d4a..a25306ac8 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/work.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/work.py @@ -12,7 +12,7 @@ def get_work_by_id(mbid): Returns: Dictionary containing the work information """ - key = cache.gen_key(mbid) + key = cache.gen_key('work', mbid) work = cache.get(key) if not work: work = fetch_multiple_works( From 967a31a1efbbf69ab6a3e93702d918bd0802b730 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 25 Sep 2020 10:59:25 +0530 Subject: [PATCH 154/159] Delete mock interfering with cache tests --- critiquebrainz/db/statistics_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/critiquebrainz/db/statistics_test.py b/critiquebrainz/db/statistics_test.py index f19b042d4..15f99026d 100644 --- a/critiquebrainz/db/statistics_test.py +++ b/critiquebrainz/db/statistics_test.py @@ -48,7 +48,6 @@ def setUp(self): ) # totally disable cache get or set - cache.gen_key = MagicMock(return_value=None) cache.get = MagicMock(return_value=None) cache.set = MagicMock(return_value=None) From dbecf8c8f57604bc9b3ddb22780fb62ca2a1ac7d Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Thu, 24 Sep 2020 20:31:04 +0530 Subject: [PATCH 155/159] Add tests for cache and db queries --- .../external/musicbrainz_db/artist.py | 4 +- .../frontend/external/musicbrainz_db/event.py | 4 +- .../frontend/external/musicbrainz_db/label.py | 4 +- .../frontend/external/musicbrainz_db/place.py | 4 +- .../external/musicbrainz_db/release.py | 4 +- .../external/musicbrainz_db/release_group.py | 6 +- .../musicbrainz_db/tests/test_cache.py | 264 ++++++++++++++++++ .../frontend/external/musicbrainz_db/work.py | 4 +- 8 files changed, 279 insertions(+), 15 deletions(-) create mode 100644 critiquebrainz/frontend/external/musicbrainz_db/tests/test_cache.py diff --git a/critiquebrainz/frontend/external/musicbrainz_db/artist.py b/critiquebrainz/frontend/external/musicbrainz_db/artist.py index a6a578f72..c2c42fbcf 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/artist.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/artist.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.artist import fetch_multiple_artists +from brainzutils.musicbrainz_db import artist as db from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import artist as artist_rel @@ -16,7 +16,7 @@ def get_artist_by_id(mbid): key = cache.gen_key('artist', mbid) artist = cache.get(key) if not artist: - artist = fetch_multiple_artists( + artist = db.fetch_multiple_artists( [mbid], includes=['artist-rels', 'url-rels'], ).get(mbid) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/event.py b/critiquebrainz/frontend/external/musicbrainz_db/event.py index aee9e2c1f..4da4f81ef 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/event.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/event.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.event import fetch_multiple_events +from brainzutils.musicbrainz_db import event as db from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION @@ -15,7 +15,7 @@ def get_event_by_id(mbid): key = cache.gen_key('event', mbid) event = cache.get(key) if not event: - event = fetch_multiple_events( + event = db.fetch_multiple_events( [mbid], includes=['artist-rels', 'place-rels', 'series-rels', 'url-rels', 'release-group-rels'], ).get(mbid) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/label.py b/critiquebrainz/frontend/external/musicbrainz_db/label.py index 6965c698f..7eaab0d3a 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/label.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/label.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.label import fetch_multiple_labels +from brainzutils.musicbrainz_db import label as db from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import label as label_rel @@ -16,7 +16,7 @@ def get_label_by_id(mbid): key = cache.gen_key('label', mbid) label = cache.get(key) if not label: - label = fetch_multiple_labels( + label = db.fetch_multiple_labels( [mbid], includes=['artist-rels', 'url-rels'], ).get(mbid) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/place.py b/critiquebrainz/frontend/external/musicbrainz_db/place.py index d882a0044..10d803f31 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/place.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/place.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.place import fetch_multiple_places +from brainzutils.musicbrainz_db import place as db from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION from critiquebrainz.frontend.external.relationships import place as place_rel @@ -16,7 +16,7 @@ def get_place_by_id(mbid): key = cache.gen_key('place', mbid) place = cache.get(key) if not place: - place = fetch_multiple_places( + place = db.fetch_multiple_places( [mbid], includes=['artist-rels', 'place-rels', 'release-group-rels', 'url-rels'], ).get(mbid) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release.py b/critiquebrainz/frontend/external/musicbrainz_db/release.py index a86b752da..86fc843c9 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.release import fetch_multiple_releases +from brainzutils.musicbrainz_db import release as db from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION @@ -15,7 +15,7 @@ def get_release_by_id(mbid): key = cache.gen_key('release', mbid) release = cache.get(key) if not release: - release = fetch_multiple_releases( + release = db.fetch_multiple_releases( [mbid], includes=['media', 'release-groups'], ).get(mbid) diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py index bd9307cf0..253b64b17 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.release_group import fetch_multiple_release_groups, get_release_groups_for_artist +from brainzutils.musicbrainz_db import release_group as db import critiquebrainz.frontend.external.relationships.release_group as release_group_rel from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION @@ -10,7 +10,7 @@ def get_release_group_by_id(mbid): key = cache.gen_key('release-group', mbid) release_group = cache.get(key) if not release_group: - release_group = fetch_multiple_release_groups( + release_group = db.fetch_multiple_release_groups( [mbid], includes=['artists', 'releases', 'release-group-rels', 'url-rels', 'tags'], )[mbid] @@ -38,7 +38,7 @@ def browse_release_groups(*, artist_id, release_types=None, limit=None, offset=N key = cache.gen_key(artist_id, limit, offset, *release_types) release_groups = cache.get(key) if not release_groups: - release_groups = get_release_groups_for_artist( + release_groups = db.get_release_groups_for_artist( artist_id=artist_id, release_types=release_types, limit=limit, diff --git a/critiquebrainz/frontend/external/musicbrainz_db/tests/test_cache.py b/critiquebrainz/frontend/external/musicbrainz_db/tests/test_cache.py new file mode 100644 index 000000000..f93cbeeed --- /dev/null +++ b/critiquebrainz/frontend/external/musicbrainz_db/tests/test_cache.py @@ -0,0 +1,264 @@ +from unittest import mock + +from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION +from critiquebrainz.frontend.external.musicbrainz_db.artist import get_artist_by_id +from critiquebrainz.frontend.external.musicbrainz_db.event import get_event_by_id +from critiquebrainz.frontend.external.musicbrainz_db.label import get_label_by_id +from critiquebrainz.frontend.external.musicbrainz_db.place import get_place_by_id +from critiquebrainz.frontend.external.musicbrainz_db.release import get_release_by_id +from critiquebrainz.frontend.external.musicbrainz_db.release_group import get_release_group_by_id +from critiquebrainz.frontend.external.musicbrainz_db.work import get_work_by_id +from critiquebrainz.data.testing import DataTestCase + + +class CacheTestCase(DataTestCase): + + def setUp(self): + super(CacheTestCase, self).setUp() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.artist.fetch_multiple_artists') + def test_artist_cache(self, artist_fetch, cache_set, cache_get): + mbid = "f59c5520-5f46-4d2c-b2c4-822eabf53419" + expected_key = b"artist_f59c5520-5f46-4d2c-b2c4-822eabf53419" + artist = { + "id": "f59c5520-5f46-4d2c-b2c4-822eabf53419", + "name": "Linkin Park", + "sort_name": "Linkin Park", + "type": "Group" + } + artist_fetch.return_value = {mbid: artist} + + cache_get.return_value = None + get_artist_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + artist_fetch.assert_called_with([mbid], includes=['artist-rels', 'url-rels']) + cache_set.assert_called_with(key=expected_key, val=artist, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = artist + cache_set.reset_mock() + artist_fetch.reset_mock() + get_artist_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + artist_fetch.assert_not_called() + cache_set.assert_not_called() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.event.fetch_multiple_events') + def test_event_cache(self, event_fetch, cache_set, cache_get): + mbid = "ebe6ce0f-22c0-4fe7-bfd4-7a0397c9fe94" + expected_key = b"event_ebe6ce0f-22c0-4fe7-bfd4-7a0397c9fe94" + event = { + 'id': 'ebe6ce0f-22c0-4fe7-bfd4-7a0397c9fe94', + 'name': 'Taubertal-Festival 2004, Day 1', + } + event_fetch.return_value = {mbid: event} + + cache_get.return_value = None + get_event_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + event_fetch.assert_called_with([mbid], includes=['artist-rels', 'place-rels', + 'series-rels', 'url-rels', 'release-group-rels']) + cache_set.assert_called_with(key=expected_key, val=event, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = event + cache_set.reset_mock() + event_fetch.reset_mock() + get_event_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + event_fetch.assert_not_called() + cache_set.assert_not_called() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.label.fetch_multiple_labels') + def test_label_cache(self, label_fetch, cache_set, cache_get): + mbid = "1aed8c3b-8e1e-46f8-b558-06357ff5f298" + expected_key = b"label_1aed8c3b-8e1e-46f8-b558-06357ff5f298" + label = { + "id": "1aed8c3b-8e1e-46f8-b558-06357ff5f298", + "name": "Dreamville", + "type": "Imprint", + "area": "United States", + } + label_fetch.return_value = {mbid: label} + + cache_get.return_value = None + get_label_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + label_fetch.assert_called_with([mbid], includes=['artist-rels', 'url-rels']) + cache_set.assert_called_with(key=expected_key, val=label, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = label + cache_set.reset_mock() + label_fetch.reset_mock() + get_label_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + label_fetch.assert_not_called() + cache_set.assert_not_called() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.place.fetch_multiple_places') + def test_place_cache(self, place_fetch, cache_set, cache_get): + mbid = "d71ffe38-5eaf-426b-9a2e-e1f21bc84609" + expected_key = b"place_d71ffe38-5eaf-426b-9a2e-e1f21bc84609" + place = { + "id": "d71ffe38-5eaf-426b-9a2e-e1f21bc84609", + "name": "Suisto", + "coordinates": { + 'latitude': 60.997758, + 'longitude': 24.477142 + }, + "area": { + "id": "4479c385-74d8-4a2b-bdab-f48d1e6969ba", + "name": "Hämeenlinna", + } + } + place_fetch.return_value = {mbid: place} + + cache_get.return_value = None + get_place_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + place_fetch.assert_called_with([mbid], includes=['artist-rels', 'place-rels', + 'release-group-rels', 'url-rels']) + cache_set.assert_called_with(key=expected_key, val=place, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = place + cache_set.reset_mock() + place_fetch.reset_mock() + get_place_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + place_fetch.assert_not_called() + cache_set.assert_not_called() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.release.fetch_multiple_releases') + def test_release_cache(self, release_fetch, cache_set, cache_get): + mbid = "16bee711-d7ce-48b0-adf4-51f124bcc0df" + expected_key = b"release_16bee711-d7ce-48b0-adf4-51f124bcc0df" + release = { + "id": "16bee711-d7ce-48b0-adf4-51f124bcc0df", + "name": "Numb/Encore", + "medium-list": [{ + "track_list": [{ + "id": "dfe024b2-95b2-453f-b03e-3b9fa06f44e6", + "name": "Numb/Encore (explicit)", + "number": "1", + "position": 1, + "length": 207000, + "recording_id": "daccb724-8023-432a-854c-e0accb6c8678", + "recording_title": "Numb/Encore (explicit)" + }] + }] + } + release_fetch.return_value = {mbid: release} + + cache_get.return_value = None + get_release_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + release_fetch.assert_called_with([mbid], includes=['media', 'release-groups']) + cache_set.assert_called_with(key=expected_key, val=release, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = release + cache_set.reset_mock() + release_fetch.reset_mock() + get_release_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + release_fetch.assert_not_called() + cache_set.assert_not_called() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.release_group.fetch_multiple_release_groups') + def test_release_group_cache(self, release_group_fetch, cache_set, cache_get): + mbid = "7c1014eb-454c-3867-8854-3c95d265f8de" + expected_key = b"release-group_7c1014eb-454c-3867-8854-3c95d265f8de" + release_group = { + 'id': '7c1014eb-454c-3867-8854-3c95d265f8de', + 'title': 'Numb/Encore', + 'artist-credit-phrase': 'Jay-Z/Linkin Park', + 'artist-credit': [{ + 'name': 'Jay-Z', + 'artist': { + 'id': 'f82bcf78-5b69-4622-a5ef-73800768d9ac', + 'name': 'JAY Z', + 'sort_name': 'JAY Z' + }, + 'join_phrase': '/', + }] + } + release_group_fetch.return_value = {mbid: release_group} + + cache_get.return_value = None + get_release_group_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + release_group_fetch.assert_called_with([mbid], includes=['artists', 'releases', + 'release-group-rels', 'url-rels', 'tags']) + cache_set.assert_called_with(key=expected_key, val=release_group, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = release_group + cache_set.reset_mock() + release_group_fetch.reset_mock() + get_release_group_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + release_group_fetch.assert_not_called() + cache_set.assert_not_called() + + @mock.patch('brainzutils.cache.get') + @mock.patch('brainzutils.cache.set') + @mock.patch('brainzutils.musicbrainz_db.work.fetch_multiple_works') + def test_work_cache(self, work_fetch, cache_set, cache_get): + mbid = "54ce5e07-2aca-4578-83d8-5a41a7b2f434" + expected_key = b"work_54ce5e07-2aca-4578-83d8-5a41a7b2f434" + work = { + "id": "54ce5e07-2aca-4578-83d8-5a41a7b2f434", + "name": "a lot", + "type": "Song", + } + work_fetch.return_value = {mbid: work} + + cache_get.return_value = None + get_work_by_id(mbid) + + # Test that first time data is fetched database is queried + cache_get.assert_called_with(expected_key) + work_fetch.assert_called_with([mbid], includes=['artist-rels', 'recording-rels']) + cache_set.assert_called_with(key=expected_key, val=work, time=DEFAULT_CACHE_EXPIRATION) + + cache_get.return_value = work + cache_set.reset_mock() + work_fetch.reset_mock() + get_work_by_id(mbid) + + # Test that second time data is fetched from cache + cache_get.assert_called_with(expected_key) + work_fetch.assert_not_called() + cache_set.assert_not_called() diff --git a/critiquebrainz/frontend/external/musicbrainz_db/work.py b/critiquebrainz/frontend/external/musicbrainz_db/work.py index a25306ac8..bc9238a88 100644 --- a/critiquebrainz/frontend/external/musicbrainz_db/work.py +++ b/critiquebrainz/frontend/external/musicbrainz_db/work.py @@ -1,5 +1,5 @@ from brainzutils import cache -from brainzutils.musicbrainz_db.work import fetch_multiple_works +from brainzutils.musicbrainz_db import work as db from critiquebrainz.frontend.external.musicbrainz_db import DEFAULT_CACHE_EXPIRATION @@ -15,7 +15,7 @@ def get_work_by_id(mbid): key = cache.gen_key('work', mbid) work = cache.get(key) if not work: - work = fetch_multiple_works( + work = db.fetch_multiple_works( [mbid], includes=['artist-rels', 'recording-rels'], ).get(mbid) From 601709133904f58b54e74485451ecca9c0d5cab4 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Fri, 18 Sep 2020 14:39:38 +0530 Subject: [PATCH 156/159] Redirect user to edit page if draft review exists --- critiquebrainz/frontend/views/review.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index 8e330fee5..571d5b311 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -228,12 +228,15 @@ def create(entity_type=None, entity_id=None): return redirect(url_for('user.reviews', user_id=current_user.id)) # Checking if the user already wrote a review for this entity - reviews, count = db_review.list_reviews(user_id=current_user.id, entity_id=entity_id) + reviews, count = db_review.list_reviews(user_id=current_user.id, entity_id=entity_id, inc_drafts=True) review = reviews[0] if count != 0 else None if review: - flash.error(gettext("You have already published a review for this entity")) - return redirect(url_for('review.entity', id=review["id"])) + if review['is_draft']: + return redirect(url_for('review.edit', id=review['id'])) + else: + flash.error(gettext("You have already published a review for this entity")) + return redirect(url_for('review.entity', id=review["id"])) if current_user.is_review_limit_exceeded: flash.error(gettext("You have exceeded your limit of reviews per day.")) From 8d55e8bcf89e8e12d46e80f74e449bc30ed6f09f Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Sat, 19 Sep 2020 01:35:35 +0530 Subject: [PATCH 157/159] Add test for draft redirect --- critiquebrainz/frontend/views/test/test_review.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index af7d2d9ea..b864cace3 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -104,6 +104,14 @@ def test_draft_review(self): response = self.client.get("/review/%s" % review["id"]) self.assert404(response, "Drafts shouldn't be publicly visible.") + def test_draft_redirect(self): + review = self.create_dummy_review(is_draft=True) + self.temporary_login(self.user) + response = self.client.get('/review/write/{}/{}/' + .format(review["entity_type"], review["entity_id"])) + redirect_url = urlparse(response.location) + self.assertEquals(redirect_url.path, url_for('review.edit', id=review['id'])) + def test_missing_review(self): response = self.client.get("/review/aef06569-098f-4218-a577-b413944d9493") self.assert404(response) From 2d319ad45e556e5ca3764a6fa1f956e455cc8289 Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Sat, 19 Sep 2020 13:36:57 +0530 Subject: [PATCH 158/159] Add redirect for hidden reviews in Write a Review --- critiquebrainz/frontend/views/review.py | 4 +++- critiquebrainz/frontend/views/test/test_review.py | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/critiquebrainz/frontend/views/review.py b/critiquebrainz/frontend/views/review.py index 571d5b311..1c4968671 100644 --- a/critiquebrainz/frontend/views/review.py +++ b/critiquebrainz/frontend/views/review.py @@ -228,12 +228,14 @@ def create(entity_type=None, entity_id=None): return redirect(url_for('user.reviews', user_id=current_user.id)) # Checking if the user already wrote a review for this entity - reviews, count = db_review.list_reviews(user_id=current_user.id, entity_id=entity_id, inc_drafts=True) + reviews, count = db_review.list_reviews(user_id=current_user.id, entity_id=entity_id, inc_drafts=True, inc_hidden=True) review = reviews[0] if count != 0 else None if review: if review['is_draft']: return redirect(url_for('review.edit', id=review['id'])) + elif review['is_hidden']: + return redirect(url_for('review.entity', id=review['id'])) else: flash.error(gettext("You have already published a review for this entity")) return redirect(url_for('review.entity', id=review["id"])) diff --git a/critiquebrainz/frontend/views/test/test_review.py b/critiquebrainz/frontend/views/test/test_review.py index b864cace3..0b2fbf889 100644 --- a/critiquebrainz/frontend/views/test/test_review.py +++ b/critiquebrainz/frontend/views/test/test_review.py @@ -48,7 +48,7 @@ def setUp(self): mb_release.browse_releases = MagicMock() current_app.jinja_env.filters['entity_details'] = mock_get_entity_by_id - def create_dummy_review(self, is_draft=False): + def create_dummy_review(self, is_draft=False, is_hidden=False): review = db_review.create( entity_id="6b3cd75d-7453-39f3-86c4-1441f360e121", entity_type="release_group", @@ -58,6 +58,8 @@ def create_dummy_review(self, is_draft=False): is_draft=is_draft, license_id=self.license["id"], ) + if is_hidden: + db_review.set_hidden_state(review["id"], is_hidden=True) return review def test_browse(self): @@ -323,3 +325,11 @@ def test_hide_unhide(self): follow_redirects=True, ) self.assertIn("Review is not hidden.", str(response.data)) + + def test_hide_redirect(self): + review = self.create_dummy_review(is_hidden=True) + self.temporary_login(self.user) + response = self.client.get('/review/write/{}/{}/'.format( + review["entity_type"], review["entity_id"])) + redirect_url = urlparse(response.location) + self.assertEquals(redirect_url.path, url_for('review.entity', id=review['id'])) From 2af2d07bbb9dfd237a89aedd7e5ec47359bb124a Mon Sep 17 00:00:00 2001 From: Kartik Ohri Date: Mon, 28 Sep 2020 18:13:01 +0530 Subject: [PATCH 159/159] Restrict scope of mocking to particular tests --- critiquebrainz/db/statistics_test.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/critiquebrainz/db/statistics_test.py b/critiquebrainz/db/statistics_test.py index 15f99026d..252222e17 100644 --- a/critiquebrainz/db/statistics_test.py +++ b/critiquebrainz/db/statistics_test.py @@ -15,10 +15,7 @@ # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from unittest.mock import MagicMock - -from brainzutils import cache +from unittest import mock import critiquebrainz.db.comment as db_comment import critiquebrainz.db.license as db_license @@ -47,10 +44,6 @@ def setUp(self): full_name=u"Test License", ) - # totally disable cache get or set - cache.get = MagicMock(return_value=None) - cache.set = MagicMock(return_value=None) - def create_dummy_review(self, user_id): return db_review.create( entity_id="e7aad618-fa86-3983-9e77-405e21796eca", @@ -143,7 +136,9 @@ def test_get_top_users(self): self.assertEqual(top_users[1]["id"], self.user_1.id) self.assertEqual(top_users[1]["score"], 1) - def test_get_top_users_overall(self): + @mock.patch('brainzutils.cache.get', return_value=None) + @mock.patch('brainzutils.cache.set', return_value=None) + def test_get_top_users_overall(self, cache_set, cache_get): # user_1 added a review review_1 = self.create_dummy_review(user_id=self.user_1.id) @@ -166,6 +161,12 @@ def test_get_top_users_overall(self): # get list of top users top_users = db_statistics.get_top_users_overall() + expected_key = b"top_users_overall_cb_statistics" + cache_get.assert_called_once_with(expected_key, + db_statistics._CACHE_NAMESPACE) + cache_set.assert_called_once_with(key=expected_key, val={"users": top_users}, + namespace=db_statistics._CACHE_NAMESPACE, + time=db_statistics._DEFAULT_CACHE_EXPIRATION) self.assertEqual(len(top_users), 2) self.assertEqual(top_users[0]["id"], self.user_2.id) self.assertEqual(top_users[0]["score"], 7)