diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d323ad32eb7ee7ed5a2099aa039ec659274a0e86..8fb02b54899d0a570bca8622b67179bed8073272 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -34,6 +34,12 @@ test_pylint: - cd backend/ - pylint core || exit 0 +test_prospector: + <<: *test_definition + script: + - cd backend/ + - prospector --uses django || exit 0 + .staging_template: &staging_definition stage: staging diff --git a/backend/.pylintrc b/backend/.pylintrc index 5f460322f42aa18322284f4aedbba8be75317b40..dc0fdb2dc4da190c837ce47ca197e7bd4ffe95ab 100644 --- a/backend/.pylintrc +++ b/backend/.pylintrc @@ -2,7 +2,7 @@ # Add files or directories to the blacklist. They should be base names, not # paths. -ignore=CVS, migrations, static, env, docs, manage.py, tests +ignore=CVS, migrations, static, env, docs, manage.py # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. @@ -13,7 +13,7 @@ ignore-patterns= #init-hook= # Use multiple processes to speed up Pylint. -jobs=2 +jobs=4 # Pickle collected data for later comparisons. persistent=yes @@ -26,6 +26,8 @@ suggestion-mode=yes # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. load-plugins=pylint_django [MESSAGES CONTROL] diff --git a/backend/Makefile b/backend/Makefile index 1fbb4228f68f15ca35cebd67c73522c1b30ef5bd..64d359b2954d6172665aec7772875bbe9e4e9b98 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -31,12 +31,12 @@ install: yarn test: - python manage.py run test + python manage.py test coverage: coverage run manage.py test coverage report db: - docker run -rm --name $(DB_NAME) -p 5432:5432 postgres:9.5 + docker run --rm --name $(DB_NAME) -p 5432:5432 postgres:9.5 diff --git a/backend/core/admin.py b/backend/core/admin.py index 95d5e64a29d2ab5802d1ba104beb0c55f56b0700..d423e1baf95f49fc46b51dd4b0097be43348df09 100644 --- a/backend/core/admin.py +++ b/backend/core/admin.py @@ -6,81 +6,16 @@ from django.contrib.auth.forms import ReadOnlyPasswordHashField from core.models import (Feedback, Reviewer, Student, Submission, SubmissionType, Test, Tutor, UserAccount) - -class UserCreationForm(forms.ModelForm): - """A form for creating new users. Includes all the required - fields, plus a repeated password.""" - password1 = forms.CharField(label='Password', widget=forms.PasswordInput) - password2 = forms.CharField( - label='Password confirmation', widget=forms.PasswordInput) - - class Meta: - model = UserAccount - fields = ('username',) - - def clean_password2(self): - # Check that the two password entries match - password1 = self.cleaned_data.get("password1") - password2 = self.cleaned_data.get("password2") - if password1 and password2 and password1 != password2: - raise forms.ValidationError("Passwords don't match") - return password2 - - def save(self, commit=True): - # Save the provided password in hashed format - user = super(UserCreationForm, self).save(commit=False) - user.set_password(self.cleaned_data["password1"]) - if commit: - user.save() - return user - - -class UserChangeForm(forms.ModelForm): - """A form for updating users. Includes all the fields on - the user, but replaces the password field with admin's - password hash display field. - """ - password = ReadOnlyPasswordHashField() - - class Meta: - model = UserAccount - fields = ('username', 'password', 'is_active', 'is_admin') - - def clean_password(self): - return self.initial["password"] - - -class UserAdmin(BaseUserAdmin): - # The forms to add and change user instances - form = UserChangeForm - add_form = UserCreationForm - - # The fields to be used in displaying the User model. - # These override the definitions on the base UserAdmin - # that reference specific fields on auth.User. - list_display = ('username', 'is_admin',) - list_filter = ('is_admin',) - fieldsets = ( - (None, {'fields': ('password',)}), - ('Permissions', - {'fields': ('username', 'password', 'is_admin', 'is_active')}), - ) - # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin - # overrides get_fieldsets to use this attribute when creating a user. - add_fieldsets = ( - (None, { - 'classes': ('wide',), - 'fields': ('username', 'password1', 'password2')} - ), - ) - filter_horizontal = () - - -admin.site.register(UserAccount, UserAdmin) +# Stuff we needwant +admin.site.register(UserAccount) admin.site.register(SubmissionType) admin.site.register(Feedback) admin.site.register(Test) +admin.site.register(ExamType) admin.site.register(Submission) admin.site.register(Reviewer) admin.site.register(Student) admin.site.register(Tutor) + +# ... and stuff we don't needwant +admin.site.unregister(Group) diff --git a/backend/core/migrations/0002_auto_20171110_1612.py b/backend/core/migrations/0002_auto_20171110_1612.py new file mode 100644 index 0000000000000000000000000000000000000000..51ea77b9d911e7133d6fd9f8f4d1c6d52d9b90d5 --- /dev/null +++ b/backend/core/migrations/0002_auto_20171110_1612.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2017-11-10 16:12 +from __future__ import unicode_literals + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0008_alter_user_username_max_length'), + ('core', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='useraccount', + options={'verbose_name': 'user', 'verbose_name_plural': 'users'}, + ), + migrations.AlterModelManagers( + name='useraccount', + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.AddField( + model_name='useraccount', + name='date_joined', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined'), + ), + migrations.AddField( + model_name='useraccount', + name='email', + field=models.EmailField(blank=True, max_length=254, verbose_name='email address'), + ), + migrations.AddField( + model_name='useraccount', + name='first_name', + field=models.CharField(blank=True, max_length=30, verbose_name='first name'), + ), + migrations.AddField( + model_name='useraccount', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='useraccount', + name='last_name', + field=models.CharField(blank=True, max_length=30, verbose_name='last name'), + ), + migrations.AddField( + model_name='useraccount', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + migrations.AlterField( + model_name='useraccount', + name='is_active', + field=models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active'), + ), + migrations.AlterField( + model_name='useraccount', + name='is_staff', + field=models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status'), + ), + migrations.AlterField( + model_name='useraccount', + name='is_superuser', + field=models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status'), + ), + migrations.AlterField( + model_name='useraccount', + name='username', + field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'), + ), + ] diff --git a/backend/core/models.py b/backend/core/models.py index 3124992c15475cd0b6cbc939d66780cc26f961c3..32189b7e4f1c9f88c313e528b86583a216112b5b 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -11,7 +11,7 @@ from random import randrange, sample from string import ascii_lowercase from django.contrib.auth import get_user_model -from django.contrib.auth.models import AbstractBaseUser, BaseUserManager +from django.contrib.auth.models import AbstractUser from django.db import models from django.db.models import Value as V from django.db.models import (BooleanField, Case, Count, F, IntegerField, Q, @@ -150,64 +150,16 @@ class SubmissionType(models.Model): ).order_by('name') -class UserAccountManager(BaseUserManager): - - def create_user(self, password=None, **kwargs): - if not kwargs.get('username'): - raise ValueError('Users must have a valid username.') - - account = self.model( - username=kwargs.get('username') - ) - - account.set_password(password) - account.save() - - return account - - def create_superuser(self, password, **kwargs): - account = self.create_user(password, **kwargs) - - account.is_admin = True - account.is_staff = True - account.is_superuser = True - account.save() - - return account - - -class UserAccount(AbstractBaseUser): +class UserAccount(AbstractUser): """ An abstract base class implementing a fully featured User model with admin-compliant permissions. Username and password are required. Other fields are optional. """ - objects = UserAccountManager() - - username = models.CharField( - max_length=150, - unique=True, - error_messages={ - 'unique': "A user with that username already exists.", - }, - ) fullname = models.CharField('full name', max_length=70, blank=True) - - is_staff = models.BooleanField('staff status', default=False) is_admin = models.BooleanField(default=False) - is_superuser = models.BooleanField(default=False) - - is_active = models.BooleanField('active', default=True) - - USERNAME_FIELD = 'username' - - def has_perm(self, *args): - return self.is_superuser - - def has_module_perms(self, *args): - return self.is_superuser def get_associated_user(self): """ Returns the user type that is associated with this user obj """ @@ -216,12 +168,6 @@ class UserAccount(AbstractBaseUser): (hasattr(self, 'reviewer') and self.reviewer) or \ (hasattr(self, 'tutor') and self.tutor) - def get_short_name(self): - return self.username - - def get_username(self): - return self.username - class Tutor(models.Model): user = models.OneToOneField( @@ -535,10 +481,10 @@ class Feedback(models.Model): ACCEPTED, ) = range(4) # this order matters STATUS = ( - (EDITABLE, 'editable'), - (OPEN, 'request reassignment'), - (NEEDS_REVIEW, 'request review'), - (ACCEPTED, 'accepted'), + (EDITABLE, 'editable'), + (OPEN, 'request reassignment'), + (NEEDS_REVIEW, 'request review'), + (ACCEPTED, 'accepted'), ) status = models.IntegerField( choices=STATUS, @@ -554,11 +500,11 @@ class Feedback(models.Model): MANUAL, ) = range(5) ORIGIN = ( - (WAS_EMPTY, 'was empty'), + (WAS_EMPTY, 'was empty'), (FAILED_UNIT_TESTS, 'passed unittests'), - (DID_NOT_COMPILE, 'did not compile'), - (COULD_NOT_LINK, 'could not link'), - (MANUAL, 'created by a human. yak!'), + (DID_NOT_COMPILE, 'did not compile'), + (COULD_NOT_LINK, 'could not link'), + (MANUAL, 'created by a human. yak!'), ) origin = models.IntegerField( choices=ORIGIN, diff --git a/backend/core/serializers.py b/backend/core/serializers.py index 17564bb85dbe8e6c728024a218d3bc049c2455e1..a5d7967f6d46e68132d215b3f577abec331c15ab 100644 --- a/backend/core/serializers.py +++ b/backend/core/serializers.py @@ -1,18 +1,17 @@ from rest_framework import serializers -from core.models import Student, Submission, Feedback, ExamType - -from core.models import Feedback, Student, Submission -from rest_framework import serializers -from core.models import Student, Submission, Feedback, ExamType +from core.models import ExamType, Feedback, Student, Submission class ExamSerializer(serializers.ModelSerializer): + class Meta: model = ExamType - fields = ('module_reference', 'total_score', 'pass_score', 'pass_only',) + fields = ('module_reference', 'total_score', + 'pass_score', 'pass_only',) class FeedbackSerializer(serializers.ModelSerializer): + class Meta: model = Feedback fields = ('text', 'score') diff --git a/backend/core/tests.py b/backend/core/tests.py index 9447b62443453bc2e8e251a092e812a2db790a77..f3290fbe0132092e58ed50fa7db0e04406b9b5e3 100644 --- a/backend/core/tests.py +++ b/backend/core/tests.py @@ -54,6 +54,7 @@ class FactoryTestCase(TestCase): def test_can_create_student(self): self.assertIn(self.factory.make_student(), Student.objects.all()) + class AccountsTestCase(TestCase): factory = GradyUserFactory() diff --git a/backend/core/views.py b/backend/core/views.py index 5ab7f1ef20219d23f692d3915e7f9c56871bbf19..2d20a7f84471c9f32ab469942f3dc1e7fa3eef9b 100644 --- a/backend/core/views.py +++ b/backend/core/views.py @@ -1,12 +1,18 @@ -from core.serializers import SubmissionSerializer, StudentSerializer, FeedbackSerializer +import logging + from rest_framework.generics import RetrieveAPIView + from core.permissions import IsStudent +from core.serializers import (FeedbackSerializer, StudentSerializer, + SubmissionSerializer) +log = logging.getLogger(__name__) class StudentApiView(RetrieveAPIView): permission_classes = (IsStudent,) def get_object(self): + log.debug("Serializing student of user '%s'", self.request.user.username) return self.request.user.student serializer_class = StudentSerializer diff --git a/backend/grady/settings/default.py b/backend/grady/settings/default.py index 295139848043c5cdd49a4241e3d6f135975a72cb..86e0c94956f52ceb7b459c8d8e015d73c4825a6c 100644 --- a/backend/grady/settings/default.py +++ b/backend/grady/settings/default.py @@ -10,8 +10,8 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.10/ref/settings/ """ -import os import datetime +import os from django.contrib.messages import constants as messages @@ -160,3 +160,51 @@ JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=600), } +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + 'django.server': { + 'datefmt': '%d/%b/%Y %H:%M:%S', + 'format': '[%(asctime)s] %(levelname)-10s %(name)-20s %(message)s', + }, + 'core': { + 'datefmt': '%d/%b/%Y %H:%M:%S', + 'format': '[%(asctime)s] %(levelname)-10s %(name)-20s "%(message)s"', + }, + }, + 'filters': { + 'require_debug_true': { + '()': 'django.utils.log.RequireDebugTrue', + }, + }, + 'handlers': { + 'console': { + 'level': 'DEBUG', + 'filters': ['require_debug_true'], + 'class': 'logging.StreamHandler', + 'formatter': 'core' + }, + 'django': { + 'level': 'INFO', + 'class': 'logging.StreamHandler', + 'formatter': 'django.server' + }, + 'mail_admins': { # TODO: configuration + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler', + } + }, + 'loggers': { + 'django': { + 'handlers': ['django'], + }, + 'django.request': { + 'handlers': ['django'], + }, + 'core': { + 'handlers': ['console', 'mail_admins'], + 'level': 'DEBUG', + } + } +} diff --git a/backend/requirements.txt b/backend/requirements.txt index a6f7f9bd66342e2ef152350adf28a59ea9d4ae2a..d035c1effbd4e161ec2d139f5398ae54073ebee1 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -7,5 +7,5 @@ gunicorn~=19.7.0 psycopg2~=2.7.1 xlrd~=1.0.0 pytest-cov~=2.5.1 -pylint~=1.7.4 +prospector~=0.12.7 django-cors-headers~=2.1.0 diff --git a/frontend/package.json b/frontend/package.json index 0c946c7d11266e7cf0276ac7bb2fd8dfc0c7af10..f265370c031533dae786d607882f9c39a36a2aca 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,7 +9,7 @@ "start": "npm run dev", "build": "node build/build.js", "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", - "test": "npm run unit", + "test": "karma start test/unit/karma.conf.js", "lint": "eslint --ext .js,.vue src test/unit/specs" }, "dependencies": { @@ -36,6 +36,7 @@ "copy-webpack-plugin": "^4.0.1", "cross-env": "^5.0.1", "css-loader": "^0.28.0", + "es6-promise": "^4.1.1", "eslint": "^3.19.0", "eslint-config-standard": "^10.2.1", "eslint-friendly-formatter": "^3.0.0", diff --git a/frontend/src/components/student/SubmissionList.vue b/frontend/src/components/student/SubmissionList.vue index 3474bfd527f70ade181d80e319cb6d0ce776d7e6..c39e745fc152cca06a50428cc0f9fe595b858230 100644 --- a/frontend/src/components/student/SubmissionList.vue +++ b/frontend/src/components/student/SubmissionList.vue @@ -1,7 +1,9 @@ <template> <div class="row my-2 justify-content-center"> <b-table hover :items="submissions" :fields="fields"></b-table> - <div class="alert alert-info">You reached <b>{{ sumScore }}</b> of <b>{{ sumFullScore }}</b> possible points( {{ pointRatio }}% ).</div> + <div class="alert alert-info"> + You reached <b>{{ sumScore }}</b> of <b>{{ sumFullScore }}</b> possible points( {{ pointRatio }}% ). + </div> </div> </template> diff --git a/frontend/test/unit/index.js b/frontend/test/unit/index.js index c69f33fd8a0fb2796073222645c42c7c15188a6e..d0ddfd3846b6da1e934c141b7137655ccd6b13b2 100644 --- a/frontend/test/unit/index.js +++ b/frontend/test/unit/index.js @@ -1,4 +1,5 @@ import Vue from 'vue' +import 'es6-promise/auto' Vue.config.productionTip = false diff --git a/frontend/test/unit/karma.conf.js b/frontend/test/unit/karma.conf.js index 8e4951c9e4ecc597be347be1fd8e163cdbab13e2..b77a340f7b3796e08e7f60abee8bded5c26365df 100644 --- a/frontend/test/unit/karma.conf.js +++ b/frontend/test/unit/karma.conf.js @@ -7,10 +7,6 @@ var webpackConfig = require('../../build/webpack.test.conf') module.exports = function (config) { config.set({ - // to run in additional browsers: - // 1. install corresponding karma launcher - // http://karma-runner.github.io/0.13/config/browsers.html - // 2. add it to the `browsers` array below. browsers: ['PhantomJS'], frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'], reporters: ['spec', 'coverage'], diff --git a/frontend/test/unit/specs/Hello.spec.js b/frontend/test/unit/specs/Hello.spec.js deleted file mode 100644 index bfaa225c95f61e61e5e03bab02e25166f063199d..0000000000000000000000000000000000000000 --- a/frontend/test/unit/specs/Hello.spec.js +++ /dev/null @@ -1,11 +0,0 @@ -import Vue from 'vue' -import HelloWorld from '@/components/HelloWorld' - -describe('HelloWorld.vue', () => { - it('should render correct contents', () => { - const Constructor = Vue.extend(HelloWorld) - const vm = new Constructor().$mount() - expect(vm.$el.querySelector('.hello h1').textContent) - .to.equal('Welcome to Your Vue.js App') - }) -}) diff --git a/frontend/test/unit/specs/SubmissionList.spec.js b/frontend/test/unit/specs/SubmissionList.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..8e855486029934dc781d0058d6bc7e11c7d2ac03 --- /dev/null +++ b/frontend/test/unit/specs/SubmissionList.spec.js @@ -0,0 +1,39 @@ +import Vue from 'vue' +import SubmissionList from '@/components/student/SubmissionList' + +describe('SubmissionList.vue', () => { + it('tests the SubmissionList for students', () => { + const data = [{ + 'type': 'Aufgabe 01', + 'text': 'I dont know the answer.', + 'feedback': 'I am very disappointed.', + 'score': 5, + 'full_score': 14 + }, + { + 'type': 'Aufgabe 01', + 'text': 'A very good solution, indeed', + 'feedback': 'I am still very disappointed.', + 'score': 7, + 'full_score': 10 + }] + + const Constructor = Vue.extend(SubmissionList) + + const comp = new Constructor({ + propsData: { + // Props are passed in "propsData". + submissions: data + } + }).$mount() + + expect(comp.sumScore) + .to.equal(12) + + expect(comp.sumFullScore) + .to.equal(24) + + expect(comp.pointRatio) + .to.equal('50.00') + }) +}) diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 3d843ede7db636f40806ba4d89597d6c49bdbe2b..d417ec11d84acfaefbada048d993b002dae8a9c2 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -220,13 +220,17 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async@1.x, async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" async@^2.1.2, async@^2.4.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" @@ -748,6 +752,14 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + babel-preset-env@^1.3.2: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" @@ -958,10 +970,11 @@ boom@5.x.x: hoek "4.x.x" bootstrap-vue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-1.0.0.tgz#65c1d18bce782672c18ba54188e13c2e18725ae0" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-1.0.2.tgz#6fe0222be4e01572fa83ff4478549f260c0cff8b" dependencies: lodash.startcase "^4.4.0" + opencollective "^1.0.3" popper.js "^1.12.6" vue-functional-data-merge "^1.0.6" @@ -1058,10 +1071,10 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: electron-to-chromium "^1.2.7" browserslist@^2.1.2, browserslist@^2.5.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.7.0.tgz#dc375dc70048fec3d989042a35022342902eff00" + version "2.8.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.8.0.tgz#27d64028130a2e8585ca96f7c3b7730eff4de493" dependencies: - caniuse-lite "^1.0.30000757" + caniuse-lite "^1.0.30000758" electron-to-chromium "^1.3.27" buffer-xor@^1.0.3: @@ -1138,12 +1151,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000758" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000758.tgz#a235627b1922e878b63164942c991b84de92c810" + version "1.0.30000760" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000760.tgz#3ea29473eb78a6ccb09f2eb73ac9e1debfec528d" -caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000757: - version "1.0.30000758" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000758.tgz#e261140076651049cf6891ed4bc649b5c8c26c69" +caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000758: + version "1.0.30000760" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000760.tgz#ec720395742f1c7ec8947fd6dd2604e77a8f98ff" caseless@~0.12.0: version "0.12.0" @@ -1167,7 +1180,7 @@ chai@^4.1.2: pathval "^1.0.0" type-detect "^4.0.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1264,8 +1277,8 @@ cliui@^3.2.0: wrap-ansi "^2.0.0" clone@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" co@^4.6.0: version "4.6.0" @@ -1286,8 +1299,8 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" dependencies: color-name "^1.1.1" @@ -1375,6 +1388,13 @@ concat-stream@1.6.0, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +config-chain@~1.1.5: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + connect-history-api-fallback@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz#3db24f973f4b923b0e82f619ce0df02411ca623d" @@ -1897,6 +1917,12 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + engine.io-client@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" @@ -1997,7 +2023,7 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-promise@^4.0.3: +es6-promise@^4.0.3, es6-promise@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" @@ -2324,6 +2350,14 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -2381,6 +2415,12 @@ figures@^1.3.5: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -2951,7 +2991,7 @@ https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" -iconv-lite@0.4.19: +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -3006,7 +3046,7 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" @@ -3016,6 +3056,24 @@ inject-loader@^3.0.0: dependencies: babel-core "~6" +inquirer@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + inquirer@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" @@ -3189,6 +3247,10 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -3312,6 +3374,10 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jschardet@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -3666,9 +3732,9 @@ lolex@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" -lolex@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.3.tgz#53f893bbe88c80378156240e127126b905c83087" +lolex@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.0.tgz#d6bad0f0aa5caebffcfebb09fb2caa89baaff51c" longest@^1.0.1: version "1.0.1" @@ -3885,6 +3951,10 @@ mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + nan@^2.3.0: version "2.7.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" @@ -3925,6 +3995,13 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -3969,7 +4046,7 @@ node-pre-gyp@^0.6.36: tar "^2.2.1" tar-pack "^3.4.0" -nopt@3.x: +nopt@3.x, nopt@~3.0.1: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -4088,10 +4165,28 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opencollective@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + opener@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + opn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" @@ -4520,8 +4615,8 @@ postcss-minify-selectors@^2.0.4: postcss-selector-parser "^2.0.0" postcss-modules-extract-imports@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" dependencies: postcss "^6.0.1" @@ -4656,8 +4751,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@^1.7.0: - version "1.7.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.7.4.tgz#5e8624ae9363c80f95ec644584ecdf55d74f93fa" + version "1.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.8.1.tgz#91064d778c08c85ac1cbe6b23195c34310d039f9" pretty-error@^2.0.2: version "2.1.1" @@ -4682,6 +4777,10 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" @@ -4887,6 +4986,10 @@ regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + regenerator-runtime@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" @@ -5103,18 +5206,24 @@ run-async@^0.1.0: dependencies: once "^1.3.0" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -safe-buffer@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - samsam@1.x: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" @@ -5222,13 +5331,13 @@ sinon-chai@^2.8.0: resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d" sinon@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.1.1.tgz#bd657be815df608887fe1f0b75f9590ec563748a" + version "4.1.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.1.2.tgz#65610521d926fb53742dd84cd599f0b89a82f440" dependencies: diff "^3.1.0" formatio "1.2.0" lodash.get "^4.4.2" - lolex "^2.1.3" + lolex "^2.2.0" nise "^1.2.0" supports-color "^4.4.0" type-detect "^4.0.0" @@ -5313,7 +5422,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5587,7 +5696,7 @@ tmp@0.0.31: dependencies: os-tmpdir "~1.0.1" -tmp@0.0.x: +tmp@0.0.x, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: @@ -5663,8 +5772,8 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" uglify-js@3.1.x: - version "3.1.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.6.tgz#918832602036e95d2318e11f27ee8461a8592c5d" + version "3.1.8" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.8.tgz#780d08b4f6782fe36ea5484d952362eddaf1d7b8" dependencies: commander "~2.11.0" source-map "~0.6.1" @@ -5814,17 +5923,25 @@ void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" +vue-beautify@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/vue-beautify/-/vue-beautify-1.1.3.tgz#69d193b641db0047e26378858bb759754ee53692" + dependencies: + config-chain "~1.1.5" + mkdirp "~0.5.0" + nopt "~3.0.1" + vue-functional-data-merge@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-1.0.6.tgz#cde4f0cf3f251f7f0196341156d2c936cca63d40" vue-hot-reload-api@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.2.0.tgz#9a21b35ced3634434a43ee80efb7350ea8fb206d" + version "2.2.3" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.2.3.tgz#43c8e5506d65a271d2571936d77253019fd3eb17" vue-loader@^13.3.0: - version "13.4.0" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-13.4.0.tgz#44aa7eef4fb1be89fbc37193ad33b8253417c4b9" + version "13.5.0" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-13.5.0.tgz#52f7b3790a267eff80012b77ea187a54586dd5d4" dependencies: consolidate "^0.14.0" hash-sum "^1.0.2" @@ -5852,8 +5969,8 @@ vue-style-loader@^3.0.0, vue-style-loader@^3.0.1: loader-utils "^1.0.2" vue-template-compiler@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.2.tgz#6f198ebc677b8f804315cd33b91e849315ae7177" + version "2.5.3" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.3.tgz#ab631b0694e211a6aaf0d800102b37836aae36a4" dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -5863,8 +5980,8 @@ vue-template-es2015-compiler@^1.6.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" vue@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.2.tgz#fd367a87bae7535e47f9dc5c9ec3b496e5feb5a4" + version "2.5.3" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.3.tgz#e1a3b1f49b6e93e574ce040b95cbc873912fecc1" vuex@^3.0.1: version "3.0.1" @@ -5879,8 +5996,8 @@ watchpack@^1.4.0: graceful-fs "^4.1.2" webpack-bundle-analyzer@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.0.tgz#b58bc34cc30b27ffdbaf3d00bf27aba6fa29c6e3" + version "2.9.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.1.tgz#c2c8e03e8e5768ed288b39ae9e27a8b8d7b9d476" dependencies: acorn "^5.1.1" chalk "^1.1.3" @@ -5892,7 +6009,7 @@ webpack-bundle-analyzer@^2.9.0: lodash "^4.17.4" mkdirp "^0.5.1" opener "^1.4.3" - ws "^2.3.1" + ws "^3.3.1" webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.12.0: version "1.12.0" @@ -5920,11 +6037,11 @@ webpack-merge@^4.1.0: lodash "^4.17.4" webpack-sources@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" + version "1.0.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.2.tgz#d0148ec083b3b5ccef1035a6b3ec16442983b27a" dependencies: source-list-map "^2.0.0" - source-map "~0.5.3" + source-map "~0.6.1" webpack@^3.6.0: version "3.8.1" @@ -6013,11 +6130,12 @@ ws@1.1.2: options ">=0.0.5" ultron "1.0.x" -ws@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80" +ws@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.1.tgz#d97e34dee06a1190c61ac1e95f43cb60b78cf939" dependencies: - safe-buffer "~5.0.1" + async-limiter "~1.0.0" + safe-buffer "~5.1.0" ultron "~1.1.0" wtf-8@1.0.0: