diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..cae54a25 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v12.14.1 diff --git a/.travis.yml b/.travis.yml index 31069c40..995d8476 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,30 @@ language: ruby +dist: xenial +sudo: required +addons: + chrome: stable cache: bundler: true yarn: true directories: - node_modules - vendor/bundle +before_install: +- google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost & install: - bundle install --deployment +- nvm install +- node --version - yarn install before_script: - export SECRET_KEY_BASE=`bundle exec rake secret` - bundle exec rake db:create RAILS_ENV=test +- RAILS_ENV=test bundle exec rails webdrivers:chromedriver:update -r webdrivers +- ln -s /home/travis/.webdrivers/chromedriver ~/bin/chromedriver +- export PATH=~/bin:$PATH script: -- bundle exec rake +- bundle exec rspec +- xvfb-run -a bundle exec rspec --tag browser - yarn test after_success: - chmod +x ./compile-build @@ -20,6 +32,7 @@ after_success: services: - redis-server - mysql +- xvfb deploy: provider: releases api_key: diff --git a/Gemfile b/Gemfile index c9c205db..6e80604c 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,7 @@ gem 'jquery-rails' gem 'react-rails' gem 'sass-rails' gem 'bootstrap-sass' +gem 'sass' gem 'will_paginate' gem 'will_paginate-bootstrap' @@ -83,6 +84,11 @@ group :test do gem 'rails-controller-testing' gem 'database_cleaner' gem 'json-schema' + gem 'capybara' + gem 'selenium-webdriver' + gem 'mock_redis' + # Keep webdriver in sync with chrome to prevent frustrating CI failures + gem 'webdrivers', require: false end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index e92f178c..011abdb6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,7 +25,7 @@ GIT GEM remote: http://rubygems.org/ specs: - aasm (5.0.5) + aasm (5.0.6) concurrent-ruby (~> 1.0) ace-rails-ap (4.2) actioncable (5.1.7) @@ -60,7 +60,7 @@ GEM activemodel (= 5.1.7) activesupport (= 5.1.7) arel (~> 8.0) - activerecord-import (1.0.2) + activerecord-import (1.0.3) activerecord (>= 3.2) activerecord-session_store (1.1.3) actionpack (>= 4.0) @@ -73,39 +73,48 @@ GEM i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.6.0) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) arel (8.0.0) ast (2.4.0) - autoprefixer-rails (9.6.0) + autoprefixer-rails (9.7.3) execjs babel-source (5.8.35) babel-transpiler (0.7.0) babel-source (>= 4.0, < 6) execjs (~> 2.0) backports (3.15.0) - bindex (0.7.0) + bindex (0.8.1) bootstrap-sass (3.4.1) autoprefixer-rails (>= 5.2.1) sassc (>= 2.0.0) - bootstrap_form (4.2.0) + bootstrap_form (4.3.0) actionpack (>= 5.0) activemodel (>= 5.0) - builder (3.2.3) + builder (3.2.4) byebug (11.0.1) + capybara (3.29.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (~> 1.5) + xpath (~> 3.2) + childprocess (3.0.0) coderay (1.1.2) concurrent-ruby (1.1.5) connection_pool (2.2.2) - crass (1.0.4) + crass (1.0.5) daemons (1.3.1) database_cleaner (1.7.0) - delayed_job (4.1.7) - activesupport (>= 3.0, < 5.3) - delayed_job_active_record (4.1.3) - activerecord (>= 3.0, < 5.3) + delayed_job (4.1.8) + activesupport (>= 3.0, < 6.1) + delayed_job_active_record (4.1.4) + activerecord (>= 3.0, < 6.1) delayed_job (>= 3.0, < 5) diff-lcs (1.3) - domain_name (0.5.20180417) + domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dropzonejs-rails (0.8.4) rails (> 3.1) @@ -113,23 +122,23 @@ GEM rdf (~> 3.0) sxp (~> 1.0) ejs (1.1.1) - erubi (1.8.0) + erubi (1.9.0) ethon (0.12.0) ffi (>= 1.3.0) - exception_notification (4.3.0) - actionmailer (>= 4.0, < 6) - activesupport (>= 4.0, < 6) + exception_notification (4.4.0) + actionmailer (>= 4.0, < 7) + activesupport (>= 4.0, < 7) execjs (2.7.0) - factory_bot (5.0.2) + factory_bot (5.1.1) activesupport (>= 4.2.0) - factory_bot_rails (5.0.2) - factory_bot (~> 5.0.2) + factory_bot_rails (5.1.1) + factory_bot (~> 5.1.0) railties (>= 4.2.0) - faraday (0.15.4) + faraday (0.17.1) multipart-post (>= 1.2, < 3) faraday_middleware (0.13.1) faraday (>= 0.7.4, < 1.0) - ffi (1.11.1) + ffi (1.11.3) gh (0.14.0) addressable backports @@ -145,11 +154,12 @@ GEM hamster (3.0.0) concurrent-ruby (~> 1.0) highline (1.7.10) + http-accept (1.7.0) http-cookie (1.0.3) domain_name (~> 0.5) - i18n (1.6.0) + i18n (1.7.0) concurrent-ruby (~> 1.0) - jaro_winkler (1.5.3) + jaro_winkler (1.5.4) jbuilder (2.9.1) activesupport (>= 4.2.0) jquery-rails (4.3.5) @@ -158,24 +168,24 @@ GEM thor (>= 0.14, < 2.0) js_cookie_rails (2.2.0) railties (>= 3.1) - json (2.2.0) + json (2.3.0) json-schema (2.8.1) addressable (>= 2.4) - json_api_client (1.12.0) + json_api_client (1.16.1) activemodel (>= 3.2.0) activesupport (>= 3.2.0) addressable (~> 2.2) faraday (~> 0.15, >= 0.15.2) faraday_middleware (~> 0.9) rack (>= 0.2) - jsonapi-resources (0.9.10) + jsonapi-resources (0.10.2) activerecord (>= 4.1) concurrent-ruby railties (>= 4.1) launchy (2.4.3) addressable (~> 2.3) link_header (0.0.8) - loofah (2.2.3) + loofah (2.4.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) macaddr (1.7.2) @@ -184,31 +194,33 @@ GEM mini_mime (>= 0.1.1) method_source (0.9.2) micro_token (0.0.4) - mime-types (3.2.2) + mime-types (3.3) mime-types-data (~> 3.2015) - mime-types-data (3.2019.0331) + mime-types-data (3.2019.1009) mini_mime (1.0.2) mini_portile2 (2.4.0) - minitest (5.11.3) - multi_json (1.13.1) + minitest (5.13.0) + mock_redis (0.22.0) + multi_json (1.14.1) multipart-post (2.1.1) - mysql2 (0.5.2) - net-http-persistent (3.0.1) + mysql2 (0.5.3) + net-http-persistent (3.1.0) connection_pool (~> 2.2) net-http-pipeline (1.0.1) netrc (0.11.0) - nio4r (2.4.0) - nokogiri (1.10.3) + nio4r (2.5.2) + nokogiri (1.10.7) mini_portile2 (~> 2.4.0) os (0.9.6) - parallel (1.17.0) - parser (2.6.3.0) + parallel (1.19.1) + parser (2.6.5.0) ast (~> 2.4.0) pry (0.12.2) coderay (~> 1.1.0) method_source (~> 0.9.0) - public_suffix (3.1.0) - puma (3.12.1) + public_suffix (4.0.1) + puma (4.3.3) + nio4r (~> 2.0) pusher-client (0.6.2) json websocket (~> 1.0) @@ -240,8 +252,8 @@ GEM rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.0.4) - loofah (~> 2.2, >= 2.2.2) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) railties (5.1.7) actionpack (= 5.1.7) activesupport (= 5.1.7) @@ -249,12 +261,12 @@ GEM rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (3.0.0) - rake (12.3.3) + rake (13.0.1) rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) rb-readline (0.5.5) - rdf (3.0.12) + rdf (3.0.13) hamster (~> 3.0) link_header (~> 0.0, >= 0.0.8) rdf-aggregate-repo (2.2.1) @@ -265,50 +277,53 @@ GEM sxp (~> 1.0) rdf-xsd (3.0.1) rdf (~> 3.0) - rdoc (6.1.1) - react-rails (2.5.0) + rdoc (6.2.0) + react-rails (2.6.0) babel-transpiler (>= 0.7.0) connection_pool execjs railties (>= 3.2) tilt - redis (4.1.2) - rest-client (2.0.2) + redis (4.1.3) + regexp_parser (1.6.0) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 4.0) netrc (~> 0.8) - rspec-core (3.8.1) - rspec-support (~> 3.8.0) - rspec-expectations (3.8.4) + rspec-core (3.9.0) + rspec-support (~> 3.9.0) + rspec-expectations (3.9.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.8.0) - rspec-mocks (3.8.1) + rspec-support (~> 3.9.0) + rspec-mocks (3.9.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.8.0) - rspec-rails (3.8.2) + rspec-support (~> 3.9.0) + rspec-rails (3.9.0) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec-core (~> 3.8.0) - rspec-expectations (~> 3.8.0) - rspec-mocks (~> 3.8.0) - rspec-support (~> 3.8.0) - rspec-support (3.8.2) - rubocop (0.71.0) + rspec-core (~> 3.9.0) + rspec-expectations (~> 3.9.0) + rspec-mocks (~> 3.9.0) + rspec-support (~> 3.9.0) + rspec-support (3.9.0) + rubocop (0.77.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.6) rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 1.7) - rubocop-performance (1.4.0) + rubocop-performance (1.5.1) rubocop (>= 0.71.0) - rubocop-rails (2.0.1) + rubocop-rails (2.4.0) rack (>= 1.1) - rubocop (>= 0.70.0) + rubocop (>= 0.72.0) ruby-growl (4.1) uuid (~> 2.3, >= 2.3.5) ruby-progressbar (1.10.1) + rubyzip (2.0.0) sane (0.25.8) os (~> 0) sass (3.7.4) @@ -316,18 +331,22 @@ GEM sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - sass-rails (5.0.7) - railties (>= 4.0.0, < 6) - sass (~> 3.1) - sprockets (>= 2.8, < 4.0) - sprockets-rails (>= 2.0, < 4.0) - tilt (>= 1.1, < 3) - sassc (2.0.1) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) + sassc (2.2.1) ffi (~> 1.9) - rake + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt sdoc (1.0.0) rdoc (>= 5.0) - shoulda-matchers (4.1.0) + selenium-webdriver (3.142.6) + childprocess (>= 0.5, < 4.0) + rubyzip (>= 1.2.2) + shoulda-matchers (4.1.2) activesupport (>= 4.2.0) sparql (3.0.2) builder (~> 3.2) @@ -351,9 +370,9 @@ GEM sxp (1.0.2) rdf (~> 3.0) systemu (2.6.5) - thor (0.20.3) + thor (1.0.0) thread_safe (0.3.6) - tilt (2.0.9) + tilt (2.0.10) travis (1.8.10) backports faraday (~> 0.9) @@ -365,14 +384,14 @@ GEM typhoeus (~> 0.6, >= 0.6.8) travis-lint (2.0.0) json - turbolinks (5.2.0) + turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) typhoeus (0.8.0) ethon (>= 0.8.0) tzinfo (1.2.5) thread_safe (~> 0.1) - tzinfo-data (1.2019.1) + tzinfo-data (1.2019.3) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext @@ -385,7 +404,11 @@ GEM activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) - webpacker (4.0.7) + webdrivers (4.1.3) + nokogiri (~> 1.6) + rubyzip (>= 1.3.0) + selenium-webdriver (>= 3.0, < 4.0) + webpacker (4.2.2) activesupport (>= 4.2) rack-proxy (>= 0.6.1) railties (>= 4.2) @@ -395,9 +418,11 @@ GEM websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.4) - will_paginate (3.1.7) + will_paginate (3.2.1) will_paginate-bootstrap (1.0.2) will_paginate (>= 3.0.3) + xpath (3.2.0) + nokogiri (~> 1.8) yajl-ruby (1.4.1) PLATFORMS @@ -411,6 +436,7 @@ DEPENDENCIES bootstrap-sass bootstrap_form byebug + capybara daemons database_cleaner delayed_job @@ -431,6 +457,7 @@ DEPENDENCIES jsonapi-resources launchy micro_token + mock_redis mysql2 pmb-client! pry @@ -450,8 +477,10 @@ DEPENDENCIES rubocop-rails ruby-growl sanger_barcode_format! + sass sass-rails sdoc + selenium-webdriver sequencescape-client-api! shoulda-matchers spring @@ -461,6 +490,7 @@ DEPENDENCIES turbolinks tzinfo-data web-console + webdrivers webpacker webpacker-react will_paginate diff --git a/app/channels/activity_channel.rb b/app/channels/activity_channel.rb index 09b1f1a4..f3fa2f53 100644 --- a/app/channels/activity_channel.rb +++ b/app/channels/activity_channel.rb @@ -1,111 +1,34 @@ class ActivityChannel < ApplicationCable::Channel + include ChannelConcerns::MessagesProcessing + include ChannelConcerns::StreamsManagement - def self.connection_for_redis - ActionCable.server.pubsub.redis_connection_for_subscriptions - end - - def connection_for_redis - self.class.connection_for_redis - end - - def self.redis - self.connection_for_redis - end - - def redis - connection_for_redis - end - - def self.subscribed_ids - value = connection_for_redis.get('SUBSCRIBED_IDS') - return [] unless value - JSON.parse(value) - end - - def receive(data) - process_asset_group(strong_params_for_asset_group(data)) if (data["asset_group"]) - process_activity(strong_params_for_activity(data)) if (data["activity"]) - end - - def process_asset_group(strong_params) - asset_group = AssetGroup.find(strong_params[:id]) - assets = strong_params[:assets] - if asset_group && assets - begin - received_list = [] - - received_list = assets.map do |uuid_or_barcode| - Asset.find_or_import_asset_with_barcode(uuid_or_barcode) - end.compact - - asset_group.update_with_assets(received_list) - - #asset_group.update_attributes(assets: received_list) - #asset_group.touch - rescue Errno::ECONNREFUSED => e - asset_group.activity.send_wss_event({error: {type: 'danger', msg: 'Cannot connect with sequencescape'} }) - rescue StandardError => e - asset_group.activity.send_wss_event({error: {type: 'danger', msg: e.message} }) - end - end - end - - def process_activity(strong_params) - activity = Activity.find(params[:activity_id]) - - obj = ActivityChannel.activity_attributes(params[:activity_id]) - - ['stepTypes', 'stepsPending', 'stepsRunning', 'stepsFailed', 'stepsFinished'].reduce(obj) do |memo, key| - memo[key] = !!strong_params[key] unless strong_params[key].nil? - memo - end - - redis.hset('activities', params[:activity_id], obj.to_json) - - activity.touch + def stream_id + "activity_#{params[:activity_id]}" end - def self.default_activity_attributes - { stepTypes: true, stepsPending: true, stepsRunning:true, stepsFailed: true, stepsFinished: false }.as_json - end + def subscribed + add_stream_to_list(stream_id) - def self.activity_attributes(id) - begin - JSON.parse(redis.hget('activities', id)) || default_activity_attributes - rescue StandardError => e - default_activity_attributes - end + create_message_processors! + stream_from stream_id end - def strong_params_for_asset_group(params) - params = ActionController::Parameters.new(params) - params.require(:asset_group).permit(:id, :assets => []) - end + def unsubscribed + remove_stream_from_list(stream_id) - def strong_params_for_activity(params) - params = ActionController::Parameters.new(params) - params.require(:activity).permit(:id, :stepTypes, :stepsPending, :stepsRunning, :stepsFailed, :stepsFinished) + stop_all_streams end - def subscribed_ids - self.class.subscribed_ids + def receive(message_from_frontend) + process_message(message_from_frontend) end - def stream_id - "activity_#{params[:activity_id]}" + def redis + self.class.redis end - def subscribed - previous_value = subscribed_ids || [] - connection_for_redis.set('SUBSCRIBED_IDS', previous_value.push(stream_id)) unless previous_value.include?(stream_id) - - stream_from stream_id + def self.redis + ActionCable.server.pubsub.redis_connection_for_subscriptions end - def unsubscribed - previous_value = subscribed_ids - connection_for_redis.set('SUBSCRIBED_IDS', previous_value.reject{|v| v== stream_id }) - - stop_all_streams - end end diff --git a/app/channels/channel_concerns/messages_processing.rb b/app/channels/channel_concerns/messages_processing.rb new file mode 100644 index 00000000..49d38108 --- /dev/null +++ b/app/channels/channel_concerns/messages_processing.rb @@ -0,0 +1,42 @@ +module ChannelConcerns + module MessagesProcessing + def self.included(klass) + klass.instance_eval do + include InstanceMethods + extend ClassMethods + end + end + + module InstanceMethods + + def message_processors + @message_processors + end + + def process_message(message_from_frontend) + message_processors.each do |processor| + if processor.interested_in?(message_from_frontend) + processor.process(message_from_frontend) + end + end + end + + def create_message_processors! + @message_processors ||= self.class.registered_message_processor_classes.map do |p| + p.new(channel: self) + end + end + end + + module ClassMethods + def register_message_processor(message_processor_class) + @registered_message_processor_classes ||= [] + @registered_message_processor_classes.push(message_processor_class) + end + + def registered_message_processor_classes + @registered_message_processor_classes + end + end + end +end diff --git a/app/channels/channel_concerns/streams_management.rb b/app/channels/channel_concerns/streams_management.rb new file mode 100644 index 00000000..0899a8a2 --- /dev/null +++ b/app/channels/channel_concerns/streams_management.rb @@ -0,0 +1,37 @@ +module ChannelConcerns + module StreamsManagement + + def self.included(klass) + klass.instance_eval do + include InstanceMethods + extend ClassMethods + end + end + + module InstanceMethods + def add_stream_to_list(stream_id) + previous_value = subscribed_ids || [] + redis.set('SUBSCRIBED_IDS', previous_value.push(stream_id)) unless previous_value.include?(stream_id) + end + + def remove_stream_from_list(stream_id) + previous_value = subscribed_ids + redis.set('SUBSCRIBED_IDS', previous_value.reject{|v| v== stream_id }) + end + + def subscribed_ids + self.class.subscribed_ids + end + end + + module ClassMethods + def subscribed_ids + value = redis.get('SUBSCRIBED_IDS') + return [] unless value + JSON.parse(value) + end + end + + + end +end diff --git a/app/models/activities/websocket_events.rb b/app/models/activities/websocket_events.rb index f02da628..39c7cf96 100644 --- a/app/models/activities/websocket_events.rb +++ b/app/models/activities/websocket_events.rb @@ -23,11 +23,15 @@ def stream_id def websockets_attributes(attrs) attrs.keys.reduce({shownComponents: {}}) do |memo, key| - memo[key] = attrs[key].call unless (ActivityChannel.activity_attributes(id)[key.to_s] == false) + memo[key] = attrs[key].call unless (activity_channel_attributes(id)[key.to_s] == false) memo end end + def activity_channel_attributes(id) + MessageProcessors::ActivityMessageProcessor.activity_attributes(id) + end + def initial_websockets_attributes(attrs) attrs.keys.reduce({}) do |memo, key| memo[key] = attrs[key].call diff --git a/app/models/asset.rb b/app/models/asset.rb index c3f53e79..0c1d9d35 100644 --- a/app/models/asset.rb +++ b/app/models/asset.rb @@ -37,6 +37,8 @@ def update_compatible_activity_type has_many :activities, -> { distinct }, :through => :steps + scope :from_remote_service, ->() { where.not(remote_digest: nil) } + scope :currently_changing, ->() { joins(:asset_groups, :steps).where(:steps => {:state => 'running'}) } @@ -213,7 +215,7 @@ def info_line def class_name purposes_facts = facts.with_predicate('purpose') - if purposes_facts.count > 0 + if purposes_facts.length > 0 return purposes_facts.first.object end return '' @@ -221,7 +223,7 @@ def class_name def aliquot purposes_facts = facts.with_predicate('aliquotType') - if purposes_facts.count > 0 + if purposes_facts.length > 0 return purposes_facts.first.object end return '' diff --git a/app/models/asset_group.rb b/app/models/asset_group.rb index 5d7693b3..9fb45aaa 100644 --- a/app/models/asset_group.rb +++ b/app/models/asset_group.rb @@ -18,10 +18,6 @@ class AssetGroup < ActiveRecord::Base after_touch :touch_activity - def refresh! - assets.each(&:refresh!) - end - def update_with_assets(assets_to_update) removed_assets = self.assets - assets_to_update added_assets = assets_to_update - self.assets @@ -31,7 +27,7 @@ def update_with_assets(assets_to_update) updates.add_assets([[self, added_assets]]) if added_assets updates.remove_assets([[self, removed_assets]]) if removed_assets - refresh! + updates.merge(Importers::BarcodesImporter.new(added_assets.map(&:uuid)).process) ActiveRecord::Base.transaction do step = Step.create(activity: activity_owner, asset_group: self, diff --git a/app/models/assets/export.rb b/app/models/assets/export.rb index a69df557..c50e3764 100644 --- a/app/models/assets/export.rb +++ b/app/models/assets/export.rb @@ -21,7 +21,8 @@ def _update_sequencescape(print_config, user, step) end old_barcode = barcode - update_attributes(:uuid => instance.uuid, :barcode => code39_barcode(instance)) + update_attributes(:uuid => instance.uuid, :barcode => code39_barcode(instance), + remote_digest: 'initial_digest') update_plate(instance, updates) diff --git a/app/models/assets/import.rb b/app/models/assets/import.rb index a87017b9..12d2e402 100644 --- a/app/models/assets/import.rb +++ b/app/models/assets/import.rb @@ -9,51 +9,12 @@ class RefreshSourceNotFoundAnymore < StandardError ; end module InstanceMethods - def json_for_remote(remote_asset) - distinct = remote_asset.attributes.to_json - - # It would be useful to have a hashcode in the sequencescape client api to know - # if this message is different from a previous one without needing to traverse - # all the object finding the change - # Having a :to_json method that returns a json would be pretty sensible too - - # FOR A PLATE - if remote_asset.respond_to?(:wells) && remote_asset.wells - # wells.to_a because wells relation does not act as an array - listw = remote_asset.wells.to_a - if listw - # aliquots.to_a, same reason - listal = listw.compact.map(&:aliquots).map(&:to_a) - if listal - listsa = listal.flatten.compact.map{|al| al.sample } - if listsa - distinct+=listsa.compact.map(&:attributes).to_json - end - end - end - end - - # FOR A TUBE - if remote_asset.respond_to?(:aliquots) && remote_asset.aliquots - # aliquots.to_a, same reason - listal = remote_asset.aliquots.to_a - if listal - listsa = listal.flatten.compact.map{|al| al.sample } - if listsa - distinct+=listsa.compact.map(&:attributes).to_json - end - end - end - - distinct + def refresh + Importers::BarcodesImporter.new([self.uuid]).process! if is_remote_asset? end - def update_digest_with_remote(remote_asset) - update_attributes(remote_digest: Digest::MD5::hexdigest(json_for_remote(remote_asset))) - end - - def changed_remote?(remote_asset) - Digest::MD5::hexdigest(json_for_remote(remote_asset)) != remote_digest + def refresh! + Importers::BarcodesImporter.new([self.uuid]).process! end def assets_to_refresh @@ -63,316 +24,45 @@ def assets_to_refresh end].flatten end - def get_import_step - @import_step - end - - def _process_refresh(remote_asset, fact_changes=nil) - fact_changes ||= FactChanges.new - asset_group = AssetGroup.new - @import_step.update_attributes(asset_group: asset_group) - - begin - fact_changes.tap do |updates| - asset_group.update_attributes(assets: assets_to_refresh) - - # Removes previous state - assets_to_refresh.each do |asset| - updates.remove(asset.facts.from_remote_asset) - end - - # Loads new state - self.class.update_asset_from_remote_asset(self, remote_asset, updates) - end.apply(@import_step) - @import_step.update_attributes(state: 'complete') - asset_group.touch - ensure - @import_step.update_attributes(state: 'error') unless @import_step.state == 'complete' - #@import_step.asset_group.touch if @import_step.asset_group - end - end - - def is_refreshing_right_now? - Step.running_with_asset(self).count > 0 - end - - def type_of_asset_for_sequencescape - if ((facts.with_predicate('a').first) && ["Tube", "SampleTube"].include?(facts.with_predicate('a').first.object)) - :tube - else - :plate - end - end - - def refresh(fact_changes=nil) - if is_remote_asset? - remote_asset = SequencescapeClient::find_by_uuid(uuid) - raise RefreshSourceNotFoundAnymore unless remote_asset - if changed_remote?(remote_asset) - unless is_refreshing_right_now? - @import_step = Step.create(step_type: StepType.find_or_create_by(name: 'Refresh'), state: 'running') - _process_refresh(remote_asset, fact_changes) - end - end - end - self - end - - def refresh!(fact_changes=nil) - if is_remote_asset? - @import_step = Step.create(step_type: StepType.find_or_create_by(name: 'Refresh!!'), state: 'running') - remote_asset = SequencescapeClient::find_by_uuid(uuid) - raise RefreshSourceNotFoundAnymore unless remote_asset - _process_refresh(remote_asset, fact_changes) - end - self + def is_remote_asset? + !remote_digest.nil? end - def is_remote_asset? - facts.from_remote_asset.count > 0 + def changed_remote? + Importers::BarcodesImporter.new([self.uuid]).changed_remote?(self) end - def update_facts_from_remote(list, step=nil) - step = step || @import_step - list = [list].flatten - added = list.map do |f| - f.assign_attributes(:is_remote? => true) - f - end - facts << added - add_operations([added].flatten, step) + def digest_for_remote(remote) + Importers::BarcodesImporter.new([self.uuid]).digest_for_remote_asset(remote) end end module ClassMethods - def import_barcode(barcode) - asset = nil - - @import_step = Step.create(step_type: StepType.find_or_create_by(name: 'Import'), state: 'running') - remote_asset = SequencescapeClient::get_remote_asset(barcode) - - if remote_asset - asset = Asset.create(barcode: barcode, uuid: remote_asset.uuid) - FactChanges.new.tap do |updates| - updates.replace_remote(asset, 'a', sequencescape_type_for_asset(remote_asset)) - updates.replace_remote(asset, 'remoteAsset', remote_asset.uuid) - end.apply(@import_step) - asset.refresh - asset.update_compatible_activity_type - end - asset + def find_or_import_assets_with_barcodes(barcodes) + importer = Importers::BarcodesImporter.new(barcodes) + importer.process! + importer.assets_for_barcodes end - def create_local_asset(barcode, updates) - asset=nil - ActiveRecord::Base.transaction do - asset = Asset.create!(:barcode => barcode) - updates.add(asset, 'a', 'Tube') - updates.add(asset, 'barcodeType', 'Code2D') - updates.add(asset, 'is', 'Empty') + def changes_for_refresh_or_import_assets_with_barcodes(barcodes) + FactChanges.new.tap do |updates| + updates.merge(changes_for_refresh_from_barcodes(barcodes)) + updates.merge(changes_for_import_new_barcodes(barcodes)) end - asset end - def is_digit_barcode?(barcode) - barcode.to_s.match(/^\d+$/) - end - - def find_asset_with_barcode(barcode) - asset = Asset.find_by_barcode(barcode) - asset = Asset.find_by_uuid(barcode) unless asset - updates = FactChanges.new - if asset.nil? && TokenUtil.is_valid_fluidx_barcode?(barcode) - asset = import_barcode(barcode) - asset = Asset.create_local_asset(barcode, updates) unless asset - end - if asset - asset.refresh(updates) - end - asset + def create_refresh_step + Step.create(step_type: StepType.find_or_create_by(name: 'Refresh'), state: 'running') end def find_or_import_asset_with_barcode(barcode) - find_asset_with_barcode(barcode) || import_barcode(barcode) - end - - - def update_asset_from_remote_asset(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - class_name = sequencescape_type_for_asset(remote_asset) - updates.replace_remote(asset, 'a', class_name) - - if keep_sync_with_sequencescape?(remote_asset) - updates.replace_remote(asset, 'pushTo', 'Sequencescape') - if remote_asset.try(:plate_purpose) - updates.replace_remote(asset, 'purpose', remote_asset.plate_purpose.name) - end - end - updates.replace_remote(asset, 'is', 'NotStarted') - - annotate_container(asset, remote_asset, updates) - annotate_wells(asset, remote_asset, updates) - annotate_study_name(asset, remote_asset, updates) - - asset.update_digest_with_remote(remote_asset) - end - end - - - def _update_asset_from_remote_asset(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - class_name = sequencescape_type_for_asset(remote_asset) - updates.replace_remote(asset, 'a', class_name) - - if keep_sync_with_sequencescape?(remote_asset) - updates.replace_remote(asset, 'pushTo', 'Sequencescape') - if remote_asset.try(:plate_purpose, nil) - updates.replace_remote(asset, 'purpose', remote_asset.plate_purpose.name) - end - end - updates.replace_remote(asset, 'is', 'NotStarted') - - annotate_container(asset, remote_asset, updates) - annotate_wells(asset, remote_asset, updates) - annotate_study_name(asset, remote_asset, updates) - - asset.update_digest_with_remote(remote_asset) - end - end - - def annotate_container(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - if remote_asset.try(:aliquots) - remote_asset.aliquots.each do |aliquot| - updates.replace_remote(asset, 'sample_tube', asset) - updates.replace_remote(asset, 'sanger_sample_id', TokenUtil.quote_if_uuid(aliquot&.sample&.sanger_sample_id)) - updates.replace_remote(asset, 'sample_uuid', TokenUtil.quote(aliquot&.sample&.uuid), literal: true) - updates.replace_remote(asset, 'sanger_sample_name', TokenUtil.quote_if_uuid(aliquot&.sample&.name)) - updates.replace_remote(asset, 'supplier_sample_name', TokenUtil.quote_if_uuid(aliquot&.sample&.sample_metadata&.supplier_name)) - updates.replace_remote(asset, 'sample_common_name', TokenUtil.quote_if_uuid(aliquot&.sample&.sample_metadata&.sample_common_name)) - end - end - end - end - - def _annotate_container(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - if remote_asset.try(:aliquots, nil) - remote_asset.aliquots.each do |aliquot| - updates.replace_remote(asset, 'sample_tube', asset) - updates.replace_remote(asset, 'sanger_sample_id', aliquot&.sample&.sanger&.sample_id) - updates.replace_remote(asset, 'sample_uuid', TokenUtil.quote(aliquot&.sample&.sanger&.sample_uuid), literal: true) - updates.replace_remote(asset, 'sanger_sample_name', aliquot&.sample&.sanger&.name) - - updates.replace_remote(asset, 'supplier_sample_name', aliquot&.sample&.supplier&.sample_name) - end - end - end - end - - def sample_id_to_study_name(sample_id) - sample_id.gsub(/\d*$/,'').gsub('-', '') - end - - def get_study_uuid(study_name) - @study_uuids ||= {} - @study_uuids[study_name] ||= SequencescapeClient::get_study_by_name(study_name)&.uuid - end - - def annotate_study_name_from_aliquots(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - if remote_asset.try(:aliquots) - if ((remote_asset.aliquots.count == 1) && (remote_asset.aliquots.first.sample)) - updates.replace_remote(asset, 'study_name', remote_asset.aliquots.first.study.name) - updates.replace_remote(asset, 'study_uuid', TokenUtil.quote(remote_asset.aliquots.first.study.uuid), literal: true) - end - end - end - end - - def _annotate_study_name_from_aliquots(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - if remote_asset.try(:aliquots, nil) - if ((remote_asset.aliquots.count == 1) && (remote_asset.aliquots.first.sample)) - study_name = sample_id_to_study_name(remote_asset.aliquots.first.sample.sanger.sample_id) - #study_uuid = get_study_uuid(study_name) - updates.replace_remote(asset, 'study_name', study_name) - end - end - end - end - - - def annotate_study_name(asset, remote_asset, fact_changes) - if remote_asset.try(:wells) - remote_asset.wells.detect do |w| - annotate_study_name_from_aliquots(asset, w, fact_changes) - end - else - annotate_study_name_from_aliquots(asset, remote_asset, fact_changes) - end - end - - def annotate_wells(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - if remote_asset.try(:wells) - remote_asset.wells.each do |well| - local_well = Asset.find_or_create_by!(:uuid => well.uuid) - - updates.replace_remote(asset, 'contains', local_well) - - # Updated wells will also mean that the plate is out of date, so we'll set it in the asset - updates.replace_remote(local_well, 'a', 'Well') - updates.replace_remote(local_well, 'location', well.position['name']) - updates.replace_remote(local_well, 'parent', asset) - - if (well.try(:aliquots)&.first&.sample&.sample_metadata&.supplier_name) - annotate_container(local_well, well, fact_changes) - end - end - end - end - end - - def _annotate_wells(asset, remote_asset, fact_changes) - fact_changes.tap do |updates| - if remote_asset.try(:wells, nil) - remote_asset.wells.each do |well| - local_well = Asset.find_or_create_by!(:uuid => well.uuid) - if (well.try(:aliquots, nil)&.first&.sample&.supplier&.sample_name) - updates.replace_remote(asset, 'contains', local_well) - - # Updated wells will also mean that the plate is out of date, so we'll set it in the asset - updates.replace_remote(local_well, 'a', 'Well') - updates.replace_remote(local_well, 'location', well.location) - updates.replace_remote(local_well, 'parent', asset) - - annotate_container(local_well, well, fact_changes) - end - end - end - end - end - - - def sequencescape_type_for_asset(remote_asset) - return nil unless remote_asset.type - type = remote_asset.type.singularize.classify - return 'SampleTube' if type == 'Tube' - return type - end - - def _sequencescape_type_for_asset(remote_asset) - type = remote_asset.class.to_s.gsub(/Sequencescape::/,'') - return 'SampleTube' if type == 'Tube' - return type + find_or_import_assets_with_barcodes([barcode]).first end - def keep_sync_with_sequencescape?(remote_asset) - class_name = sequencescape_type_for_asset(remote_asset) - (class_name != 'SampleTube') + def _find_assets_with_barcodes(barcodes) + Asset.where(barcode: barcodes).or(Asset.where(uuid: barcodes)) end end diff --git a/app/models/uploaded_file.rb b/app/models/uploaded_file.rb index eadadd19..384e98bd 100644 --- a/app/models/uploaded_file.rb +++ b/app/models/uploaded_file.rb @@ -5,7 +5,7 @@ class UploadedFile < ApplicationRecord belongs_to :asset def step - @step ||= Step.new(step_type: StepType.find_or_create_by(name: 'Refresh'), state: 'running') + @step ||= Step.new(step_type: StepType.find_or_create_by(name: 'Refresh')) end def file_type(content_type) diff --git a/compile-build b/compile-build old mode 100644 new mode 100755 diff --git a/config/cable.yml b/config/cable.yml index c3f656d0..39c749f3 100644 --- a/config/cable.yml +++ b/config/cable.yml @@ -2,3 +2,6 @@ development: adapter: redis url: <%= Rails.configuration.redis_url %> channel_prefix: samples_extraction_development + +test: + adapter: async diff --git a/config/environments/development.rb b/config/environments/development.rb index 0a87ca31..a8105150 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -41,6 +41,8 @@ # Raises helpful error messages. config.assets.raise_runtime_errors = true + config.delayed_job_max_minutes_run_time = ENV.fetch('SE_JOBS_MAX_MINUTES','20') + # Raises error for missing translations # config.action_view.raise_on_missing_translations = true diff --git a/config/environments/production.rb b/config/environments/production.rb index 30b6f535..170c8166 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -48,6 +48,8 @@ config.time_zone = 'London' config.eager_load = true + config.delayed_job_max_minutes_run_time = ENV.fetch('SE_JOBS_MAX_MINUTES','20') + # Raises error for missing translations # config.action_view.raise_on_missing_translations = true diff --git a/config/environments/test.rb b/config/environments/test.rb index 3c396126..5bf58bca 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -42,6 +42,7 @@ config.middleware.use RackSessionAccess::Middleware + config.delayed_job_max_minutes_run_time = ENV.fetch('SE_JOBS_MAX_MINUTES','20') # Raises error for missing translations # config.action_view.raise_on_missing_translations = true diff --git a/config/initializers/delayed_job_config.rb b/config/initializers/delayed_job_config.rb index d6ad9697..e4b6f585 100644 --- a/config/initializers/delayed_job_config.rb +++ b/config/initializers/delayed_job_config.rb @@ -1,7 +1,7 @@ Delayed::Worker.destroy_failed_jobs = false Delayed::Worker.sleep_delay = 0 Delayed::Worker.max_attempts = Float::INFINITY -Delayed::Worker.max_run_time = 5.minutes +Delayed::Worker.max_run_time = 20.minutes Delayed::Worker.read_ahead = 10 Delayed::Worker.default_queue_name = 'default' Delayed::Worker.delay_jobs = !Rails.env.test? diff --git a/config/initializers/jsonapi.rb b/config/initializers/jsonapi.rb index 85e6a8f5..e3a59253 100644 --- a/config/initializers/jsonapi.rb +++ b/config/initializers/jsonapi.rb @@ -3,9 +3,6 @@ config.json_key_format = :underscored_key config.resource_key_type = :uuid - # optional request features - config.allow_include = true - config.default_page_size = 25 config.maximum_page_size = 1000 end diff --git a/config/initializers/websockets_message_processors.rb b/config/initializers/websockets_message_processors.rb new file mode 100644 index 00000000..0a29773f --- /dev/null +++ b/config/initializers/websockets_message_processors.rb @@ -0,0 +1,4 @@ +require 'message_processors/asset_group_message_processor' +require 'message_processors/activity_message_processor' +ActivityChannel.register_message_processor(MessageProcessors::AssetGroupMessageProcessor) +ActivityChannel.register_message_processor(MessageProcessors::ActivityMessageProcessor) diff --git a/db/schema.rb b/db/schema.rb index ce70f7ad..5256aa0e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,7 +12,7 @@ ActiveRecord::Schema.define(version: 20191127154249) do - create_table "actions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "actions", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "action_type", null: false t.integer "step_type_id" t.integer "subject_condition_group_id" @@ -26,7 +26,7 @@ t.index ["subject_condition_group_id"], name: "index_actions_on_subject_condition_group_id" end - create_table "activities", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "activities", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "activity_type_id" t.integer "instrument_id" t.integer "asset_group_id" @@ -43,7 +43,7 @@ t.index ["kit_id"], name: "index_activities_on_kit_id" end - create_table "activity_type_compatibilities", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "activity_type_compatibilities", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "asset_id" t.integer "activity_type_id" t.datetime "created_at", null: false @@ -52,7 +52,7 @@ t.index ["asset_id"], name: "index_activity_type_compatibilities_on_asset_id" end - create_table "activity_type_step_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "activity_type_step_types", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "activity_type_id" t.integer "step_type_id" t.datetime "created_at", null: false @@ -61,7 +61,7 @@ t.index ["step_type_id"], name: "index_activity_type_step_types_on_step_type_id" end - create_table "activity_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "activity_types", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "name" t.integer "superceded_by_id" t.datetime "created_at", null: false @@ -69,7 +69,7 @@ t.index ["superceded_by_id"], name: "index_activity_types_on_superceded_by_id" end - create_table "activity_types_instruments", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "activity_types_instruments", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "instrument_id" t.integer "activity_type_id" t.datetime "created_at", null: false @@ -78,7 +78,7 @@ t.index ["instrument_id"], name: "index_activity_types_instruments_on_instrument_id" end - create_table "asset_groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "asset_groups", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "activity_owner_id" @@ -87,7 +87,7 @@ t.string "uuid" end - create_table "asset_groups_assets", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "asset_groups_assets", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "asset_id" t.integer "asset_group_id" t.datetime "created_at", null: false @@ -96,7 +96,7 @@ t.index ["asset_id"], name: "index_asset_groups_assets_on_asset_id" end - create_table "assets", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "assets", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "uuid" t.string "barcode" t.datetime "created_at", null: false @@ -106,7 +106,7 @@ t.index ["barcode"], name: "index_assets_on_barcode" end - create_table "condition_groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "condition_groups", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "name" t.boolean "keep_selected", default: true t.integer "step_type_id" @@ -114,7 +114,7 @@ t.index ["step_type_id"], name: "index_condition_groups_on_step_type_id" end - create_table "conditions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "conditions", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "condition_group_id" t.string "predicate", null: false t.string "object" @@ -125,7 +125,7 @@ t.index ["object_condition_group_id"], name: "index_conditions_on_object_condition_group_id" end - create_table "delayed_jobs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "delayed_jobs", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "priority", default: 0, null: false t.integer "attempts", default: 0, null: false t.text "handler", limit: 4294967295, null: false @@ -140,7 +140,7 @@ t.index ["priority", "run_at"], name: "delayed_jobs_priority" end - create_table "facts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "facts", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "asset_id" t.string "predicate", null: false t.string "object" @@ -158,14 +158,14 @@ t.index ["object_asset_id"], name: "index_facts_on_object_asset_id" end - create_table "instruments", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "instruments", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "barcode" t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "kit_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "kit_types", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "name" t.integer "activity_type_id" t.datetime "created_at", null: false @@ -174,7 +174,7 @@ t.index ["activity_type_id"], name: "index_kit_types_on_activity_type_id" end - create_table "kits", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "kits", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "barcode", null: false t.integer "max_num_reactions" t.integer "num_reactions_performed" @@ -184,7 +184,7 @@ t.index ["kit_type_id"], name: "index_kits_on_kit_type_id" end - create_table "label_templates", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "label_templates", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "name", null: false t.string "template_type" t.integer "external_id", null: false @@ -192,7 +192,7 @@ t.datetime "updated_at", null: false end - create_table "operations", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "operations", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "action_id" t.integer "step_id" t.integer "asset_id" @@ -208,7 +208,7 @@ t.index ["step_id"], name: "index_operations_on_step_id" end - create_table "printers", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "printers", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "name", null: false t.string "printer_type" t.boolean "default_printer", default: false, null: false @@ -216,7 +216,7 @@ t.datetime "updated_at", null: false end - create_table "sessions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "sessions", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "session_id", null: false t.text "data" t.datetime "created_at" @@ -225,7 +225,7 @@ t.index ["updated_at"], name: "index_sessions_on_updated_at" end - create_table "step_messages", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + create_table "step_messages", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "step_id", null: false t.text "content", limit: 4294967295 t.datetime "created_at", null: false @@ -233,7 +233,7 @@ t.index ["step_id"], name: "index_step_messages_on_step_id" end - create_table "step_types", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "step_types", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "name" t.string "step_template" t.binary "n3_definition" @@ -247,7 +247,7 @@ t.index ["superceded_by_id"], name: "index_step_types_on_superceded_by_id" end - create_table "steps", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "steps", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "step_type_id" t.integer "user_id" t.date "completion_date" @@ -274,7 +274,7 @@ t.index ["user_id"], name: "index_steps_on_user_id" end - create_table "uploaded_files", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| + create_table "uploaded_files", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "asset_id" t.binary "data", limit: 16777215 t.string "filename" @@ -284,7 +284,7 @@ t.index ["asset_id"], name: "index_uploaded_files_on_asset_id" end - create_table "uploads", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "uploads", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "step_id" t.integer "activity_id" t.binary "data", limit: 16777215 @@ -296,7 +296,7 @@ t.index ["step_id"], name: "index_uploads_on_step_id" end - create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "users", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.string "login" t.string "password" t.string "barcode" @@ -312,7 +312,7 @@ t.index ["tube_printer_id"], name: "index_users_on_tube_printer_id" end - create_table "work_orders", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "work_orders", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.integer "work_order_id" t.integer "activity_id" t.datetime "created_at", null: false diff --git a/lib/actions/layout/invalid_data_params.rb b/lib/actions/layout/invalid_data_params.rb new file mode 100644 index 00000000..8b014813 --- /dev/null +++ b/lib/actions/layout/invalid_data_params.rb @@ -0,0 +1,21 @@ +module Actions + module Layout + class InvalidDataParams < StandardError + attr_accessor :errors + + def initialize(message = nil) + super(message) + @errors = message + #@msg = html_error_message([message].flatten) + end + + def html_error_message(error_messages) + [''].flatten.join('') + end + + end + + end +end diff --git a/lib/actions/layout/racking.rb b/lib/actions/layout/racking.rb new file mode 100644 index 00000000..08e0ef46 --- /dev/null +++ b/lib/actions/layout/racking.rb @@ -0,0 +1,53 @@ +require 'parsers/csv_layout/csv_parser' +require 'parsers/csv_layout/barcode_creatable_parser' +require 'parsers/csv_layout/validators/any_barcode_validator' +require 'fact_changes' + +module Actions + module Layout + module Racking + def reracking_tubes(rack, list_layout) + FactChanges.new.tap do |updates| + tubes = list_layout.map{|o| o[:asset]}.compact + return updates unless tubes.length > 0 + updates.merge(changes_for_tubes_on_unrack(tubes)) + updates.merge(changes_for_racks_on_unrack(tubes)) + updates.merge(changes_for_rack_tubes(list_layout, rack)) + end + end + + def changes_for_rack_when_racking_tubes(rack, racked_tubes) + FactChanges.new.tap do |updates| + Actions::LayoutProcessor::TUBE_TO_RACK_TRANSFERRABLE_PROPERTIES.map do |prop| + racked_tubes.map{|tube| tube.facts.with_predicate(prop)} + end.flatten.compact.each do |fact| + updates.add(rack, fact.predicate.to_s, fact.object_value) + end + end + end + + def changes_for_put_tube_into_rack_position(tube, rack, location) + FactChanges.new.tap do |updates| + updates.add(tube, 'location', location) + updates.add(tube, 'parent', rack) + updates.add(rack, 'contains', tube) + end + end + + def changes_for_rack_tubes(list_layout, rack) + FactChanges.new.tap do |updates| + tubes = [] + list_layout.each do |l| + location = l[:location] + tube = l[:asset] + next unless tube + tubes.push(tube) + updates.merge(changes_for_put_tube_into_rack_position(tube, rack, location)) + end + updates.merge(changes_for_rack_when_racking_tubes(rack, tubes)) + end + end + end + end +end + diff --git a/lib/actions/layout/unracking.rb b/lib/actions/layout/unracking.rb new file mode 100644 index 00000000..0257318d --- /dev/null +++ b/lib/actions/layout/unracking.rb @@ -0,0 +1,68 @@ +module Actions + module Layout + module Unracking + + def racks_for_tubes(tubes) + rack_ids = Fact.where(predicate: 'contains', object_asset_id: tubes.map(&:id)).pluck(:asset_id) + Asset.where(id: rack_ids) + end + + + def changes_for_tubes_on_unrack(tubes) + FactChanges.new.tap do |updates| + return unless tubes.length > 0 + contains_facts = Fact.where(predicate: 'contains', object_asset_id: tubes.map(&:id)) + parents_facts = Fact.where(asset_id: tubes.map(&:id), predicate: 'parent') + locations_facts = Fact.where(asset_id: tubes.map(&:id), predicate: 'location') + updates.remove(contains_facts) + updates.remove(parents_facts) + updates.remove(locations_facts) + updates.merge(_metadata_changes_for_tubes_on_unrack(tubes, parents_facts, locations_facts)) + end + end + + def changes_for_racks_on_unrack(tubes) + FactChanges.new.tap do |updates| + racks_for_tubes(tubes).each do |rack| + updates.merge(changes_for_rack_on_unrack(rack, tubes)) + end + end + end + + def _metadata_changes_for_tubes_on_unrack(tubes, parents_facts, locations_facts) + FactChanges.new.tap do |updates| + tubes.each do |tube| + parent_fact = parents_facts.detect{|f| f.asset_id == tube.id} + location_fact = locations_facts.detect{|f| f.asset_id == tube.id} + next unless parent_fact || location_fact + rerack = Asset.new + updates.create_assets([rerack]) + updates.add(rerack, 'a', 'Rerack') + updates.add(rerack, 'barcodeType', 'NoBarcode') + updates.add(rerack, 'previousParent', parent_fact.object_asset) + updates.add(rerack, 'previousLocation', location_fact.object) + updates.add(tube, 'rerack', rerack) + end + end + end + + # For a plate modified (any plate that is losing a tube), it will resync the values of inherited + # properties from the plates with the current list of tubes it contains + def changes_for_rack_on_unrack(rack, tubes) + FactChanges.new.tap do |updates| + tubes_from_previous_rack = rack.facts.with_predicate('contains').map(&:object_asset) + actual_tubes = (tubes_from_previous_rack - tubes) + + Actions::LayoutProcessor::TUBE_TO_RACK_TRANSFERRABLE_PROPERTIES.each do |transferrable_property| + tubes.map{|tube| tube.facts.with_predicate(transferrable_property).map(&:object)}.flatten.compact.each do |value| + updates.remove_where(rack, transferrable_property.to_s, value) + end + actual_tubes.map{|tube| tube.facts.with_predicate(transferrable_property).map(&:object).flatten.compact}.each do |value| + updates.add(rack, transferrable_property.to_s, value) + end + end + end + end + end + end +end diff --git a/lib/actions/layout_processor.rb b/lib/actions/layout_processor.rb new file mode 100644 index 00000000..0b04a87a --- /dev/null +++ b/lib/actions/layout_processor.rb @@ -0,0 +1,152 @@ +require 'parsers/csv_layout/csv_parser' +require 'parsers/csv_layout/barcode_creatable_parser' +require 'parsers/csv_layout/validators/any_barcode_validator' +require 'fact_changes' +require 'actions/layout/invalid_data_params' +require 'actions/layout/racking' +require 'actions/layout/unracking' + +module Actions + class LayoutProcessor + TUBE_TO_RACK_TRANSFERRABLE_PROPERTIES = [:study_name,:aliquotType] + + include Actions::Layout::Racking + include Actions::Layout::Unracking + + attr_reader :parser, :content, :asset_group + + # Actions + def initialize(params) + if params[:asset_group] + @asset_group = params[:asset_group] + @content = selected_file(asset_group).data + @parser = Parsers::CsvLayout::CsvParser.new(content, params) + end + end + + def reracking_tubes(rack, list_layout) + FactChanges.new.tap do |updates| + tubes = list_layout.map{|o| o[:asset]}.compact + return updates unless tubes.length > 0 + updates.merge(changes_for_tubes_on_unrack(tubes)) + updates.merge(changes_for_racks_on_unrack(tubes)) + updates.merge(changes_for_rack_tubes(list_layout, rack)) + end + end + + def changes + csv_parsing(asset_group, parser) + end + + def csv_parsing(asset_group, parser) + error_messages = [] + error_locations = [] + + if asset_group.assets.with_fact('a', 'TubeRack').empty? + error_messages.push("No TubeRacks found to perform the layout process") + end + if asset_group.assets.with_fact('a', 'TubeRack').count > 1 + error_messages.push("Too many TubeRacks found to perform the layout process") + end + raise Actions::Layout::InvalidDataParams.new(error_messages) if error_messages.count > 0 + + asset = asset_group.assets.with_fact('a', 'TubeRack').first + + if parser.valid? + rack = asset + list_layout = parser.layout + check_collisions(rack, list_layout, error_messages, error_locations) + + check_racking_barcodes(list_layout, error_messages, error_locations) + check_tuberacks(asset_group, list_layout, error_messages, error_locations) + end + + unless error_messages.empty? + raise Actions::Layout::InvalidDataParams.new(error_messages) + end + if parser.valid? + updates = parser.parsed_changes.merge(reracking_tubes(asset, parser.layout)) + + error_messages.push(asset.validate_rack_content) + raise Actions::Layout::InvalidDataParams.new(error_messages) if error_messages.flatten.compact.count > 0 + return updates + else + raise Actions::Layout::InvalidDataParams.new(parser.error_list) + end + end + + def get_duplicates(list) + list.reduce({}) do |memo, element| + memo[element] = 0 unless memo[element] + memo[element]+=1 + memo + end.each_pair.select{|key, count| count > 1} + end + + def check_duplicates(params, error_messages, error_locations) + duplicated_locations = get_duplicates(params.map{|location, barcode| location}) + duplicated_assets = get_duplicates(params.map{|location, barcode| barcode}) + + duplicated_locations.each do |location, count| + error_locations.push(location) + error_messages.push("Location #{location} is appearing #{count} times") + end + + duplicated_assets.each do |barcode, count| + #error_locations.push(barcode) + error_messages.push("Asset #{barcode} is appearing #{count} times") + end + end + + def check_racking_barcodes(list_layout, error_messages, error_locations) + list_layout.each do |obj| + location = obj[:location] + asset = obj[:asset] + barcode = obj[:barcode] + if (asset.nil? && !barcode.nil? && !barcode.starts_with?('F')) + error_locations.push(location) + error_messages.push("Barcode #{barcode} scanned at #{location} is not in the database") + end + end + end + + def check_tuberacks(asset_group, list_layout, error_messages, error_locations) + if asset_group.assets.with_fact('a', 'TubeRack').empty? + error_messages.push("No TubeRacks found to perform the racking process") + end + end + + def check_collisions(rack, list_layout, error_messages, error_locations) + tubes_for_rack = rack.facts.with_predicate('contains').map(&:object_asset) + tubes_for_rack.each do |tube| + tube_location = tube.facts.with_predicate('location').first.object + list_layout.each do |obj| + next unless obj[:asset] + if (tube_location == obj[:location]) + if (obj[:asset] != tube) + error_messages.push( + "Tube #{obj[:asset].barcode} cannot be put at location #{obj[:location]} because the tube #{tube.barcode || tube.uuid} is there" + ) + end + end + end + unless (list_layout.map{|obj| obj[:asset]}.include?(tube)) + # Remember that the tubes needs to be always in a rack. They cannot be interchanged + # in between racks + error_messages.push( + "Missing tube!! Any tube already existing in the rack can't disappear from its defined layout without being reracked before. Tube #{tube.barcode || tube.uuid} should be present in the rack at location #{tube_location} but is missed from the rack." + ) + end + end + + end + + def selected_file(asset_group) + asset_group.uploaded_files.first + end + + def clean_rack(rack) + remove_facts(facts.with_predicate('contains')) + end + end +end diff --git a/lib/actions/plate_transfer.rb b/lib/actions/plate_transfer.rb index e76eb45e..f8bb2a5a 100644 --- a/lib/actions/plate_transfer.rb +++ b/lib/actions/plate_transfer.rb @@ -98,6 +98,11 @@ def self.transfer_with_asset_creation(plate, destination, updates=nil) # destimation: Asset or String representing a uuid or a wildcard def self.transfer_plates(plate, destination, updates=nil) updates ||= FactChanges.new + if (plate.has_predicate?('study_name')) + plate.facts.with_predicate('study_name').each do |fact| + updates.add(destination, 'study_name', fact.object) + end + end updates.tap do |updates| if destination.kind_of?(Asset) && (destination.has_wells?) transfer_by_location(plate, destination, updates) diff --git a/lib/actions/racking.rb b/lib/actions/racking.rb deleted file mode 100644 index 7fcba2e9..00000000 --- a/lib/actions/racking.rb +++ /dev/null @@ -1,332 +0,0 @@ -require 'parsers/csv_layout/csv_parser' -require 'parsers/csv_layout/barcode_creatable_parser' -require 'parsers/csv_layout/validators/any_barcode_validator' - -require 'fact_changes' - -class InvalidDataParams < StandardError - attr_accessor :errors - - def initialize(message = nil) - super(message) - @errors = message - #@msg = html_error_message([message].flatten) - end - - def html_error_message(error_messages) - [''].flatten.join('') - end - -end - -module Actions - module Racking - - DNA_STOCK_PLATE_PURPOSE = 'DNA Stock Plate' - RNA_STOCK_PLATE_PURPOSE = 'RNA Stock Plate' - STOCK_PLATE_PURPOSE = 'Stock Plate' - DNA_ALIQUOT = 'DNA' - RNA_ALIQUOT = 'RNA' - TUBE_TO_PLATE_TRANSFERRABLE_PROPERTIES = [:study_name,:aliquotType] - - # Actions - def rack_layout(asset_group) - content = selected_file(asset_group).data - csv_parsing(asset_group, Parsers::CsvLayout::CsvParser.new(content)) - end - - def rack_layout_creating_tubes(asset_group) - content = selected_file(asset_group).data - parser = Parsers::CsvLayout::CsvParser.new(content, { - barcode_parser: Parsers::CsvLayout::BarcodeCreatableParser - }) - csv_parsing(asset_group, parser) - end - - def rack_layout_any_barcode(asset_group) - content = selected_file(asset_group).data - parser = Parsers::CsvLayout::CsvParser.new(content, { - barcode_validator: Parsers::CsvLayout::Validators::AnyBarcodeValidator - }) - csv_parsing(asset_group, parser) - end - - # Support methods and classes - - - def clean_rack(rack) - remove_facts(facts.with_predicate('contains')) - end - - def reracking_tubes(rack, list_layout) - fact_changes_unrack = fact_changes_for_unrack_tubes(list_layout, rack) - fact_changes_rack = fact_changes_for_rack_tubes(list_layout, rack) - fact_changes_unrack.merge(fact_changes_rack) - end - - def fact_changes_for_unrack_tubes(list_layout, destination_rack=nil) - FactChanges.new.tap do |updates| - rerackGroup=nil - - previous_racks = [] - tubes = list_layout.map{|obj| obj[:asset]}.compact - return updates if tubes.empty? - tubes_ids = tubes.map(&:id) - tubes_list = Asset.where(id: tubes_ids).includes(:facts) - tubes_list.each_with_index do |tube, index| - location_facts = tube.facts.with_predicate('location') - unless location_facts.empty? - location = location_facts.first.object - updates.remove(tube.facts.with_predicate('location')) - end - tube.facts.with_predicate('parent').each do |parent_fact| - previous_rack = parent_fact.object_asset - unless (previous_racks.include?(previous_rack)) - previous_racks.push(previous_rack) - updates.remove(previous_rack.facts.with_predicate('contains').where(object_asset_id: tubes_ids)) - end - - if destination_rack - unless rerackGroup - rerackGroup = Asset.new - updates.create_assets([rerackGroup]) - updates.add(rerackGroup, 'barcodeType', 'NoBarcode') - updates.add(destination_rack, 'rerackGroup', rerackGroup) - end - - rerack = Asset.new - updates.create_assets([rerack]) - updates.add(rerack, 'a', 'Rerack') - updates.add(rerack, 'tube', tube) - updates.add(rerack, 'barcodeType', 'NoBarcode') - updates.add(rerack, 'previousParent', previous_rack) - updates.add(rerack, 'previousLocation', location) - updates.add(rerack, 'location', list_layout[index][:location]) - updates.add(rerackGroup, 'rerack', rerack) - - previous_racks.push(previous_rack) - end - - updates.remove(parent_fact) - end - end - - # sync rack property - previous_racks.each do |previous_rack| - updates.merge(fact_changes_for_rack_when_unracking_tubes(previous_rack, tubes)) - end - end - end - - def purpose_for_aliquot(aliquot) - if aliquot == DNA_ALIQUOT - DNA_STOCK_PLATE_PURPOSE - elsif aliquot == RNA_ALIQUOT - RNA_STOCK_PLATE_PURPOSE - else - STOCK_PLATE_PURPOSE - end - end - - def fact_changes_for_add_purpose(rack, aliquot) - FactChanges.new.tap do |updates| - updates.add(rack, 'purpose', purpose_for_aliquot(aliquot)) - end - end - - def fact_changes_for_remove_purpose(rack, aliquot) - FactChanges.new.tap do |updates| - updates.remove_where(rack, 'purpose', purpose_for_aliquot(aliquot)) - end - end - - # For a plate modified (any plate that is losing a tube), it will resync the values of inherited - # properties from the plates with the current list of tubes it contains - def fact_changes_for_rack_when_unracking_tubes(rack, unracked_tubes) - FactChanges.new.tap do |updates| - tubes_from_previous_rack = rack.facts.with_predicate('contains').map(&:object_asset) - actual_tubes = (tubes_from_previous_rack - unracked_tubes) - - TUBE_TO_PLATE_TRANSFERRABLE_PROPERTIES.each do |transferrable_property| - unracked_tubes.map{|tube| tube.facts.with_predicate(transferrable_property).map(&:object)}.flatten.compact.each do |value| - updates.remove_where(rack, transferrable_property.to_s, value) - updates.merge(fact_changes_for_remove_purpose(rack, value)) if transferrable_property.to_s == 'aliquotType' - end - actual_tubes.map{|tube| tube.facts.with_predicate(transferrable_property).map(&:object).flatten.compact}.each do |value| - updates.add(rack, transferrable_property.to_s, value) - updates.merge(fact_changes_for_add_purpose(rack, value)) if transferrable_property.to_s == 'aliquotType' - end - end - end - end - - def fact_changes_for_rack_when_racking_tubes(rack, racked_tubes) - FactChanges.new.tap do |updates| - TUBE_TO_PLATE_TRANSFERRABLE_PROPERTIES.map do |prop| - racked_tubes.map{|tube| tube.facts.with_predicate(prop)} - end.flatten.compact.each do |fact| - updates.add(rack, fact.predicate.to_s, fact.object_value) - updates.merge(fact_changes_for_add_purpose(rack, fact.object_value)) if fact.predicate.to_s == 'aliquotType' - end - end - end - - def put_tube_into_rack_position(tube, rack, location) - FactChanges.new.tap do |updates| - updates.remove(tube.facts.with_predicate('location')) - updates.add(tube, 'location', location) - updates.add(tube, 'parent', rack) - updates.add(rack, 'contains', tube) - end - end - - def remove_tube_from_rack(tube, rack) - FactChanges.new.tap do |updates| - updates.remove(tube.facts.with_predicate('location')) - updates.remove_where(rack, 'contains', tube) - end - end - - def fact_changes_for_rack_tubes(list_layout, rack) - FactChanges.new.tap do |updates| - tubes = [] - list_layout.each do |l| - location = l[:location] - tube = l[:asset] - next unless tube - tubes.push(tube) - updates.merge(put_tube_into_rack_position(tube, rack, location)) - end - updates.merge(fact_changes_for_rack_when_racking_tubes(rack, tubes)) - end - end - - def params_to_list_layout(params) - params.map do |location, barcode| - asset = Asset.find_or_import_asset_with_barcode(barcode) - { - :location => location, - :asset => asset, - :barcode => barcode - } - end - end - - def get_duplicates(list) - list.reduce({}) do |memo, element| - memo[element] = 0 unless memo[element] - memo[element]+=1 - memo - end.each_pair.select{|key, count| count > 1} - end - - def check_duplicates(params, error_messages, error_locations) - duplicated_locations = get_duplicates(params.map{|location, barcode| location}) - duplicated_assets = get_duplicates(params.map{|location, barcode| barcode}) - - duplicated_locations.each do |location, count| - error_locations.push(location) - error_messages.push("Location #{location} is appearing #{count} times") - end - - duplicated_assets.each do |barcode, count| - #error_locations.push(barcode) - error_messages.push("Asset #{barcode} is appearing #{count} times") - end - end - - def check_racking_barcodes(list_layout, error_messages, error_locations) - list_layout.each do |obj| - location = obj[:location] - asset = obj[:asset] - barcode = obj[:barcode] - if (asset.nil? && !barcode.nil? && !barcode.starts_with?('F')) - error_locations.push(location) - error_messages.push("Barcode #{barcode} scanned at #{location} is not in the database") - end - end - end - - def check_tuberacks(asset_group, list_layout, error_messages, error_locations) - if asset_group.assets.with_fact('a', 'TubeRack').empty? - error_messages.push("No TubeRacks found to perform the racking process") - end - end - - def check_collisions(rack, list_layout, error_messages, error_locations) - tubes_for_rack = rack.facts.with_predicate('contains').map(&:object_asset) - tubes_for_rack.each do |tube| - tube_location = tube.facts.with_predicate('location').first.object - list_layout.each do |obj| - next unless obj[:asset] - if (tube_location == obj[:location]) - if (obj[:asset] != tube) - error_messages.push( - "Tube #{obj[:asset].barcode} cannot be put at location #{obj[:location]} because the tube #{tube.barcode || tube.uuid} is there" - ) - end - end - end - unless (list_layout.map{|obj| obj[:asset]}.include?(tube)) - # Remember that the tubes needs to be always in a rack. They cannot be interchanged - # in between racks - error_messages.push( - "Missing tube!! Any tube already existing in the rack can't disappear from its defined layout without being reracked before. Tube #{tube.barcode || tube.uuid} should be present in the rack at location #{tube_location} but is missed from the rack." - ) - end - end - - end - - def selected_file(asset_group) - asset_group.uploaded_files.first - end - - def csv_parsing(asset_group, parser) - error_messages = [] - error_locations = [] - - if asset_group.assets.with_fact('a', 'TubeRack').empty? - error_messages.push("No TubeRacks found to perform the layout process") - end - if asset_group.assets.with_fact('a', 'TubeRack').count > 1 - error_messages.push("Too many TubeRacks found to perform the layout process") - end - raise InvalidDataParams.new(error_messages) if error_messages.count > 0 - - asset = asset_group.assets.with_fact('a', 'TubeRack').first - - if parser.valid? - rack = asset - list_layout = parser.layout - check_collisions(rack, list_layout, error_messages, error_locations) - - check_racking_barcodes(list_layout, error_messages, error_locations) - check_tuberacks(asset_group, list_layout, error_messages, error_locations) - end - - unless error_messages.empty? - raise InvalidDataParams.new(error_messages) - end - if parser.valid? - updates = parser.parsed_changes.merge(reracking_tubes(asset, parser.layout)) - - error_messages.push(asset.validate_rack_content) - raise InvalidDataParams.new(error_messages) if error_messages.flatten.compact.count > 0 - return updates - else - raise InvalidDataParams.new(parser.error_list) - end - end - - - def samples_symphony(step_type, params) - rack = asset_group.assets.with_fact('a', 'TubeRack').first - msgs = Parsers::Symphony.parse(params[:file].read, rack) - raise InvalidDataParams.new(msgs) if msgs.length > 0 - end - - end -end diff --git a/lib/changes_support/callbacks.rb b/lib/changes_support/callbacks.rb new file mode 100644 index 00000000..0f8c987a --- /dev/null +++ b/lib/changes_support/callbacks.rb @@ -0,0 +1,67 @@ +module ChangesSupport + module Callbacks + + def self.included(klass) + klass.instance_eval do + extend ClassMethods + include InstanceMethods + end + end + + module ClassMethods + + # + # on_change_predicate: + # Attach a callback to run when the predicate has changed, either it has been added, or + # it is removed. + # + # change_type: + # either :addFacts or :removeFacts, depending on the type of change + # predicate: + # predicate value in a fact that we want to watch + # proc: + # callback to run when the change has been applied + def on_change_predicate(change_type, predicate, proc) + @changes_callbacks ||= {} + @changes_callbacks[change_type] ||= {} + @changes_callbacks[change_type][predicate] ||= [] + @changes_callbacks[change_type][predicate].push(proc) + end + + # + # Resets the callbacks so they won't be run anymore + def clear_all_callbacks! + @changes_callbacks = {} + end + + def _changes_callbacks + @changes_callbacks + end + end + + module InstanceMethods + def _changes_callbacks + self.class._changes_callbacks + end + def _on_apply + return unless _changes_callbacks + _changes_callbacks.keys.each do |change_type| + predicates = _changes_callbacks[change_type].keys + facts_with_callback = [] + if change_type == 'add_facts' + facts_with_callback = facts_to_add.select{|f| predicates.include?(f[:predicate])} + elsif change_type == 'remove_facts' + facts_with_callback = facts_to_destroy.select{|f| predicates.include?(f[:predicate])} + end + facts_with_callback.each do |fact| + callbacks = _changes_callbacks[change_type][fact[:predicate]] + callbacks.each do |proc| + proc.call(fact, self) + end + end + end + end + + end + end +end diff --git a/lib/fact_changes.rb b/lib/fact_changes.rb index 83e878e8..65a7fc24 100644 --- a/lib/fact_changes.rb +++ b/lib/fact_changes.rb @@ -1,10 +1,14 @@ require 'token_util' require 'changes_support/disjoint_list' require 'changes_support/transaction_scope' +require 'changes_support/callbacks' require 'google_hash' +require 'fact_changes_initializers' class FactChanges include ChangesSupport::TransactionScope + include ChangesSupport::Callbacks + include FactChangesInitializers attr_accessor :facts_to_destroy, :facts_to_add, :assets_to_create, :assets_to_destroy, :assets_to_add, :assets_to_remove, :wildcards, :instances_from_uuid, @@ -128,7 +132,7 @@ def _build_fact_attributes(s, p, o, options={}) def add(s,p,o, options={}) s = find_asset(s) - o = (options[:literal]==true) ? o : find_asset(o) + o = (options[:literal]==true) ? literal_token(o) : find_asset(o) fact = _build_fact_attributes(s, p, o, options) @@ -136,6 +140,10 @@ def add(s,p,o, options={}) #facts_to_add.push(track_object(params)) unless detected end + def literal_token(str) + TokenUtil.quote_if_uuid(str) + end + def add_facts(listOfLists) listOfLists.each{|list| add(list[0], list[1], list[2])} self @@ -150,11 +158,20 @@ def add_remote(s,p,o, options={}) add(s,p,o, options.merge({is_remote?: true})) if (s && p && o) end + def replace_remote_relation(asset, predicate, object_asset, options={}) + replace_remote(asset,predicate,object_asset, options.merge({literal: false})) + end + + def replace_remote_property(asset, predicate, value, options={}) + replace_remote(asset,predicate,value, options.merge({literal: true})) + end + def replace_remote(asset, p, o, options={}) if (asset && p && o) asset.facts.with_predicate(p).each do |fact| + # The value is updated from the remote instance so we remove the previous value remove(fact) - # In case they are not removed, at least they will be set as remote + # In any case they will be set as Remote, even if they are not removed in this update facts_to_set_to_remote << fact end add_remote(asset, p, o, options) @@ -208,6 +225,7 @@ def merge(fact_changes) def apply(step, with_operations=true) _handle_errors(step) if errors_added.length > 0 ActiveRecord::Base.transaction do |t| + _on_apply if respond_to?(:_on_apply) _set_remote_facts(facts_to_set_to_remote) operations = [ _create_asset_groups(step, asset_groups_to_create, with_operations), @@ -223,6 +241,7 @@ def apply(step, with_operations=true) Operation.import(operations) @operations = operations end + step.save if step.changed? reset end end @@ -350,6 +369,14 @@ def delete_assets(assets) self end + def add_assets_to_group(group, assets) + add_assets([[group, assets]]) + end + + def remove_assets_from_group(group, assets) + remove_assets([[group, assets]]) + end + def add_assets(list) list.each do |elem| if ((elem.length > 0) && elem[1].kind_of?(Array)) @@ -361,8 +388,6 @@ def add_assets(list) end assets = validate_instances(find_assets(asset_ids)) assets_to_add << assets.map{|asset| { asset_group: asset_group, asset: asset} } - #add_to_list_keep_unique(assets.map{|asset| { asset_group: asset_group, asset: asset} }, :assets_to_add, :assets_to_remove) - #assets_to_add.concat(assets.map{|asset| { asset_group: asset_group, asset: asset} }) end self end diff --git a/lib/fact_changes_initializers.rb b/lib/fact_changes_initializers.rb new file mode 100644 index 00000000..25d2fda6 --- /dev/null +++ b/lib/fact_changes_initializers.rb @@ -0,0 +1,67 @@ +# +# Initialization of actions to perform when some properties are added or removed. +# +# TODO: +# This is not in an initializer because these configuration changes need to be available to +# every actual and future runner, but runners do not load Rails initializers by default, +# In order to have this config as an initializer we would need to modify Rails loading. +module FactChangesInitializers + def self.included(klass) + klass.instance_eval do + FactChangesInitializers.setup_changes_callbacks! + end + end + + def self.setup_changes_callbacks! + Callbacks.initialize_barcode_callbacks + Callbacks.initialize_aliquot_type_callbacks + Callbacks.initialize_digest_update_callbacks + end + + module Callbacks + DNA_STOCK_PLATE_PURPOSE = 'DNA Stock Plate' + RNA_STOCK_PLATE_PURPOSE = 'RNA Stock Plate' + STOCK_PLATE_PURPOSE = 'Stock Plate' + DNA_ALIQUOT = 'DNA' + RNA_ALIQUOT = 'RNA' + + def self.purpose_for_aliquot(aliquot) + if aliquot == DNA_ALIQUOT + DNA_STOCK_PLATE_PURPOSE + elsif aliquot == RNA_ALIQUOT + RNA_STOCK_PLATE_PURPOSE + else + STOCK_PLATE_PURPOSE + end + end + + def self.initialize_barcode_callbacks + FactChanges.on_change_predicate('add_facts', 'barcode', Proc.new do |t| + t[:asset].update_attributes(barcode: t[:object]) + end) + + FactChanges.on_change_predicate('remove_facts', 'barcode', Proc.new do |t| + t[:asset].update_attributes(barcode: nil) + end) + end + + def self.initialize_digest_update_callbacks + FactChanges.on_change_predicate('add_facts', 'remote_digest', Proc.new do |t, updates| + t[:asset].update_attributes(remote_digest: t[:object]) + end) + end + + def self.initialize_aliquot_type_callbacks + FactChanges.on_change_predicate('add_facts', 'aliquotType', Proc.new do |t, updates| + if t[:asset].kind_of_plate? + updates.add(t[:asset], 'purpose', purpose_for_aliquot(t[:object])) + end + end) + FactChanges.on_change_predicate('remove_facts', 'aliquotType', Proc.new do |t, updates| + if t[:asset].kind_of_plate? + updates.remove_where(t[:asset], 'purpose', purpose_for_aliquot(t[:object])) + end + end) + end + end +end diff --git a/lib/importers/barcodes_importer.rb b/lib/importers/barcodes_importer.rb new file mode 100644 index 00000000..00555a37 --- /dev/null +++ b/lib/importers/barcodes_importer.rb @@ -0,0 +1,73 @@ +require 'importers/concerns/changes' + +module Importers + class BarcodesImporter + include Importers::Concerns::Changes + + attr_reader :barcodes + + def initialize(barcodes) + @barcodes = barcodes + @updates = nil + @imported_uuids_by_barcode = {} + @annotators_by_uuid={} + end + + def processed? + !@updates.nil? + end + + def changed_remote?(asset) + annotator_for(asset).has_changes_between_local_and_remote? + end + + def annotator_for(asset) + process unless processed? + @annotators_by_uuid[asset.uuid] + end + + def updates + process unless processed? + @updates + end + + def imported_asset_for_barcode(barcode) + updates.instances_from_uuid[@imported_uuids_by_barcode[barcode]] + end + + def local_asset_for_barcode(barcode) + local_assets.detect {|a| (a.barcode == barcode) || (a.uuid == barcode) } + end + + def assets_for_barcodes + barcodes.map do |barcode| + local_asset_for_barcode(barcode) || imported_asset_for_barcode(barcode) || nil + end + end + + def process + @updates = FactChanges.new + @updates.merge(refresh_assets(local_assets.from_remote_service)) + @updates.merge(import_barcodes(filter_barcodes_not_in_assets(barcodes, local_assets.from_remote_service))) + end + + def process! + process.apply(step) + end + + def local_assets + Asset.where(barcode: barcodes).or(Asset.where(uuid: barcodes)) + end + + def step + Step.new(step_type: StepType.find_or_create_by(name: 'BarcodesImporter')) + end + + private + + def filter_barcodes_not_in_assets(barcodes, assets) + (barcodes - (assets.map(&:barcode).concat(assets.map(&:uuid)).flatten)) + end + + end +end diff --git a/lib/importers/concerns/annotator.rb b/lib/importers/concerns/annotator.rb new file mode 100644 index 00000000..99a25198 --- /dev/null +++ b/lib/importers/concerns/annotator.rb @@ -0,0 +1,138 @@ +require 'importers/concerns/remote_digest' + +module Importers + module Concerns + class Annotator + include Importers::Concerns::RemoteDigest + + attr_reader :asset, :remote_asset + + def initialize(asset, remote_asset) + @asset=asset + @remote_asset = remote_asset + end + + def validate! + raise Assets::Import::RefreshSourceNotFoundAnymore unless remote_asset + raise 'Uuid from asset and remote asset are different' unless asset.uuid == remote_asset.uuid + end + + def import_asset_from_remote_asset + FactChanges.new.tap do |updates| + updates.create_assets([asset]) + updates.replace_remote(asset, 'a', sequencescape_type_for_asset) + updates.replace_remote(asset, 'remoteAsset', asset) + updates.merge(update_asset_from_remote_asset) + end + end + + def update_asset_from_remote_asset + FactChanges.new.tap do |updates| + class_name = sequencescape_type_for_asset + updates.remove(asset.facts.from_remote_asset) + updates.replace_remote_property(asset, 'a', class_name) + + if is_not_a_sample_tube? + updates.replace_remote_property(asset, 'pushTo', 'Sequencescape') + if remote_asset.try(:plate_purpose) + updates.replace_remote_property(asset, 'purpose', remote_asset.plate_purpose.name) + end + end + updates.replace_remote_property(asset, 'is', 'NotStarted') + + updates.merge(annotate_container(asset, remote_asset)) + updates.merge(annotate_wells(asset, remote_asset)) + updates.merge(annotate_study_name(asset, remote_asset)) + + updates.merge(update_digest_with_remote) + end + end + + def update_digest_with_remote + FactChanges.new.tap do |updates| + updates.add(asset, 'remote_digest', digest_for_remote_asset) + end + end + + def annotate_container(asset, remote_asset) + FactChanges.new.tap do |updates| + if remote_asset.try(:aliquots) + remote_asset.aliquots.each do |aliquot| + updates.replace_remote_relation(asset, 'sample_tube', asset) + updates.replace_remote_property(asset, 'sanger_sample_id', aliquot&.sample&.sanger_sample_id) + updates.replace_remote_property(asset, 'sample_uuid', aliquot&.sample&.uuid) + updates.replace_remote_property(asset, 'sanger_sample_name', aliquot&.sample&.name) + updates.replace_remote_property(asset, 'supplier_sample_name', aliquot&.sample&.sample_metadata&.supplier_name) + updates.replace_remote_property(asset, 'sample_common_name', aliquot&.sample&.sample_metadata&.sample_common_name) + end + end + end + end + + def annotate_study_name_from_aliquots(asset, remote_asset) + FactChanges.new.tap do |updates| + if remote_asset.try(:aliquots) + if ((remote_asset.aliquots.count == 1) && (remote_asset.aliquots.first.sample)) + updates.replace_remote_property(asset, 'study_name', remote_asset.aliquots.first.study.name) + updates.replace_remote_property(asset, 'study_uuid', remote_asset.aliquots.first.study.uuid) + end + end + end + end + + def annotate_study_name(asset, remote_asset) + FactChanges.new.tap do |updates| + if remote_asset.try(:wells) + remote_asset.wells.each do |w| + updates.merge(annotate_study_name_from_aliquots(asset, w)) + end + else + updates.merge(annotate_study_name_from_aliquots(asset, remote_asset)) + end + end + end + + def annotate_wells(asset, remote_asset) + FactChanges.new.tap do |updates| + # Remove any old wells + updates.remove(asset.facts.with_predicate('contains').from_remote_asset) + if remote_asset.try(:wells) + remote_asset.wells.each do |well| + local_well = Asset.find_by(uuid: well.uuid) + unless local_well + local_well = Asset.new(uuid: well.uuid) + updates.create_assets([local_well]) + end + # Remove any old fact information from the well + updates.remove(local_well.facts.from_remote_asset) + + # Add the new info + updates.add_remote(asset, 'contains', local_well) + + # Updated wells will also mean that the plate is out of date, so we'll set it in the asset + updates.replace_remote_property(local_well, 'a', 'Well') + updates.replace_remote_property(local_well, 'location', well.position['name']) + updates.replace_remote_relation(local_well, 'parent', asset) + + if (well.try(:aliquots)&.first&.sample&.sample_metadata&.supplier_name) + updates.merge(annotate_container(local_well, well)) + end + end + end + end + end + + def sequencescape_type_for_asset + return nil unless remote_asset.type + type = remote_asset.type.singularize.classify + return 'SampleTube' if type == 'Tube' + return type + end + + def is_not_a_sample_tube? + class_name = sequencescape_type_for_asset + (class_name != 'SampleTube') + end + end + end +end diff --git a/lib/importers/concerns/changes.rb b/lib/importers/concerns/changes.rb new file mode 100644 index 00000000..a81819d9 --- /dev/null +++ b/lib/importers/concerns/changes.rb @@ -0,0 +1,47 @@ +require 'importers/concerns/annotator' + +module Importers + module Concerns + module Changes + + def refresh_assets(assets, opts={}) + FactChanges.new.tap do |updates| + if assets.length > 0 + remote_assets = SequencescapeClient::find_by_uuid(assets.map(&:uuid)) + remote_assets = [] if remote_assets.nil? + assets.zip(remote_assets).each do |asset, remote_asset| + annotator = Importers::Concerns::Annotator.new(asset, remote_asset) + annotator.validate! + @annotators_by_uuid[asset.uuid]=annotator + if annotator.has_changes_between_local_and_remote? + updates.merge(annotator.update_asset_from_remote_asset) + end + end + end + end + end + + def import_barcodes(barcodes) + FactChanges.new.tap do |updates| + if barcodes.length > 0 + remote_assets = SequencescapeClient::get_remote_asset(barcodes) + remote_assets = [] if remote_assets.nil? + barcodes.zip(remote_assets).each do |barcode, remote_asset| + if remote_asset + # Needed in order to identify the imported elements + @imported_uuids_by_barcode[barcode] = remote_asset.uuid + + asset = Asset.new(barcode: barcode, uuid: remote_asset.uuid) + annotator = Importers::Concerns::Annotator.new(asset, remote_asset) + annotator.validate! + @annotators_by_uuid[asset.uuid]=annotator + updates.merge(annotator.import_asset_from_remote_asset) + end + end + end + end + end + + end + end +end diff --git a/lib/importers/concerns/remote_digest.rb b/lib/importers/concerns/remote_digest.rb new file mode 100644 index 00000000..809f861f --- /dev/null +++ b/lib/importers/concerns/remote_digest.rb @@ -0,0 +1,53 @@ +module Importers + module Concerns + module RemoteDigest + + def digest_for_remote_asset + Digest::MD5::hexdigest(signature_for_remote) + end + + def has_changes_between_local_and_remote? + digest_for_remote_asset != asset.remote_digest + end + + def signature_for_remote + distinct = remote_asset.attributes.to_json + + # It would be useful to have a hashcode in the sequencescape client api to know + # if this message is different from a previous one without needing to traverse + # all the object finding the change + # Having a :to_json method that returns a json would be pretty sensible too + + # FOR A PLATE + if remote_asset.respond_to?(:wells) && remote_asset.wells + # wells.to_a because wells relation does not act as an array + listw = remote_asset.wells.to_a + if listw + # aliquots.to_a, same reason + listal = listw.compact.map(&:aliquots).map(&:to_a) + if listal + listsa = listal.flatten.compact.map{|al| al.sample } + if listsa + distinct+=listsa.compact.map(&:attributes).to_json + end + end + end + end + + # FOR A TUBE + if remote_asset.respond_to?(:aliquots) && remote_asset.aliquots + # aliquots.to_a, same reason + listal = remote_asset.aliquots.to_a + if listal + listsa = listal.flatten.compact.map{|al| al.sample } + if listsa + distinct+=listsa.compact.map(&:attributes).to_json + end + end + end + + distinct + end + end + end +end diff --git a/lib/message_processor.rb b/lib/message_processor.rb new file mode 100644 index 00000000..fb66477a --- /dev/null +++ b/lib/message_processor.rb @@ -0,0 +1,21 @@ +class MessageProcessor + include ActiveModel::Validations + + attr_reader :channel + + def initialize(params) + @channel = params[:channel] + end + + def activity_id + channel.params[:activity_id] + end + + def interested_in?(message) + false + end + + def process(message) + false + end +end diff --git a/lib/message_processors/activity_message_processor.rb b/lib/message_processors/activity_message_processor.rb new file mode 100644 index 00000000..525bb06f --- /dev/null +++ b/lib/message_processors/activity_message_processor.rb @@ -0,0 +1,58 @@ +require 'message_processor' + +module MessageProcessors + class ActivityMessageProcessor < MessageProcessor + delegate :redis, to: :channel + + def initialize(params) + super(params) + end + + def interested_in?(message) + !!(message["activity"]) + end + + def process(message) + _process_activity(params_for_activity(message)) + end + + def self.redis + ActivityChannel.redis + end + + def self.activity_attributes(id) + begin + JSON.parse(redis.hget('activities', id)) || default_activity_attributes + rescue StandardError => e + default_activity_attributes + end + end + + def self.default_activity_attributes + { stepTypes: true, stepsPending: true, stepsRunning:true, stepsFailed: true, stepsFinished: false }.as_json + end + + + protected + + def _process_activity(params) + activity = Activity.find_by(id: activity_id) + + obj = ActivityMessageProcessor.activity_attributes(activity_id) + ['stepTypes', 'stepsPending', 'stepsRunning', 'stepsFailed', 'stepsFinished'].reduce(obj) do |memo, key| + memo[key] = !!params[key] unless params[key].nil? + memo + end + + redis.hset('activities', activity_id, obj.to_json) + + activity.touch + end + + def params_for_activity(params) + params = ActionController::Parameters.new(params) + params.require(:activity).permit(:activity_id, :stepTypes, :stepsPending, :stepsRunning, :stepsFailed, :stepsFinished) + end + + end +end diff --git a/lib/message_processors/asset_group_message_processor.rb b/lib/message_processors/asset_group_message_processor.rb new file mode 100644 index 00000000..35a1708e --- /dev/null +++ b/lib/message_processors/asset_group_message_processor.rb @@ -0,0 +1,36 @@ +require 'message_processor' +require 'importers/barcodes_importer' +module MessageProcessors + class AssetGroupMessageProcessor < MessageProcessor + attr_reader :asset_group + + def interested_in?(message) + !!(message["asset_group"]) + end + + def process(message) + _process_asset_group(params_for_asset_group(message)) + end + + def _process_asset_group(strong_params) + @asset_group = AssetGroup.find(strong_params[:id]) + assets = strong_params[:assets] + if asset_group && assets + step_for_import = Step.new(activity_id: asset_group.activity_owner_id, asset_group: asset_group, state: 'complete') + importer = Importers::BarcodesImporter.new(assets) + updates = importer.process + updates.remove_assets_from_group(asset_group, asset_group.assets.to_a) + updates.add_assets_to_group(asset_group, importer.assets_for_barcodes) + updates.apply(step_for_import) + step_for_import.wss_event + end + end + + def params_for_asset_group(params) + params = ActionController::Parameters.new(params) + params.require(:asset_group).permit(:id, :assets => []) + end + + + end +end diff --git a/lib/parsers/csv_layout/assets_cache.rb b/lib/parsers/csv_layout/assets_cache.rb new file mode 100644 index 00000000..34f11e89 --- /dev/null +++ b/lib/parsers/csv_layout/assets_cache.rb @@ -0,0 +1,29 @@ +# +# This module allows to perform a single web request for all the barcodes of the +# files by providing a cache functionality to the CsvParser. This is done by recording +# all the barcode parsers instantiated by a CsvParser and perform a request for all the barcodes +# not resolved when asked by one of the barcodes (in #get_asset_for_barcode) +# +module Parsers::CsvLayout::AssetsCache + def register_barcode_parser(barcode_parser) + @barcode_parsers ||= [] + @barcode_parsers.push(barcode_parser) + end + + def get_asset_for_barcode(barcode) + @cached_assets_from_barcode_parsers ||= {} + update_cached_assets_from_barcode_parsers! unless @cached_assets_from_barcode_parsers[barcode] + return @cached_assets_from_barcode_parsers[barcode] + end + + def unresolved_barcodes_for_cached_assets + (@barcode_parsers.reject(&:no_read_barcode?).map(&:barcode) - @cached_assets_from_barcode_parsers.keys) + end + + def update_cached_assets_from_barcode_parsers! + assets = Asset.find_or_import_assets_with_barcodes(unresolved_barcodes_for_cached_assets) + assets.compact.each do |asset| + @cached_assets_from_barcode_parsers[asset.barcode] = asset + end + end +end diff --git a/lib/parsers/csv_layout/barcode_creatable_parser.rb b/lib/parsers/csv_layout/barcode_creatable_parser.rb index 5d5c6102..41a2540c 100644 --- a/lib/parsers/csv_layout/barcode_creatable_parser.rb +++ b/lib/parsers/csv_layout/barcode_creatable_parser.rb @@ -8,7 +8,7 @@ def updater end def asset - @instance ||= Asset.find_or_import_asset_with_barcode(barcode) + @instance ||= @parser.get_asset_for_barcode(barcode) unless @instance @instance = Asset.new(barcode: barcode) @instance.generate_uuid! diff --git a/lib/parsers/csv_layout/barcode_parser.rb b/lib/parsers/csv_layout/barcode_parser.rb index 5f0dc0de..024facdf 100644 --- a/lib/parsers/csv_layout/barcode_parser.rb +++ b/lib/parsers/csv_layout/barcode_parser.rb @@ -22,7 +22,9 @@ def initialize(line, parser) @parser = parser _parse(line) - valid? + @parser.register_barcode_parser(self) if @parser.respond_to?(:register_barcode_parser) + + #valid? end def no_read_barcode? @@ -30,7 +32,7 @@ def no_read_barcode? end def asset - Asset.find_or_import_asset_with_barcode(barcode) + @parser.get_asset_for_barcode(barcode) end protected diff --git a/lib/parsers/csv_layout/csv_parser.rb b/lib/parsers/csv_layout/csv_parser.rb index e54dbacc..f303f5c3 100644 --- a/lib/parsers/csv_layout/csv_parser.rb +++ b/lib/parsers/csv_layout/csv_parser.rb @@ -2,6 +2,7 @@ require 'parsers/csv_layout/line_reader' require 'parsers/csv_layout/barcode_parser' require 'parsers/csv_layout/location_parser' +require 'parsers/csv_layout/assets_cache' require 'parsers/csv_layout/validators/fluidx_barcode_validator' require 'parsers/csv_layout/validators/location_validator' @@ -9,6 +10,7 @@ module Parsers module CsvLayout class CsvParser include ActiveModel::Validations + include Parsers::CsvLayout::AssetsCache validate :validate_parsed_data validate :validate_location_duplication @@ -58,8 +60,10 @@ def error_list self_error_list.concat(line_parser.error_list) end + protected + def validate_parsed_data parse unless @parsed unless @line_parser.valid? diff --git a/lib/parsers/csv_layout/location_parser.rb b/lib/parsers/csv_layout/location_parser.rb index 5b50f8aa..78c3486d 100644 --- a/lib/parsers/csv_layout/location_parser.rb +++ b/lib/parsers/csv_layout/location_parser.rb @@ -14,8 +14,6 @@ def validations def initialize(line, parser) @parser = parser _parse(line) - - valid? end protected diff --git a/lib/sequencescape_client.rb b/lib/sequencescape_client.rb index 5994e993..edb13cc7 100644 --- a/lib/sequencescape_client.rb +++ b/lib/sequencescape_client.rb @@ -8,6 +8,22 @@ require 'sequencescape_client_v2' class SequencescapeClient + + def self.RESOURCES_FOR_UUID_SEARCH + [ + SequencescapeClientV2::Plate, + SequencescapeClientV2::Tube, + SequencescapeClientV2::Well + ] + end + + def self.RESOURCES_FOR_BARCODE_SEARCH + [ + SequencescapeClientV2::Plate, + SequencescapeClientV2::Tube + ] + end + @purposes=nil def self.api_connection_options @@ -43,37 +59,39 @@ def self.create_plate(purpose_name, attrs) purpose.plates.create!(attrs) end - def self.get_study_by_name(name) - get_study_searcher_by_name.first(name: name) - rescue Sequencescape::Api::ResourceNotFound => exception - return nil - end - - def self.get_study_searcher_by_name - @@study_searcher ||= client.search.all.select{|s| s.name == Rails.configuration.searcher_study_by_name}.first - end - - def self.get_searcher_by_barcode - @@searcher ||= client.search.all.select{|s| s.name == Rails.configuration.searcher_name_by_barcode}.first - end - def self.get_remote_asset(barcode) - find_by(barcode: barcode) + barcodes = [barcode].flatten + return find_first(self.RESOURCES_FOR_BARCODE_SEARCH, barcode: barcodes) if barcodes.length==1 + results = find_by(self.RESOURCES_FOR_BARCODE_SEARCH, barcode: barcodes) + barcodes.each_with_index.map do |barcode| + results.detect{|r| r.labware_barcode['human_barcode'] == barcode} + end end def self.find_by_uuid(uuid, opts=nil) - find_by(uuid: uuid) + uuids = [uuid].flatten + return find_first(self.RESOURCES_FOR_UUID_SEARCH, uuid: uuids) if uuids.length==1 + results = find_by(self.RESOURCES_FOR_UUID_SEARCH, uuid: uuids) + uuids.each_with_index.map do |uuid| + results.detect{|r| r.uuid == uuid} + end end - def self.find_by(search_conditions) - [ - SequencescapeClientV2::Plate, - SequencescapeClientV2::Tube, - SequencescapeClientV2::Well - ].each do |klass| + def self.find_by(resources, search_conditions) + resources.map do |klass| + begin + klass.where(search_conditions) + rescue JsonApiClient::Errors::ClientError => e + # Ignore filter error + end + end.flatten.compact + end + + def self.find_first(resources, search_conditions) + resources.each do |klass| begin search = klass.where(search_conditions) - search = search.first if search + search = search.first if search && search.length == 1 return search if search rescue JsonApiClient::Errors::ClientError => e # Ignore filter error diff --git a/package.json b/package.json index 892c1293..3fa289db 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "jquery": "^3.4.1", "moment": "^2.22.2", "node": "^10.0.0", + "node-sass": "^4.12.0", "prop-types": "^15.6.0", "react": "^16.2.0", "react-dom": "^16.4.1", diff --git a/script/runners/a_big_task.rb b/script/runners/a_big_task.rb new file mode 100644 index 00000000..64fdc096 --- /dev/null +++ b/script/runners/a_big_task.rb @@ -0,0 +1,3 @@ +sleep(30) + +puts "{}" diff --git a/script/runners/load_metadata.rb b/script/runners/load_metadata.rb index 76bad43d..dd1f8194 100644 --- a/script/runners/load_metadata.rb +++ b/script/runners/load_metadata.rb @@ -1,4 +1,3 @@ -require 'actions/racking' require 'parsers/csv_metadata/csv_parser' class LoadMetadata diff --git a/script/runners/move_barcodes_from_tube_rack_to_plate.rb b/script/runners/move_barcodes_from_tube_rack_to_plate.rb new file mode 100644 index 00000000..ae4411e0 --- /dev/null +++ b/script/runners/move_barcodes_from_tube_rack_to_plate.rb @@ -0,0 +1,96 @@ +# # This rule applies the barcodes from a rack into a plate +# { +# ?plate se:a """Plate""" . +# ?rack se:a """TubeRack""" . +# ?rack se:mergeInto ?plate . +# ?rack se:contains ?tube . +# ?plate se:contains ?well . +# ?tube se:location ?location . +# ?tube se:barcode ?barcode . +# ?well se:location ?location . +# } => { +# :step :addFacts { ?well se:barcode ?barcode . } . +# :step :removeFacts { ?tube se:barcode ?barcode . } . +# :step :addFacts { ?tube se:barcode """""" . } . +# :step :addFacts { ?tube se:previousBarcode ?barcode . } . +# :step :addFacts { ?tube se:appliedBarcodeTo ?well . } . +# :step :addFacts { ?rack se:mergedInto ?plate .}. +# :step :addFacts { ?plate se:mergedFrom ?rack .}. +# }. + +class MoveBarcodesFromTubeRackToPlate + attr_reader :asset_group + + + def initialize(params) + @asset_group = params[:asset_group] + end + + def assets_compatible_with_step_type + [plate, tube_rack].flatten.compact.count > 0 + end + + + def plate + asset_group.assets.select{|a| a.facts.where(predicate: 'a', object: 'Plate').count > 0 }.first + end + + def tube_rack + asset_group.assets.select{|a| a.facts.where(predicate: 'a', object: 'TubeRack').count > 0}.first + end + + def wells_for(asset) + asset.facts.where(predicate: 'contains').map(&:object_asset) + end + + def well_at_location(asset, location) + wells_for(asset).select do |w| + location_facts = w.facts.where(predicate: 'location') + if (location_facts.count == 1) + location_fact = location_facts.first + (TokenUtil.pad_location(location_fact.object) == TokenUtil.pad_location(location)) + end + end.first + end + + def traverse_wells(asset, &block) + wells_for(asset).each do |w| + location = w.facts.where(predicate: 'location').first.object + yield w, TokenUtil.pad_location(location) + end + end + + def process + FactChanges.new.tap do |updates| + if assets_compatible_with_step_type + traverse_wells(tube_rack) do |well_from_tube_rack, location| + well_from_plate = well_at_location(plate, location) + updates.remove_where(well_from_tube_rack, 'barcode', well_from_tube_rack.barcode) + updates.add(well_from_tube_rack, 'previousBarcode', well_from_tube_rack.barcode) + updates.add(well_from_tube_rack, 'appliedBarcodeTo', well_from_plate) + updates.add(well_from_plate, 'barcode', well_from_tube_rack.barcode) + end + + updates.add(tube_rack, 'mergedInto', plate) + updates.add(plate, 'mergedFrom', tube_rack) + end + end + end +end + +return unless ARGV.any?{|s| s.match(".json")} + +args = ARGV[0] +asset_group_id = args.match(/(\d*)\.json/)[1] +asset_group = AssetGroup.find(asset_group_id) + +begin + updates = MoveBarcodesFromTubeRackToPlate.new(asset_group: asset_group).process + json = updates.to_json + JSON.parse(json) + puts json +rescue StandardError => e + puts ({ set_errors: ['Unknown error while parsing file'+e.backtrace.to_s]}.to_json) +end + + diff --git a/script/runners/put_tubes_into_rack_by_column_order.rb b/script/runners/put_tubes_into_rack_by_column_order.rb index 6acaba77..cb7fdb23 100644 --- a/script/runners/put_tubes_into_rack_by_column_order.rb +++ b/script/runners/put_tubes_into_rack_by_column_order.rb @@ -1,6 +1,10 @@ -require 'actions/racking' +require 'actions/layout/racking' +require 'actions/layout/unracking' +require 'actions/layout_processor' require 'token_util' -include Actions::Racking + +include Actions::Layout::Unracking +include Actions::Layout::Racking return unless ARGV.any?{|s| s.match(".json")} @@ -36,7 +40,7 @@ memo.push(asset: tube, location: available_locations[idx]) end updates.add(rack, 'layout', 'Complete') - updates.merge(Actions::Racking::reracking_tubes(rack, layout)) + updates.merge(Actions::Layout::Racking::reracking_tubes(rack, layout)) end puts updates.to_json diff --git a/script/runners/rack_layout.rb b/script/runners/rack_layout.rb index 88638c2c..a597aac2 100644 --- a/script/runners/rack_layout.rb +++ b/script/runners/rack_layout.rb @@ -1,4 +1,4 @@ -require 'actions/racking' +require 'actions/layout_processor' class RackLayout attr_reader :asset_group @@ -17,7 +17,7 @@ def assets_compatible_with_step_type def process FactChanges.new.tap do |updates| if assets_compatible_with_step_type.count > 0 - updates.merge(rack_layout(@asset_group)) + updates.merge(Actions::LayoutProcessor.new(asset_group: @asset_group).changes) end end end diff --git a/script/runners/rack_layout_any_barcode.rb b/script/runners/rack_layout_any_barcode.rb index 31169d66..d973ebae 100644 --- a/script/runners/rack_layout_any_barcode.rb +++ b/script/runners/rack_layout_any_barcode.rb @@ -1,4 +1,4 @@ -require 'actions/racking' +require 'actions/layout_processor' class RackLayoutAnyBarcode attr_reader :asset_group @@ -17,7 +17,10 @@ def assets_compatible_with_step_type def process FactChanges.new.tap do |updates| if assets_compatible_with_step_type.count > 0 - updates.merge(rack_layout_any_barcode(@asset_group)) + updates.merge(Actions::LayoutProcessor.new({ + asset_group: @asset_group, + barcode_validator: Parsers::CsvLayout::Validators::AnyBarcodeValidator + }).changes) updates.remove_assets([[asset_group.uploaded_files.first.asset.uuid]]) end end diff --git a/script/runners/rack_layout_creating_tubes.rb b/script/runners/rack_layout_creating_tubes.rb index 9a3cfd10..0721000f 100644 --- a/script/runners/rack_layout_creating_tubes.rb +++ b/script/runners/rack_layout_creating_tubes.rb @@ -1,4 +1,4 @@ -require 'actions/racking' +require 'actions/layout_processor' class RackLayoutCreatingTubes attr_reader :asset_group @@ -13,11 +13,13 @@ def assets_compatible_with_step_type asset_group.uploaded_files end - def process FactChanges.new.tap do |updates| if assets_compatible_with_step_type.count > 0 - updates.merge(rack_layout_creating_tubes(@asset_group)) + updates.merge(Actions::LayoutProcessor.new({ + asset_group: @asset_group, + barcode_parser: Parsers::CsvLayout::BarcodeCreatableParser + }).changes) updates.remove_assets([[asset_group.uploaded_files.first.asset.uuid]]) end end diff --git a/script/runners/remove_barcodes_from_tubes.rb b/script/runners/remove_barcodes_from_tubes.rb new file mode 100644 index 00000000..463e59b1 --- /dev/null +++ b/script/runners/remove_barcodes_from_tubes.rb @@ -0,0 +1,55 @@ +class RemoveBarcodesFromTubes + attr_reader :asset_group + + + def initialize(params) + @asset_group = params[:asset_group] + end + + def asset + plate || tube_rack + end + + def plate + asset_group.assets.select{|a| a.facts.where(predicate: 'a', object: 'Plate').count > 0 }.first + end + + def tube_rack + asset_group.assets.select{|a| a.facts.where(predicate: 'a', object: 'TubeRack').count > 0}.first + end + + def tubes + asset.facts.with_predicate('contains').map(&:object_asset) + end + + def assets_compatible_with_step_type + !asset.nil? + end + + + def process + FactChanges.new.tap do |updates| + if assets_compatible_with_step_type + tubes.each do |tube| + updates.remove_where(tube, 'barcode', tube.barcode) if tube.barcode + end + end + end + end + +end + +return unless ARGV.any?{|s| s.match(".json")} + +args = ARGV[0] +asset_group_id = args.match(/(\d*)\.json/)[1] +asset_group = AssetGroup.find(asset_group_id) + +begin + updates = RemoveBarcodesFromTubes.new(asset_group: asset_group).process + json = updates.to_json + JSON.parse(json) + puts json +rescue StandardError => e + puts ({ set_errors: ['Unknown error while parsing file'+e.backtrace.to_s]}.to_json) +end diff --git a/spec/controllers/asset_groups_controller_spec.rb b/spec/controllers/asset_groups_controller_spec.rb index 7b4c04d5..7bf09696 100644 --- a/spec/controllers/asset_groups_controller_spec.rb +++ b/spec/controllers/asset_groups_controller_spec.rb @@ -11,6 +11,9 @@ context '#upload' do + before do + allow(SequencescapeClient).to receive(:get_remote_asset).and_return(nil) + end let(:file) { fixture_file_upload('test/data/layout.csv', 'text/csv') } it 'creates a new uploaded file' do @@ -26,7 +29,7 @@ it 'creates a new step to track the change in the asset group' do expect{ post :upload, params: { id: asset_group.id, qqfilename: 'myfile.csv', qqfile: file} - }.to change{Step.all.count}.by(1) + }.to change{Step.all.count} end end @@ -34,6 +37,9 @@ let(:barcode) { generate :barcode } let(:asset) { create :asset, barcode: barcode } + before do + allow(SequencescapeClient).to receive(:get_remote_asset).and_return(nil) + end context "when the asset is in the database" do context 'finding by uuid' do @@ -92,20 +98,18 @@ :id => asset_group.id, :activity_id => activity.id} expect(asset_group.assets.count).to eq(0) end - end - - context "when it is a creatable barcode" do - let(:creatable_barcode) { generate :barcode_creatable } - - it "creates a new asset" do + it "does not create a new asset" do + barcode = generate :barcode_creatable expect{ post :update, params: {:asset_group => { - :assets => [creatable_barcode] + :assets => [barcode] }, :id => asset_group.id, :activity_id => activity.id} - }.to change{asset_group.assets.count}.by(1) + }.not_to change{Asset.count} end + end + end end end diff --git a/spec/features/activity_management_spec.rb b/spec/features/activity_management_spec.rb new file mode 100644 index 00000000..90a1bd57 --- /dev/null +++ b/spec/features/activity_management_spec.rb @@ -0,0 +1,151 @@ +require 'rails_helper' +require 'remote_assets_helper' +RSpec.feature 'Activity Management', type: :feature, js: true, browser: true do + let!(:activity_type) { create(:activity_type, name: 'Test') } + let!(:instrument) { create(:instrument, barcode: '1', activity_types: [activity_type]) } + let!(:kit_type) { create :kit_type, activity_type: activity_type } + let!(:user) { create(:user, barcode: '1', role: 'administrator', username: 'TEST') } + let!(:kit) { create :kit, kit_type: kit_type} + let!(:plate_name) { "a plate name" } + let!(:plate1) { + p=create(:plate, remote_digest: '1234') + p.generate_barcode + p.facts << create(:fact, predicate: 'plateName', object: plate_name, literal: true) + remote = build_remote_plate(barcode: p.barcode) + stub_client_with_asset(SequencescapeClient, remote) + p.update_attributes(uuid: remote.uuid) + p + } + let!(:step_type) { + st = create(:step_type, n3_definition: %Q{ + { ?plate :a :Plate . + ?plate :is :NotStarted . + } => { + :step :stepTypeName """Transfer to new plate""" . + :step :unselectAsset ?plate . + :step :removeFacts { ?plate :is :NotStarted .}. + :step :addFacts { ?plate :is :Started .}. + :step :createAsset { ?plate2 :a :Plate .} . + :step :addFacts { ?plate2 :status :plateReadyForSecondTransfer .}. + :step :addFacts { ?plate2 :transferredFrom ?plate .}. + :step :addFacts { ?plate :transfer ?plate2 . }. + }. + }) + activity_type.step_types << st + st + } + let!(:step_type2) { + st = create(:step_type, n3_definition: %Q{ + { + ?plate :a :Plate . + ?plate :status :plateReadyForSecondTransfer . + } => { + :step :stepTypeName """Transfer to 2 new plates""" . + :step :unselectAsset ?plate . + :step :createAsset { ?plate2 :a :Plate .} . + :step :createAsset { ?plate3 :a :Plate .} . + :step :addFacts { ?plate2 :status :plateReadyForThirdTransfer .}. + :step :addFacts { ?plate3 :status :plateReadyForThirdTransfer .}. + :step :addFacts { ?plate2 :transferredFrom ?plate .}. + :step :addFacts { ?plate :transfer ?plate2 . }. + :step :addFacts { ?plate3 :transferredFrom ?plate .}. + :step :addFacts { ?plate :transfer ?plate3 . }. + + }. + }) + activity_type.step_types << st + st + } + + include RemoteAssetsHelper + before(:all) do + Rails.configuration.redis_enabled = true + end + after(:all) do + Rails.configuration.redis_enabled = false + end + before do + @mocked_redis = MockRedis.new + ActionController::Base.allow_forgery_protection = true + allow(ActivityChannel).to receive(:redis).and_return(@mocked_redis) + Capybara.current_driver = :selenium_chrome_headless + end + + def user_login(user) + visit '/' + find('.logged-out').click + fill_in('Scan a user barcode', with: user.barcode) + click_on('Login') + end + + def start_activity(kit) + click_on('Use') + fill_in('Scan a kit barcode', with: kit.barcode) + click_on('Create activity') + end + + def scan_asset(asset) + fill_in('Scan a barcode', with: asset.barcode+"\n") + end + + context 'with an unlogged user' do + scenario "user can log in" do + user_login(user) + + expect(page).to have_content('Logged as TEST') + end + end + context 'with a logged user' do + before do + user_login(user) + end + scenario "User can create an activity" do + start_activity(kit) + + expect(page).to have_content('Activity was successfully created') + + click_on("Finish activity") + + expect(page).to have_content('This activity was finished') + end + + context "with a created activity" do + before do + start_activity(kit) + end + + scenario "we can scan new assets and remove them" do + scan_asset(plate1) + + expect(page).to have_content(plate1.barcode, wait: 10) + + click_on("Delete") + + expect(page).not_to have_content(plate1.barcode, wait: 10) + end + + scenario "we can run a workflow on it" do + scan_asset(plate1) + + expect(page).to have_content("Transfer to new plate", wait: 10) + + expect(find("div.active")).to have_content(plate_name, wait: 10) + expect(page).not_to have_content("Transfer to 2 new plates") + + click_on("Transfer to new plate", match: :first) + + expect(page).to have_content("transferredFrom", wait: 10) + expect(find("div.active")).not_to have_content(plate_name, wait: 10) + expect(page).not_to have_content("Transfer to new plate") + + click_on("Transfer to 2 new plates", match: :first) + + expect(page).to have_content("transferredFrom", wait: 10) + expect(find("div.active")).to have_content("plateReadyForThirdTransfer", wait: 10) + + click_on("Finish activity") + expect(page).to have_content('This activity was finished') + end + end + end +end diff --git a/spec/lib/actions/layout/racking_spec.rb b/spec/lib/actions/layout/racking_spec.rb new file mode 100644 index 00000000..79ec9c56 --- /dev/null +++ b/spec/lib/actions/layout/racking_spec.rb @@ -0,0 +1,71 @@ +require 'rails_helper' +require 'actions/layout_processor' + +RSpec.describe 'Actions::Layout::Racking' do + let(:layout_processor) { Actions::LayoutProcessor.new({}) } + let(:positions) { TokenUtil.generate_positions(('A'..'F').to_a, (1..12).to_a) } + + describe '#changes_for_put_tube_into_rack_position' do + let(:rack) { create :tube_rack } + let(:position) { 'A01'} + let(:tube) { create :tube } + it 'returns all changes to put the tube in the rack' do + updates = layout_processor.changes_for_put_tube_into_rack_position(tube, rack, position) + expect(updates.to_h[:add_facts]).to include( + [tube.uuid, 'location', position], + [tube.uuid, 'parent', rack.uuid], + [rack.uuid, 'contains', tube.uuid] + ) + end + end + + describe '#changes_for_rack_tubes' do + let(:tube1) {create :tube } + let(:tube2) {create :tube } + let(:rack) { create :tube_rack } + let(:layout) { + [{location: 'A01', asset: nil}, {location: 'B01', asset: tube1}, {location: 'C01', asset: tube2}] + } + it 'puts the tubes in the rack following the layout' do + updates = layout_processor.changes_for_rack_tubes(layout, rack) + expect(updates.to_h[:add_facts]).to include( + [rack.uuid, 'contains', tube1.uuid], + [rack.uuid, 'contains', tube2.uuid], + [tube1.uuid, 'location', 'B01'], + [tube1.uuid, 'parent', rack.uuid], + [tube2.uuid, 'location', 'C01'], + [tube2.uuid, 'parent', rack.uuid] + ) + end + it 'also adds inherited fields' do + tube2.facts << create(:fact, predicate: 'study_name', object: 'STDY1', literal: true) + updates = layout_processor.changes_for_rack_tubes(layout, rack) + expect(updates.to_h[:add_facts]).to include([rack.uuid, 'study_name', 'STDY1']) + end + end + + describe '#changes_for_rack_when_racking_tubes' do + let(:rack) { create :tube_rack } + let(:tube1) { create(:tube, :inside_rack, location: "A01", parent: rack) } + let(:tube2) { create(:tube, :inside_rack, location: "B01", parent: rack) } + let(:tubes) {[tube1, tube2]} + + it 'transfers the relevant properties from the tubes into the racks' do + Actions::LayoutProcessor::TUBE_TO_RACK_TRANSFERRABLE_PROPERTIES.push('country') + tube1.facts << create(:fact, predicate: 'country', object: 'Spain', literal: true) + tube2.facts << create(:fact, predicate: 'country', object: 'Portugal', literal: true) + + updates = layout_processor.changes_for_rack_when_racking_tubes(rack, tubes) + expect(updates.to_h[:add_facts]).to eq( + [[rack.uuid, 'country', 'Spain'], + [rack.uuid, 'country', 'Portugal']] + ) + end + it 'does not transfer non-relevant properties from tubes to the rack' do + property = SecureRandom.uuid + tube2.facts << create(:fact, predicate: property, object: 'Orange', literal: true) + updates = layout_processor.changes_for_rack_when_racking_tubes(rack, tubes) + expect(updates.to_h[:add_facts]).to be_nil + end + end +end diff --git a/spec/lib/actions/layout/unracking_spec.rb b/spec/lib/actions/layout/unracking_spec.rb new file mode 100644 index 00000000..d6cabd8c --- /dev/null +++ b/spec/lib/actions/layout/unracking_spec.rb @@ -0,0 +1,95 @@ +require 'rails_helper' +require 'actions/layout_processor' + +RSpec.describe 'Actions::Layout::Unracking' do + let(:layout_processor) { Actions::LayoutProcessor.new({}) } + let(:positions) { TokenUtil.generate_positions(('A'..'F').to_a, (1..12).to_a) } + + describe '#changes_for_tubes_on_unrack' do + context 'when unracking a list of tubes' do + let(:tubes_rack_1) { + 3.times.map do |pos| + create(:tube, :inside_rack, location: positions[pos], parent: rack1) + end + } + let(:tubes_rack_2) { + 3.times.map do |pos| + create(:tube, :inside_rack, location: positions[pos], parent: rack2) + end + } + let(:tubes) { [tubes_rack_1, tubes_rack_2].flatten } + let!(:rack1) { create :tube_rack } + let!(:rack2) { create :tube_rack } + let(:layout) { + all_tubes.each_with_index.map{|tube, i| {asset: tube, location: positions[i]}} + } + + it 'removes all tubes from the layout from its previous parent' do + expect(layout_processor.changes_for_tubes_on_unrack(tubes).to_h[:remove_facts]).to include( + [rack1.uuid, 'contains', tubes_rack_1[0].uuid], + [rack1.uuid, 'contains', tubes_rack_1[1].uuid], + [rack1.uuid, 'contains', tubes_rack_1[2].uuid], + [rack2.uuid, 'contains', tubes_rack_2[0].uuid], + [rack2.uuid, 'contains', tubes_rack_2[1].uuid], + [rack2.uuid, 'contains', tubes_rack_2[2].uuid] + ) + end + it 'removes the parent from the reracked tubes' do + expect(layout_processor.changes_for_tubes_on_unrack(tubes).to_h[:remove_facts]).to include( + [tubes_rack_1[0].uuid, 'parent', rack1.uuid], + [tubes_rack_1[1].uuid, 'parent', rack1.uuid], + [tubes_rack_1[2].uuid, 'parent', rack1.uuid], + [tubes_rack_2[0].uuid, 'parent', rack2.uuid], + [tubes_rack_2[1].uuid, 'parent', rack2.uuid], + [tubes_rack_2[2].uuid, 'parent', rack2.uuid] + ) + end + it 'removes all previous locations from the tubes of the layout' do + expect(layout_processor.changes_for_tubes_on_unrack(tubes).to_h[:remove_facts]).to include( + [tubes_rack_1[0].uuid, 'location', positions[0]], + [tubes_rack_1[1].uuid, 'location', positions[1]], + [tubes_rack_1[2].uuid, 'location', positions[2]], + [tubes_rack_2[0].uuid, 'location', positions[0]], + [tubes_rack_2[1].uuid, 'location', positions[1]], + [tubes_rack_2[2].uuid, 'location', positions[2]] + ) + end + + it 'adds a new reracking record in the destination rack' do + updates = layout_processor.changes_for_tubes_on_unrack(tubes) + triples = updates.to_h[:add_facts].select{|t| t[1] == 'rerack'} + expect(triples.count).to eq(6) + expect(updates.to_h[:add_facts]).to include( + *(triples.map{|t| [t[2], 'a', 'Rerack']}) + ) + end + end + end + + describe '#changes_for_rack_on_unrack' do + let(:rack) { create :tube_rack } + let(:tube1) { create(:tube, :inside_rack, location: "A01", parent: rack) } + let(:tube2) { create(:tube, :inside_rack, location: "B01", parent: rack) } + let(:tubes) {[tube1, tube2]} + + it 'removes the relevant properties when removing tubes from the racks' do + Actions::LayoutProcessor::TUBE_TO_RACK_TRANSFERRABLE_PROPERTIES.push('country') + tube1.facts << create(:fact, predicate: 'country', object: 'Spain', literal: true) + tube2.facts << create(:fact, predicate: 'country', object: 'Portugal', literal: true) + + updates = layout_processor.changes_for_rack_on_unrack(rack, tubes) + expect(updates.to_h[:remove_facts]).to eq( + [[rack.uuid, 'country', 'Spain'], + [rack.uuid, 'country', 'Portugal']] + ) + end + it 'does not remove non-relevant properties when removing tubes from the rack' do + property = SecureRandom.uuid + tube2.facts << create(:fact, predicate: property, object: 'Orange', literal: true) + updates = layout_processor.changes_for_rack_on_unrack(rack, tubes) + expect(updates.to_h[:remove_facts]).to be_nil + end + + end + +end diff --git a/spec/lib/actions/layout_processor_spec.rb b/spec/lib/actions/layout_processor_spec.rb new file mode 100644 index 00000000..60fb048b --- /dev/null +++ b/spec/lib/actions/layout_processor_spec.rb @@ -0,0 +1,119 @@ +require 'rails_helper' +require 'actions/layout_processor' + +RSpec.describe Actions::LayoutProcessor do + let(:content) { File.open('test/data/layout.csv').read } + let(:file) { create(:uploaded_file, data: content )} + let(:activity) { create(:activity) } + let(:asset_group) { create(:asset_group, assets: [asset]) } + let(:fact) { create(:fact, predicate: 'a', object: 'TubeRack')} + let(:asset) { create :asset, uploaded_file: file, facts: [fact] } + let(:step_type) {create(:step_type, condition_groups: [condition_group]) } + let(:step) { create :step, + activity: activity, + state: Step::STATE_RUNNING, + asset_group: asset_group, step_type: step_type } + + let(:condition) { create(:condition, predicate: fact.predicate, object: fact.object) } + let(:condition_group) { create(:condition_group, conditions: [condition]) } + + let(:csv_parsed) { CSV.new(content).to_a } + let!(:tubes) { csv_parsed.map{|line| create(:asset, barcode: line[1]) } } + + setup do + allow(Asset).to receive(:find_or_import_asset_with_barcode) do |barcode| + Asset.find_by(barcode: barcode) + end + allow(Asset).to receive(:find_or_import_assets_with_barcodes) do |barcodes| + Asset.where(barcode: barcodes) + #barcodes.map{|barcode| Asset.find_by(barcode: barcode)} + end + + end + + + describe "when linking it with an asset" do + it 'adds the facts to the asset' do + expect(asset.facts.count).to eq(1) + updates = Actions::LayoutProcessor.new(asset_group: asset_group).changes + updates.apply(step) + + asset.facts.reload + assets = asset.facts.with_predicate('contains').map(&:object_asset) + expect(assets.count).to eq(96) + assets.each do |a| + expect(a.facts.with_predicate('location').count).to eq(1) + expect(a.facts.with_predicate('parent').count).to eq(1) + expect(a.facts.with_predicate('parent').first.object_asset).to eq(asset) + end + end + + describe 'with links with previous parents' do + let(:actual_parent) { create(:asset, uploaded_file: file, facts: [fact]) } + it 'removes links with the previous parents' do + Actions::LayoutProcessor.new(asset_group: asset_group).changes.apply(step) + asset.facts.reload + assets = asset.facts.with_predicate('contains').map(&:object_asset) + expect(assets.count).to eq(96) + assets.each do |a| + expect(a.facts.with_predicate('location').count).to eq(1) + expect(a.facts.with_predicate('parent').count).to eq(1) + expect(a.facts.with_predicate('parent').first.object_asset).to eq(asset) + end + + asset_group = AssetGroup.create(assets: [actual_parent]) + another_step = Step.new( + activity: activity, + asset_group: asset_group, step_type: step_type, + state: Step::STATE_RUNNING + ) + Actions::LayoutProcessor.new(asset_group: asset_group).changes.apply(another_step) + + assets = asset.facts.with_predicate('contains').map(&:object_asset) + expect(assets.count).to eq(0) + + assets = actual_parent.facts.with_predicate('contains').map(&:object_asset) + expect(assets.count).to eq(96) + assets.each do |a| + expect(a.facts.with_predicate('location').count).to eq(1) + expect(a.facts.with_predicate('parent').count).to eq(1) + expect(a.facts.with_predicate('parent').first.object_asset).to eq(actual_parent) + end + end + end + + describe 'with empty slots in the layout .csv' do + let(:num_empty) { 3 } + let(:start_pos) { 0 } + let(:content) { + add_empty_slots(File.open('test/data/layout.csv').read, num_empty, start_pos) + } + def add_empty_slots(content, num_empty, start_pos=0) + csv = CSV.new(content).to_a + num_empty.times do |i| + csv[start_pos + i][1] = 'No Read' + end + csv.map do |line| + line.join(',') + end.join("\n") + end + + it 'adds the new facts to the asset and removes the old ones' do + expect(asset.facts.count).to eq(1) + Actions::LayoutProcessor.new(asset_group: asset_group).changes.apply(step) + + asset.facts.reload + assets = asset.facts.with_predicate('contains').map(&:object_asset) + expect(assets.count).to eq(96 - num_empty) + assets.each_with_index do |a, idx| + if (idx < start_pos) || (idx >= start_pos + num_empty) + expect(a.facts.with_predicate('location').count).to eq(1) + expect(a.facts.with_predicate('parent').count).to eq(1) + expect(a.facts.with_predicate('parent').first.object_asset).to eq(asset) + end + end + end + end + end + +end diff --git a/spec/lib/actions/plate_transfer_spec.rb b/spec/lib/actions/plate_transfer_spec.rb index 922a5917..849f32ac 100644 --- a/spec/lib/actions/plate_transfer_spec.rb +++ b/spec/lib/actions/plate_transfer_spec.rb @@ -61,6 +61,18 @@ created_well = updates.to_h[:add_facts].select{|t| (t[1] == 'location')}.first[0] expect(updates.to_h[:add_facts].select{|t| (t[0]==created_well) && (t[1]=='aliquotType')}.first[2]).to eq('DNA') end + it 'copies all the study names at source into the plate' do + source = create :plate + destination = create :plate + study = 'A study' + study2 = 'Another study' + source.facts << create(:fact, predicate: 'study_name', object: study, literal: true) + source.facts << create(:fact, predicate: 'study_name', object: study2, literal: true) + + updates = Actions::PlateTransfer.transfer_plates(source, destination, FactChanges.new) + expect(updates.to_h[:add_facts]).to include([destination.uuid, 'study_name', study]) + expect(updates.to_h[:add_facts]).to include([destination.uuid, 'study_name', study2]) + end it 'does not copy ignored predicates' do source = create :asset well = create(:asset) diff --git a/spec/lib/actions/racking_spec.rb b/spec/lib/actions/racking_spec.rb deleted file mode 100644 index b2bd9760..00000000 --- a/spec/lib/actions/racking_spec.rb +++ /dev/null @@ -1,216 +0,0 @@ -require 'rails_helper' -require 'actions/racking' - -RSpec.describe Actions::Racking do - let(:content) { File.open('test/data/layout.csv').read } - let(:file) { create(:uploaded_file, data: content )} - let(:activity) { create(:activity) } - let(:asset_group) { create(:asset_group, assets: [asset]) } - let(:fact) { create(:fact, predicate: 'a', object: 'TubeRack')} - let(:asset) { create :asset, uploaded_file: file, facts: [fact] } - let(:step_type) {create(:step_type, condition_groups: [condition_group]) } - let(:step) { create :step, - activity: activity, - state: Step::STATE_RUNNING, - asset_group: asset_group, step_type: step_type } - - let(:condition) { create(:condition, predicate: fact.predicate, object: fact.object) } - let(:condition_group) { create(:condition_group, conditions: [condition]) } - - include Actions::Racking - - setup do - allow(Asset).to receive(:find_or_import_asset_with_barcode) do |barcode| - Asset.find_by(barcode: barcode) - end - end - - shared_examples_for 'rack_layout' do - describe "when linking it with an asset" do - it 'adds the facts to the asset' do - expect(asset.facts.count).to eq(1) - updates = send(method, asset_group) - updates.apply(step) - - asset.facts.reload - assets = asset.facts.with_predicate('contains').map(&:object_asset) - expect(assets.count).to eq(96) - assets.each do |a| - expect(a.facts.with_predicate('location').count).to eq(1) - expect(a.facts.with_predicate('parent').count).to eq(1) - expect(a.facts.with_predicate('parent').first.object_asset).to eq(asset) - end - end - - describe 'with links with previous parents' do - let(:actual_parent) { create(:asset, uploaded_file: file, facts: [fact]) } - it 'removes links with the previous parents' do - send(method, asset_group).apply(step) - asset.facts.reload - assets = asset.facts.with_predicate('contains').map(&:object_asset) - expect(assets.count).to eq(96) - assets.each do |a| - expect(a.facts.with_predicate('location').count).to eq(1) - expect(a.facts.with_predicate('parent').count).to eq(1) - expect(a.facts.with_predicate('parent').first.object_asset).to eq(asset) - end - - asset_group = AssetGroup.create(assets: [actual_parent]) - another_step = Step.new( - activity: activity, - asset_group: asset_group, step_type: step_type, - state: Step::STATE_RUNNING - ) - send(method, asset_group).apply(another_step) - - assets = asset.facts.with_predicate('contains').map(&:object_asset) - expect(assets.count).to eq(0) - - assets = actual_parent.facts.with_predicate('contains').map(&:object_asset) - expect(assets.count).to eq(96) - assets.each do |a| - expect(a.facts.with_predicate('location').count).to eq(1) - expect(a.facts.with_predicate('parent').count).to eq(1) - expect(a.facts.with_predicate('parent').first.object_asset).to eq(actual_parent) - end - end - end - - describe 'with empty slots in the layout .csv' do - let(:num_empty) { 3 } - let(:start_pos) { 0 } - let(:content) { - add_empty_slots(File.open('test/data/layout.csv').read, num_empty, start_pos) - } - def add_empty_slots(content, num_empty, start_pos=0) - csv = CSV.new(content).to_a - num_empty.times do |i| - csv[start_pos + i][1] = 'No Read' - end - csv.map do |line| - line.join(',') - end.join("\n") - end - - it 'adds the new facts to the asset and removes the old ones' do - expect(asset.facts.count).to eq(1) - send(method, asset_group).apply(step) - - asset.facts.reload - assets = asset.facts.with_predicate('contains').map(&:object_asset) - expect(assets.count).to eq(96 - num_empty) - assets.each_with_index do |a, idx| - if (idx < start_pos) || (idx >= start_pos + num_empty) - expect(a.facts.with_predicate('location').count).to eq(1) - expect(a.facts.with_predicate('parent').count).to eq(1) - expect(a.facts.with_predicate('parent').first.object_asset).to eq(asset) - end - end - end - - end - - end - end - - - describe '#fact_changes_for_rack_when_unracking_tubes' do - before do - @tubes = 15.times.map do |line| - create(:asset) - end - @tubes.each do |tube| - asset.facts << create(:fact, predicate: 'contains', object_asset: tube) - end - end - it 'removes all the different studies for this rack when all tubes go out' do - @tubes.first.facts << create(:fact, predicate: 'study_name', object: 'STDY2') - @tubes.each_with_index do |tube, idx| - tube.facts << create(:fact, predicate: 'study_name', object: 'STDY1') unless idx == 0 - end - updates = fact_changes_for_rack_when_unracking_tubes(asset, @tubes) - expect(updates.to_h[:remove_facts].select do |triple| - triple[1]=='study_name' - end.map{|triple| triple[2]}.sort).to eq(['STDY1', 'STDY2']) - end - - it 'removes the purpose when all tubes go out' do - asset.facts << create(:fact, predicate: 'purpose', object: 'DNA Stock Plate') - @tubes.first.facts << create(:fact, predicate: 'aliquotType', object: 'DNA') - updates = fact_changes_for_rack_when_unracking_tubes(asset, @tubes) - expect(updates.to_h[:remove_facts].select do |triple| - triple[1]=='purpose' - end.map{|triple| triple[2]}.sort).to eq(['DNA Stock Plate']) - end - - it 'only returns the studies of the tubes that are going to be removed' do - @tubes.first.facts << create(:fact, predicate: 'study_name', object: 'STDY2') - tubes2 = @tubes.each_with_index.map do |tube, idx| - unless idx == 0 - tube.facts << create(:fact, predicate: 'study_name', object: 'STDY1') - tube - end - end.compact - - updates = fact_changes_for_rack_when_unracking_tubes(asset, tubes2) - expect(updates.to_h[:remove_facts].select do |triple| - triple[1]=='study_name' - end.map{|triple| triple[2]}.sort).to eq(['STDY1']) - end - end - - - describe '#fact_changes_for_rack_when_racking_tubes' do - before do - @tubes = 15.times.map do |line| - create(:asset) - end - end - it 'returns all the different studies for this rack' do - @tubes.first.facts << create(:fact, predicate: 'study_name', object: 'STDY2') - @tubes.each_with_index do |tube, idx| - tube.facts << create(:fact, predicate: 'study_name', object: 'STDY1') unless idx == 0 - end - - updates = fact_changes_for_rack_when_racking_tubes(asset, @tubes) - expect(updates.to_h[:add_facts].select do |triple| - triple[1]=='study_name' - end.map{|triple| triple[2]}.sort).to eq(['STDY1', 'STDY2']) - end - it 'generates the DNA stock plate purpose' do - @tubes.each_with_index do |tube, idx| - tube.facts << create(:fact, predicate: 'aliquotType', object: 'DNA') unless idx == 0 - end - updates = fact_changes_for_rack_when_racking_tubes(asset, @tubes) - expect(updates.to_h[:add_facts].select do |triple| - triple[1]=='purpose' - end.first[2]).to eq('DNA Stock Plate') - end - it 'generates the RNA stock plate purpose' do - @tubes.each_with_index do |tube, idx| - tube.facts << create(:fact, predicate: 'aliquotType', object: 'RNA') unless idx == 0 - end - updates = fact_changes_for_rack_when_racking_tubes(asset, @tubes) - expect(updates.to_h[:add_facts].select do |triple| - triple[1]=='purpose' - end.first[2]).to eq('RNA Stock Plate') - end - end - - describe '#rack_layout' do - before do - csv = CSV.new(File.open('test/data/layout.csv').read).to_a - @tubes = csv.map do |line| - create(:asset, barcode: line[1]) - end - end - let(:method) { :rack_layout } - it_behaves_like('rack_layout') - end - - describe '#rack_layout_creating_tubes' do - let(:method) { :rack_layout_creating_tubes } - it_behaves_like('rack_layout') - end - -end diff --git a/spec/lib/changes_support/callbacks_spec.rb b/spec/lib/changes_support/callbacks_spec.rb new file mode 100644 index 00000000..774c4204 --- /dev/null +++ b/spec/lib/changes_support/callbacks_spec.rb @@ -0,0 +1,61 @@ +require 'rails_helper' + +RSpec.describe 'ChangesSuppport::Callbacks' do + context 'with a FactChanges object' do + before do + FactChanges.clear_all_callbacks! + FactChanges.on_change_predicate('add_facts', 'color', Proc.new{|fact, updates| + spy_instance.my_method(fact, updates) + }) + end + + + let(:updates) { FactChanges.new } + let(:asset) { create :asset } + let(:step) { create :step } + + context 'when I have defined a callback on adding a property' do + + before do + end + context 'when I add a property that matches the condition of my callback' do + before do + updates.add(asset, 'color', 'Red') + end + context 'and then I apply my changes' do + let(:spy_instance) { spy('callback_method')} + + it 'runs the callback defined before' do + updates.apply(step) + expect(spy_instance).to have_received(:my_method).with({ + asset: asset, predicate: 'color', object: 'Red', literal: true}, updates) + end + it 'also runs the callback again if I change using other object' do + updates.apply(step) + updates2 = FactChanges.new + updates2.add(asset, 'color', 'Blue') + updates2.apply(step) + expect(spy_instance).to have_received(:my_method).twice + end + + it 'runs as many times as the event happens' do + updates.add(asset, 'color', 'Green') + updates.add(asset, 'name', 'Hulk') + updates.add(asset, 'is', 'Not happy') + updates.add(asset, 'color', 'Yellow') + updates.add(asset, 'is', 'Angry') + updates.apply(step) + expect(spy_instance).to have_received(:my_method).with({ + asset: asset, predicate: 'color', object: 'Green', literal: true}, updates).exactly(1).times + expect(spy_instance).to have_received(:my_method).with({ + asset: asset, predicate: 'color', object: 'Red', literal: true}, updates).exactly(1).times + expect(spy_instance).to have_received(:my_method).with({ + asset: asset, predicate: 'color', object: 'Yellow', literal: true}, updates).exactly(1).times + expect(spy_instance).to have_received(:my_method).exactly(3).times + + end + end + end + end + end +end diff --git a/spec/lib/fact_changes_initializers_spec.rb b/spec/lib/fact_changes_initializers_spec.rb new file mode 100644 index 00000000..57381112 --- /dev/null +++ b/spec/lib/fact_changes_initializers_spec.rb @@ -0,0 +1,66 @@ +require 'rails_helper' +require 'fact_changes' +require 'fact_changes_initializers' + +RSpec.describe 'FactChangesInitializers' do + + context 'Callbacks' do + before do + FactChanges.clear_all_callbacks! + FactChangesInitializers.setup_changes_callbacks! + end + + let(:updates) { FactChanges.new } + let(:inference) { Step.new } + let(:aliquots) { ['DNA', 'RNA', 'other'] } + let(:rack) { create :tube_rack } + + context 'when changing aliquotType' do + context 'when adding the aliquot type' do + it 'adds the plate purpose' do + aliquots.each do |aliquot| + purpose = FactChangesInitializers::Callbacks.purpose_for_aliquot(aliquot) + updates.add(rack, 'aliquotType', aliquot) + expect{ updates.apply(inference) }.to change{ + Fact.where(asset: rack, predicate: 'purpose', object: purpose).count + }.from(0).to(1) + end + end + end + + context 'when removing the aliquot type' do + it 'removes the plate purpose' do + aliquots.each do |aliquot| + purpose = FactChangesInitializers::Callbacks.purpose_for_aliquot(aliquot) + rack.facts << create(:fact, predicate: 'purpose', object: purpose, literal: true) + rack.facts << create(:fact, predicate: 'aliquotType', object: aliquot, literal: true) + updates.remove_where(rack, 'aliquotType', aliquot) + expect{ updates.apply(inference) }.to change{ + Fact.where(asset: rack, predicate: 'purpose', object: purpose).count + }.from(1).to(0) + end + end + end + end + context 'when changing barcode' do + let(:barcode) {"1234"} + + context 'when adding a barcode fact' do + let(:asset) { create :asset} + + it 'sets the barcode into the barcode column of the asset' do + updates.add(asset, 'barcode', barcode) + expect{updates.apply(inference)}.to change{asset.barcode}.from(nil).to(barcode) + end + end + context 'when removing a barcode fact' do + let(:asset) { create :asset, barcode: barcode} + + it 'removes the barcode from the column of the asset' do + updates.remove_where(asset, 'barcode', barcode) + expect{updates.apply(inference)}.to change{asset.barcode}.from(barcode).to(nil) + end + end + end + end +end diff --git a/spec/lib/fact_changes_spec.rb b/spec/lib/fact_changes_spec.rb index 265dbcda..0651efc4 100644 --- a/spec/lib/fact_changes_spec.rb +++ b/spec/lib/fact_changes_spec.rb @@ -208,6 +208,13 @@ end end describe '#apply' do + context 'when using a changed step' do + it 'will save the step during the transaction' do + changes = FactChanges.new + changes.add(asset1, property, value) + expect{changes.apply(Step.new)}.to change{Step.count}.from(0).to(1) + end + end context 'when the object contains errors' do it 'stores the messages and throws an exception' do updates1.set_errors(["hi"]) @@ -273,6 +280,23 @@ expect(asset1.facts.count).to eq(1) expect(asset1.facts.first.is_remote?).to eq(true) end + context 'when there are more than one value of the previous fact' do + it 'removes the previous facts and adds the new one' do + test1 = create :asset + test2 = create :asset + test3 = create :asset + test4 = create :asset + test1.facts << create(:fact, predicate: relation, object_asset: test2, literal: false) + test1.facts << create(:fact, predicate: relation, object_asset: test3, literal: false) + updates1.replace_remote(test1, relation, test4) + expect{ + updates1.apply(step) + }.to change{test1.facts.count}.by(-1) + .and change{Operation.count}.by(3) + expect(test1.facts.count).to eq(1) + expect(test1.facts.first.is_remote?).to eq(true) + end + end end context 'with remove' do it 'removes an already existing fact' do @@ -621,6 +645,57 @@ end + describe '#add_assets_to_group' do + let(:asset1) { create(:asset) } + let(:asset2) { create(:asset) } + let(:asset_group) { create :asset_group } + let(:updates) { FactChanges.new } + let(:expectancy) { + [{asset_group: asset_group, asset: asset1}, + {asset_group: asset_group, asset: asset2} + ] + } + + it 'add assets to a group' do + expect{ + updates.add_assets_to_group(asset_group, [asset1, asset2]) + }.to change{updates.assets_to_add.to_a}.from([]).to(expectancy) + end + + context 'when receiving an empty list' do + it 'does nothing' do + expect{ + updates.add_assets_to_group(asset_group, []) + }.not_to change{updates.assets_to_add.to_a} + end + end + end + + describe '#remove_assets_from_group' do + let(:list) { 4.times.map{ create(:asset, :with_barcode) } } + let(:asset_group) { create(:asset_group, assets: list) } + let(:updates) { FactChanges.new } + let(:expectancy) { + [{asset_group: asset_group, asset: asset1}, + {asset_group: asset_group, asset: asset2} + ] + } + + it 'remove assets from a group' do + expect{ + updates.remove_assets_from_group(asset_group, [asset1, asset2]) + }.to change{updates.assets_to_remove.to_a}.from([]).to(expectancy) + end + + context 'when receiving an empty list' do + it 'does nothing' do + expect{ + updates.remove_assets_from_group(asset_group, []) + }.not_to change{updates.assets_to_remove.to_a} + end + end + end + describe '#merge' do it 'returns another FactChanges object' do diff --git a/spec/lib/importers/barcodes_importer_spec.rb b/spec/lib/importers/barcodes_importer_spec.rb new file mode 100644 index 00000000..35c38c93 --- /dev/null +++ b/spec/lib/importers/barcodes_importer_spec.rb @@ -0,0 +1,74 @@ +require 'rails_helper' +require 'remote_assets_helper' +require 'importers/barcodes_importer' +require 'fact_changes' + +RSpec.describe Importers::BarcodesImporter do + include RemoteAssetsHelper + let(:barcodes) { 4.times.map{generate(:barcode).to_s}} + let(:remote_assets) { barcodes.map{|barcode| build_remote_tube(barcode: barcode)}} + + before do + stub_client_with_assets(SequencescapeClient, remote_assets) + end + + context '#initialize' do + it 'loads a list of barcodes' do + instance = Importers::BarcodesImporter.new(barcodes) + expect(instance.barcodes).to eq(barcodes) + end + end + context '#process' do + it 'returns a FactChanges instance' do + instance = Importers::BarcodesImporter.new(barcodes) + expect(instance.process.class).to eq(FactChanges) + end + it 'refreshes all barcodes that are remote' do + asset1 = create(:asset, barcode: generate(:barcode), remote_digest: '1234') + barcodes_and_local = [barcodes, asset1.barcode].flatten + instance = Importers::BarcodesImporter.new(barcodes_and_local) + allow(instance).to receive(:refresh_assets) + instance.process + expect(instance).to have_received(:refresh_assets).with([asset1]) + end + it 'imports all barcodes not present in database' do + asset1 = create(:asset, barcode: generate(:barcode), remote_digest: '1234') + barcodes_and_local = [barcodes, asset1.barcode].flatten + instance = Importers::BarcodesImporter.new(barcodes_and_local) + allow(instance).to receive(:import_barcodes) + allow(instance).to receive(:refresh_assets) + instance.process + expect(instance).to have_received(:import_barcodes).with(barcodes) + expect(instance).to have_received(:refresh_assets).with([asset1]) + end + end + + context '#process!' do + it 'creates the new assets' do + instance = Importers::BarcodesImporter.new(barcodes) + expect{ + instance.process! + }.to change{Asset.count}.from(0).to(4) + end + end + + context '#changed_remote?' do + let(:instance) { Importers::BarcodesImporter.new([barcodes.first]) } + let(:remote_asset) { remote_assets.first } + it 'returns false when the asset is not remote' do + plate = create :plate, remote_digest: nil, uuid: remote_asset.uuid, barcode: barcodes.first + expect(instance.changed_remote?(plate)).to be_truthy + end + it 'detects the change when the stored digest is different from the actual' do + plate = create :plate, remote_digest: "1234", uuid: remote_asset.uuid, barcode: barcodes.first + expect(instance.changed_remote?(plate)).to be_truthy + end + it 'does not detect change when stored digest is equal to the actual' do + plate = create :plate, uuid: remote_asset.uuid, barcode: barcodes.first + digest = Importers::Concerns::Annotator.new(plate, remote_asset).digest_for_remote_asset + plate.update_attributes(remote_digest: digest) + expect(instance.changed_remote?(plate)).to be_falsy + end + end + +end diff --git a/spec/lib/importers/concerns/annotator_spec.rb b/spec/lib/importers/concerns/annotator_spec.rb new file mode 100644 index 00000000..328e21bf --- /dev/null +++ b/spec/lib/importers/concerns/annotator_spec.rb @@ -0,0 +1,136 @@ +require 'rails_helper' +require 'remote_assets_helper' +require 'importers/concerns/annotator' + +RSpec.describe 'Importers::Concerns::Annotator' do + include RemoteAssetsHelper + let(:plate) { create :plate } + let(:remote_asset) { build_remote_plate } + let(:barcodes) { ['1', '2']} + let(:instance) { Importers::Concerns::Annotator.new(plate, remote_asset) } + + context '#update_asset_from_remote_asset' do + let(:remote_asset) { build_remote_plate } + + + it 'updates the information from the remote asset into the local asset' do + updates = instance.update_asset_from_remote_asset + expect(updates.to_h[:add_facts].select{|t| t[1]=='a' && t[2]=='Well'}.length).not_to eq(0) + end + end + + context '#update_digest_with_remote' do + it 'updates the digest with the remote asset provided' do + digest = instance.digest_for_remote_asset + updates = instance.update_digest_with_remote + expect(updates.to_h[:add_facts].select{|t| t[1]=='remote_digest'}).to eq([[plate.uuid, 'remote_digest', digest]]) + end + end + + context '#sequencescape_type_for_asset' do + it 'returns the class from the Sequencescape remote asset' do + expect(instance.sequencescape_type_for_asset).to eq('Plate') + end + end + + context '#is_not_a_sample_tube?' do + let(:remote_tube) { build_remote_tube } + it 'returns false if the element is a sample tube' do + instance = Importers::Concerns::Annotator.new(plate, remote_tube) + expect(instance.is_not_a_sample_tube?).to be_falsy + end + it 'returns true if the element is not a sample Tube' do + instance = Importers::Concerns::Annotator.new(plate, remote_asset) + expect(instance.is_not_a_sample_tube?).to be_truthy + end + end + + context '#annotate_wells' do + let(:plate) { create :plate } + + it 'replicates wells information from the remote asset into the local plate' do + updates = instance.annotate_wells(plate, remote_asset) + expect(updates.to_h[:create_assets]).not_to be_nil + expect(updates.to_h[:create_assets]).to eq(remote_asset.wells.map(&:uuid)) + wells_defs = updates.to_h[:add_facts].select{|t| t[1]=='a' && t[2] == 'Well'} + expect(wells_defs.count).to eq(remote_asset.wells.count) + end + + it 'does not create new wells if they already exist in local' do + remote_asset.wells.each do |w| + create :asset, uuid: w.uuid + end + updates = instance.annotate_wells(plate, remote_asset) + expect(updates.to_h[:create_assets]).to be_nil + end + + it 'removes any remote wells not present anymore in the remote asset' do + well1 = create :well + plate.facts << create(:fact, predicate: 'contains', object_asset: well1, is_remote?: true, literal: false) + updates = instance.annotate_wells(plate, remote_asset) + expect(updates.to_h[:remove_facts]).to include([plate.uuid, 'contains', well1.uuid]) + end + + it 'does not remove any well that is not remote' do + well1 = create :well + plate.facts << create(:fact, predicate: 'contains', object_asset: well1, is_remote?: false, literal: false) + updates = instance.annotate_wells(plate, remote_asset) + expect(updates.to_h[:remove_facts]).to be_nil + end + + it 'does not remove old local facts not present in the well info' do + well1 = create :well, uuid: remote_asset.wells.first.uuid + well1.facts << create(:fact, predicate: 'speed', object: 'quick', literal: true, is_remote?: false) + updates = instance.annotate_wells(plate, remote_asset) + expect(updates.to_h[:remove_facts]).to be_nil + end + + it 'removes old remote facts not present anymore in the new well info' do + well1 = create :well, uuid: remote_asset.wells.first.uuid + well1.facts << create(:fact, predicate: 'speed', object: 'quick', literal: true, is_remote?: true) + updates = instance.annotate_wells(plate, remote_asset) + expect(updates.to_h[:remove_facts]).to include([well1.uuid, 'speed', 'quick']) + end + end + + context '#annotate_study_name' do + context 'when it is a plate' do + let(:plate) { create :plate } + it 'calls annotate_study_name_from_aliquots for each well' do + allow(instance).to receive(:annotate_study_name_from_aliquots) + instance.annotate_study_name(plate, remote_asset) + expect(instance).to have_received(:annotate_study_name_from_aliquots).exactly(remote_asset.wells.count) + end + end + context 'when it is not a plate' do + let(:remote_asset) { build_remote_tube } + let(:tube) { create :tube } + it 'calls annotate_study_name_from_aliquots once' do + allow(instance).to receive(:annotate_study_name_from_aliquots) + instance.annotate_study_name(tube, remote_asset) + expect(instance).to have_received(:annotate_study_name_from_aliquots).once + end + end + end + + context '#annotate_study_name_from_aliquots' do + let(:remote_asset) { build_remote_tube } + let(:tube) { create :tube } + + it 'annotates the study information in the asset' do + updates = instance.annotate_study_name_from_aliquots(tube, remote_asset) + expect(updates.to_h[:add_facts].select{|t| t[1]=='study_uuid'}.length).not_to eq(0) + end + end + + context '#annotate_container' do + let(:remote_asset) { build_remote_tube } + let(:tube) { create :tube } + + it 'annotates the container information in the asset' do + updates = instance.annotate_container(tube, remote_asset) + expect(updates.to_h[:add_facts].select{|t| t[1]=='sample_uuid'}.length).not_to eq(0) + end + end + +end diff --git a/spec/lib/importers/concerns/changes_spec.rb b/spec/lib/importers/concerns/changes_spec.rb new file mode 100644 index 00000000..2984b6a0 --- /dev/null +++ b/spec/lib/importers/concerns/changes_spec.rb @@ -0,0 +1,72 @@ +require 'rails_helper' +require 'remote_assets_helper' +require 'importers/barcodes_importer' + +RSpec.describe 'Importers::Concerns::Changes' do + include RemoteAssetsHelper + context '#refresh_assets' do + let(:barcodes) { []} + let(:instance) { Importers::BarcodesImporter.new(barcodes) } + let(:uuids) { assets.map(&:uuid) } + let(:assets) { [ create(:plate), create(:tube), create(:plate), create(:well)]} + let(:remote_assets) {[build_remote_plate, build_remote_tube, build_remote_plate, build_remote_well('B1')]} + + before do + assets.zip(remote_assets) do |a, remote| + allow(remote).to receive(:uuid).and_return(a.uuid) + end + allow(SequencescapeClient).to receive(:find_by_uuid).with(assets.map(&:uuid)).and_return(remote_assets) + end + + it 'refreshes the contents of the assets' do + updates = instance.refresh_assets(assets) + expect(updates.to_h[:add_facts].detect{|t|t[1]=='sample_uuid'}).not_to be_nil + expect(updates.to_h[:add_facts].map{|t| t[0]}.uniq).to include(*uuids) + end + + context 'when receiving an empty list' do + it 'does nothing' do + updates = instance.refresh_assets([]) + expect(updates.to_h).to eq({}) + end + end + end + + context '#import_barcodes' do + let(:instance) { Importers::BarcodesImporter.new(barcodes) } + + let(:remote_assets) { + [ + build_remote_tube(barcode_objs[0]), + build_remote_plate(barcode_objs[1]), + build_remote_tube(barcode_objs[2]), + build_remote_plate(barcode_objs[3]) + ] + } + let(:uuids) { remote_assets.map(&:uuid) } + let(:barcode_objs) { + 4.times.map { {labware_barcode: {'human_barcode' => generate(:barcode)}} } + } + let(:barcodes) { + remote_assets.map{|a| a.labware_barcode['human_barcode']} + } + + before do + allow(SequencescapeClient).to receive(:get_remote_asset).with(barcodes).and_return(remote_assets) + end + + it 'imports the assets' do + updates = instance.import_barcodes(barcodes) + expect(updates.to_h[:add_facts].detect{|t|t[1]=='sample_uuid'}).not_to be_nil + expect(updates.to_h[:create_assets]).to include(*uuids) + end + + context 'when receiving an empty list' do + it 'does nothing' do + updates = instance.import_barcodes([]) + expect(updates.to_h).to eq({}) + end + end + + end +end diff --git a/spec/lib/importers/concerns/remote_digest_spec.rb b/spec/lib/importers/concerns/remote_digest_spec.rb new file mode 100644 index 00000000..978abe0a --- /dev/null +++ b/spec/lib/importers/concerns/remote_digest_spec.rb @@ -0,0 +1,34 @@ +require 'rails_helper' +require 'remote_assets_helper' +require 'importers/concerns/annotator' + +RSpec.describe 'Importers::Concerns::RemoteDigest' do + include RemoteAssetsHelper + + let(:remote_asset) { build_remote_plate } + let(:asset) { create :asset } + let(:instance) { Importers::Concerns::Annotator.new(asset, remote_asset) } + + context '#digest_for_remote_asset' do + it 'returns a string with the digest hash of the remote asset' do + expect(instance.digest_for_remote_asset.kind_of?(String)).to be_truthy + end + end + + context '#signature_for_remote' do + it 'returns a string' do + expect(instance.signature_for_remote.kind_of?(String)).to be_truthy + end + end + + context '#has_changes_between_local_and_remote?' do + it 'returns true if there are changes' do + expect(instance.has_changes_between_local_and_remote?).to be_truthy + end + it 'returns false if there are no changes' do + asset.update_attributes(remote_digest: instance.digest_for_remote_asset) + expect(instance.has_changes_between_local_and_remote?).to be_falsy + end + end + +end diff --git a/spec/lib/message_processors/activity_message_processor_spec.rb b/spec/lib/message_processors/activity_message_processor_spec.rb new file mode 100644 index 00000000..0ed98648 --- /dev/null +++ b/spec/lib/message_processors/activity_message_processor_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' +require 'message_processors/activity_message_processor' + +RSpec.describe MessageProcessors::ActivityMessageProcessor do + context 'an instance of ActivityMessageProcessor' do + let(:activity) { create(:activity)} + let(:good_message) { { activity: { id: activity.id, stepTypes: false, + stepsPending: false, stepsRunning: false, stepsFailed: false, stepsFinished: true + } + }.as_json + } + let(:bad_message) { { asset_group: {} } } + let(:mocked_redis) { double('redis') } + let(:channel) { double('channel', redis: mocked_redis )} + let(:instance) { MessageProcessors::ActivityMessageProcessor.new(channel: channel)} + + context '#interested_in?' do + it 'returns true if is an activity message' do + expect(instance.interested_in?(good_message)).to be_truthy + end + it 'returns false if is not an activity message' do + expect(instance.interested_in?(bad_message)).to be_falsy + end + end + context '#process' do + it 'updates the configuration of elements to generate for each server message' do + allow(channel.redis).to receive(:hget).and_return(nil) + allow(channel.redis).to receive(:hset) + allow(channel).to receive(:params).and_return({activity_id: activity.id}) + instance.process(good_message) + expect(mocked_redis).to have_received(:hset).with('activities', activity.id, + good_message['activity'].except('id').to_json) + end + end + end +end diff --git a/spec/lib/message_processors/asset_group_message_processor_spec.rb b/spec/lib/message_processors/asset_group_message_processor_spec.rb new file mode 100644 index 00000000..ebdc40f1 --- /dev/null +++ b/spec/lib/message_processors/asset_group_message_processor_spec.rb @@ -0,0 +1,45 @@ +require 'rails_helper' +require 'message_processors/asset_group_message_processor' + +RSpec.describe MessageProcessors::AssetGroupMessageProcessor do + context 'an instance of AssetGroupMessageProcessor' do + let(:channel) { double('channel')} + let(:barcodes) { 2.times.map{create(:tube, :with_barcode) }.map(&:barcode) } + let(:asset_group) { create(:asset_group)} + let(:good_message) { { asset_group: { id: asset_group.id, assets: barcodes }}.as_json} + let(:bad_message) { { asset_group: {} } } + let(:instance) { MessageProcessors::AssetGroupMessageProcessor.new(channel: channel)} + + before do + allow(SequencescapeClient).to receive(:find_by_uuid).and_return(nil) + allow(SequencescapeClient).to receive(:get_remote_asset).and_return(nil) + end + context '#interested_in?' do + it 'returns true if is an asset_group message' do + expect(instance.interested_in?(good_message)).to be_truthy + end + it 'returns false if is not an asset_group message' do + expect(instance.interested_in?(bad_message)).to be_falsy + end + end + context '#process' do + context 'when receiving a new group of barcodes inside an asset group' do + let(:added) { 2.times.map{create(:tube, :with_barcode) } } + let(:removed) { 2.times.map{create(:tube, :with_barcode) } } + let(:kept) { 2.times.map{create(:tube, :with_barcode) } } + let(:new_list) {[kept, added].flatten} + let(:previous_list) { [removed, kept].flatten} + let(:assets) { new_list } + let(:asset_group) {create(:asset_group, assets: previous_list) } + let(:barcodes) { assets.map(&:barcode) } + + it 'updates the contents of the group' do + expect{instance.process(good_message)}.to change{ + asset_group.assets.reload + asset_group.assets.map(&:barcode) + }.from(previous_list.map(&:barcode)).to(new_list.map(&:barcode)) + end + end + end + end +end diff --git a/spec/lib/parsers/csv_layout/assets_cache_spec.rb b/spec/lib/parsers/csv_layout/assets_cache_spec.rb new file mode 100644 index 00000000..357729d8 --- /dev/null +++ b/spec/lib/parsers/csv_layout/assets_cache_spec.rb @@ -0,0 +1,17 @@ +require 'rails_helper' +require 'parsers/csv_layout/csv_parser' + +RSpec.describe 'Parsers::CsvLayout::AssetsCache' do + let(:content) { File.open('test/data/layout.csv').read } + let(:parser) { Parsers::CsvLayout::CsvParser.new(content) } + let(:csv_parsed) { CSV.new(content).to_a } + let!(:tubes) { csv_parsed.map{|line| create(:asset, barcode: line[1]) } } + + before do + allow(Asset).to receive(:find_or_import_assets_with_barcodes).with(tubes.map(&:barcode)).and_return(tubes) + end + it 'performs a single request with all barcodes in the file' do + parser.parse + expect(Asset).to have_received(:find_or_import_assets_with_barcodes).with(tubes.map(&:barcode)).once + end +end diff --git a/spec/lib/parsers/csv_layout/barcode_creatable_parser_spec.rb b/spec/lib/parsers/csv_layout/barcode_creatable_parser_spec.rb index b45b477a..8db83082 100644 --- a/spec/lib/parsers/csv_layout/barcode_creatable_parser_spec.rb +++ b/spec/lib/parsers/csv_layout/barcode_creatable_parser_spec.rb @@ -5,13 +5,11 @@ RSpec.describe Parsers::CsvLayout::BarcodeCreatableParser do - before do - allow(Asset).to receive(:find_or_import_asset_with_barcode) do |barcode| - Asset.find_by(barcode: barcode) - end - end let(:main_parser) { main = double('parser') + allow(main).to receive(:get_asset_for_barcode) do |barcode| + Asset.find_by(barcode: barcode) + end allow(main).to receive(:add_error) allow(main).to receive(:parsed_changes).and_return(FactChanges.new) allow(main).to receive(:components).and_return({ diff --git a/spec/lib/parsers/csv_layout/barcode_parser_spec.rb b/spec/lib/parsers/csv_layout/barcode_parser_spec.rb index 762dcb5d..6705a136 100644 --- a/spec/lib/parsers/csv_layout/barcode_parser_spec.rb +++ b/spec/lib/parsers/csv_layout/barcode_parser_spec.rb @@ -5,13 +5,11 @@ RSpec.describe Parsers::CsvLayout::BarcodeParser do - before do - allow(Asset).to receive(:find_or_import_asset_with_barcode) do |barcode| - Asset.find_by(barcode: barcode) - end - end let(:main_parser) { main = double('parser') + allow(main).to receive(:get_asset_for_barcode) do |barcode| + Asset.find_by(barcode: barcode) + end allow(main).to receive(:add_error) allow(main).to receive(:components).and_return({ barcode_validator: ValidatorSuccess diff --git a/spec/lib/parsers/csv_layout/csv_parser_spec.rb b/spec/lib/parsers/csv_layout/csv_parser_spec.rb index df78b933..2a3dd7a2 100644 --- a/spec/lib/parsers/csv_layout/csv_parser_spec.rb +++ b/spec/lib/parsers/csv_layout/csv_parser_spec.rb @@ -18,8 +18,8 @@ asset_group: asset_group, step_type: step_type } setup do - allow(Asset).to receive(:find_or_import_asset_with_barcode) do |barcode| - Asset.find_by(barcode: barcode) + allow(Asset).to receive(:find_or_import_assets_with_barcodes) do |barcodes| + barcodes.map{|barcode| Asset.find_by(barcode: barcode) } end @content = File.open('test/data/layout.csv').read diff --git a/spec/lib/parsers/csv_layout/line_parser_spec.rb b/spec/lib/parsers/csv_layout/line_parser_spec.rb index a9cd3d14..47d2f81f 100644 --- a/spec/lib/parsers/csv_layout/line_parser_spec.rb +++ b/spec/lib/parsers/csv_layout/line_parser_spec.rb @@ -9,6 +9,11 @@ let(:main_parser) { main = double('parser') + + allow(main).to receive(:get_asset_for_barcode) do |barcode| + Asset.find_by(barcode: barcode) + end + allow(main).to receive(:components).and_return({ location_validator: Parsers::CsvLayout::Validators::LocationValidator, barcode_validator: Parsers::CsvLayout::Validators::AnyBarcodeValidator, @@ -27,9 +32,6 @@ before do @asset1 = create :asset, barcode: 'F1234' @asset2 = create :asset, barcode: 'F5678' - allow(Asset).to receive(:find_or_import_asset_with_barcode) do |barcode| - Asset.find_by(barcode: barcode) - end end context '#initialize' do diff --git a/spec/lib/sequencescape_client_spec.rb b/spec/lib/sequencescape_client_spec.rb new file mode 100644 index 00000000..ffea24a4 --- /dev/null +++ b/spec/lib/sequencescape_client_spec.rb @@ -0,0 +1,101 @@ +require 'rails_helper' +require 'sequencescape_client' +require 'remote_assets_helper' + +RSpec.describe 'SequencescapeClient' do + include RemoteAssetsHelper + context '#get_remote_asset' do + context 'when asked for a list of asset uuids' do + + let(:assets) { + [ + build_remote_tube(barcode_objs[0]), + build_remote_plate(barcode_objs[1]), + build_remote_tube(barcode_objs[2]), + build_remote_plate(barcode_objs[3]) + ] + } + let(:barcode_objs) { + 4.times.map { {labware_barcode: {'human_barcode' => generate(:barcode)}} } + } + let(:barcodes) { + assets.map{|a| a.labware_barcode['human_barcode']} + } + let(:params) { {barcode: barcodes}} + before do + allow(SequencescapeClientV2::Plate).to receive(:where).with(params).and_return([assets[1], assets[3]]) + allow(SequencescapeClientV2::Tube).to receive(:where).with(params).and_return([assets[0], assets[2]]) + end + + it 'returns the matched elements in response sorted in the same order of the query' do + expect(SequencescapeClient.get_remote_asset(barcodes)).to eq(assets) + end + end + end + + context '#find_by_uuid' do + context 'when asked for a list of asset uuids' do + let(:assets) { + [create(:tube), create(:plate), create(:tube), create(:well)] + } + let(:uuids) { assets.map(&:uuid)} + let(:params) { {uuid: uuids}} + before do + allow(SequencescapeClientV2::Plate).to receive(:where).with(params).and_return([assets[1]]) + allow(SequencescapeClientV2::Tube).to receive(:where).with(params).and_return([assets[0], assets[2]]) + allow(SequencescapeClientV2::Well).to receive(:where).with(params).and_return([assets[3]]) + end + + it 'returns the matched elements in response sorted in the same order of the query' do + expect(SequencescapeClient.find_by_uuid(uuids)).to eq(assets) + end + end + end + + context '#find_by' do + let(:assets) { 3.times.map{ create(:asset) }} + let(:uuids) { assets.map(&:uuid) } + let(:params) { { uuid: uuids } } + let(:tube_resource) { double('tube_resource')} + let(:plate_resource) { double('plate_resource')} + let(:well_resource) { double('well_resource')} + let(:resources) { [plate_resource, tube_resource, well_resource]} + + before do + allow(tube_resource).to receive(:where).with(params).and_return(assets) + allow(plate_resource).to receive(:where) + allow(well_resource).to receive(:where) + end + + it 'performs one request for each asset to match all possible elements' do + expect(SequencescapeClient.find_by(resources, params)).to eq(assets) + expect(tube_resource).to have_received(:where).with(params) + expect(plate_resource).to have_received(:where).with(params) + expect(well_resource).to have_received(:where).with(params) + end + end + + context '#find_first' do + let(:asset) { create :tube } + let(:params) { { uuid: asset.uuid } } + + let(:tube_resource) { double('tube_resource')} + let(:plate_resource) { double('plate_resource')} + let(:well_resource) { double('well_resource')} + let(:resources) { [plate_resource, tube_resource, well_resource]} + + before do + allow(plate_resource).to receive(:where) + allow(tube_resource).to receive(:where).with(params).and_return([asset]) + allow(well_resource).to receive(:where) + end + + it 'stops performing subsequente requests when the element is found' do + expect(SequencescapeClient.find_first(resources, params)).to eq(asset) + expect(plate_resource).to have_received(:where).with(params) + expect(tube_resource).to have_received(:where).with(params) + expect(well_resource).not_to have_received(:where).with(params) + end + end + +end diff --git a/spec/models/asset_group_spec.rb b/spec/models/asset_group_spec.rb index 8164ca73..194135e6 100644 --- a/spec/models/asset_group_spec.rb +++ b/spec/models/asset_group_spec.rb @@ -1,26 +1,47 @@ require 'rails_helper' +require 'remote_assets_helper' RSpec.describe AssetGroup, type: :model do + include RemoteAssetsHelper + context '#update_with_assets' do - let(:existing_assets) { 3.times.map{ create :asset }} - let(:new_assets) { 2.times.map { create :asset }} + let(:remote_existing_assets) { 3.times.map{build_remote_tube}} + let(:existing_assets) { + remote_existing_assets.count.times.map{|i| + create(:asset, uuid: remote_existing_assets[i].uuid) + } + } + let(:remote_new_assets) { + 2.times.map { build_remote_tube } + } + let(:new_assets) { + remote_new_assets.count.times.map{|i| + create(:asset, uuid: remote_new_assets[i].uuid) + } + } let(:group) { create(:asset_group, assets: existing_assets)} - before do - allow(group).to receive(:refresh!).and_return(true) - end it 'adds new assets to the group' do + asset_list = [].concat(existing_assets).concat(new_assets) + stub_client_with_assets(SequencescapeClient, remote_new_assets) expect { - group.update_with_assets(existing_assets.concat(new_assets)) - }.to change{Operation.count}.by(2).and change{group.assets.count}.by(2) + group.update_with_assets(asset_list) + }.to change{Operation.count}.and change{group.assets.count}.by(2) end it 'removes assets not present anymore in the group' do + stub_client_with_assets(SequencescapeClient, remote_new_assets) expect { group.update_with_assets(new_assets) - }.to change{Operation.count}.by(5).and change{group.assets.count}.by(-1) + }.to change{Operation.count}.and change{group.assets.count}.by(-1) end it 'refreshes the new added assets' do - group.update_with_assets(existing_assets.concat(new_assets)) - expect(group).to have_received(:refresh!) + asset_list = [].concat(existing_assets).concat(new_assets) + remotes = [].concat(remote_existing_assets).concat(remote_new_assets) + stub_client_with_assets(SequencescapeClient, remote_new_assets) + expect{ + group.update_with_assets(asset_list) + }.to change{ + new_assets.first.operations.count + } end end end diff --git a/spec/models/asset_spec.rb b/spec/models/asset_spec.rb index d110bbb3..54646731 100644 --- a/spec/models/asset_spec.rb +++ b/spec/models/asset_spec.rb @@ -1,5 +1,13 @@ require 'rails_helper' RSpec.describe Asset do + context 'SCOPE ::from_remote_service' do + it 'filters to select only remote assets that are up to date with Sequencescape' do + seq1 = create(:plate, remote_digest: '1') + seq2 = create(:plate) + seq3 = create(:plate, remote_digest: '2') + expect(Asset.from_remote_service).to eq([seq1, seq3]) + end + end context '#has_wells?' do it 'returns true when it is a plate with wells' do plate = create(:asset) diff --git a/spec/models/assets/export_spec.rb b/spec/models/assets/export_spec.rb index 33c6781f..73fdf9dc 100644 --- a/spec/models/assets/export_spec.rb +++ b/spec/models/assets/export_spec.rb @@ -110,7 +110,10 @@ allow(SequencescapeClient).to receive(:version_1_find_by_uuid).with(asset.uuid).and_return(nil) allow(SequencescapeClient).to receive(:version_1_find_by_uuid).with(plate.uuid).and_return(plate) allow(SequencescapeClient).to receive(:find_by_uuid).with(asset.uuid).and_return(nil) - allow(SequencescapeClient).to receive(:find_by_uuid).with(plate.uuid).and_return(plate) + allow(SequencescapeClient).to receive(:find_by_uuid).with([asset.uuid]).and_return(nil) + + stub_client_with_asset(SequencescapeClient, plate) + allow(SequencescapeClient).to receive(:create_plate).and_return(plate) barcode = double('barcode') allow(barcode).to receive(:prefix).and_return('DN') diff --git a/spec/models/assets/import_spec.rb b/spec/models/assets/import_spec.rb index 9d58f2a2..db1f4ebd 100644 --- a/spec/models/assets/import_spec.rb +++ b/spec/models/assets/import_spec.rb @@ -6,70 +6,55 @@ context '#refresh!' do - let(:asset) { create :asset } + let(:asset) { create :asset, uuid: uuid, remote_digest: digest } let(:plate) { build_remote_plate } - + let(:digest) { nil } before do - allow(asset).to receive(:_process_refresh) - allow(SequencescapeClient).to receive(:find_by_uuid).and_return(true) + stub_client_with_asset(SequencescapeClient, plate) end context 'when it is not a remote asset' do - before do - allow(asset).to receive(:is_remote_asset?).and_return(false) - end - + let(:uuid) { SecureRandom.uuid } it 'does not refresh' do - asset.refresh! - expect(asset).not_to have_received(:_process_refresh) + allow(SequencescapeClient).to receive(:get_remote_asset).with([uuid]).and_return(nil) + expect{asset.refresh!}.not_to change{asset.facts.count} end end context 'when it is a remote asset' do - before do - allow(asset).to receive(:is_remote_asset?).and_return(true) - end + let(:uuid) { plate.uuid } + let(:digest) { 'initial_digest' } + context 'when the asset has changed' do - before do - allow(asset).to receive(:changed_remote?).and_return(true) - end it 'refreshes the asset' do - asset.refresh! - expect(asset).to have_received(:_process_refresh) + expect{asset.refresh!}.to change{asset.facts.count} end end context 'when the asset has not changed' do - before do - allow(asset).to receive(:changed_remote?).and_return(false) - end it 'refreshes the asset' do - asset.refresh! - expect(asset).to have_received(:_process_refresh) + asset.facts << create(:fact, predicate: 'a', object: 'TubeRack', is_remote?: true) + expect{asset.refresh!}.to change{asset.facts.count} end end end end context '#refresh' do - let(:asset) { create :asset } + let(:digest) { 'initial_digest' } + let(:asset) { create :asset, uuid: plate.uuid, remote_digest: digest } let(:plate) { build_remote_plate } before do - allow(SequencescapeClient).to receive(:find_by_uuid).and_return(true) - allow(asset).to receive(:changed_remote?).and_return(false) + stub_client_with_asset(SequencescapeClient, plate) end it 'recognises a plate' do asset.facts << create(:fact, predicate: 'a', object: 'TubeRack', is_remote?: true) asset.refresh - expect(SequencescapeClient).to have_received(:find_by_uuid).with(asset.uuid) + expect(SequencescapeClient).to have_received(:find_by_uuid).with([asset.uuid]) end it 'recognises a tube' do asset.facts << create(:fact, predicate: 'a', object: 'Tube', is_remote?: true) asset.refresh - expect(SequencescapeClient).to have_received(:find_by_uuid).with(asset.uuid) + expect(SequencescapeClient).to have_received(:find_by_uuid).with([asset.uuid]) end context 'when actually updating' do - before do - allow(SequencescapeClient).to receive(:find_by_uuid).and_return(plate) - allow(asset).to receive(:changed_remote?).and_return(true) - end it 'does not destroy remote facts that have not changed' do fact = create(:fact, predicate: 'a', object: 'Plate', is_remote?: true) asset.facts << fact @@ -85,11 +70,11 @@ expect(asset.facts.with_predicate('a').first.object).to eq('Plate') end it 'does not destroy local facts' do - fact = create(:fact, predicate: 'is', object: 'Red', is_remote?: false) + fact = create(:fact, predicate: 'color', object: 'Red', is_remote?: false) asset.facts << fact asset.refresh expect{fact.reload}.not_to raise_error - expect(asset.facts.with_predicate('is').first.object).to eq('Red') + expect(asset.facts.with_predicate('color').first.object).to eq('Red') end it 'does not destroy the assets linked by remote facts' do asset2 = create(:asset) @@ -142,6 +127,7 @@ setup do @barcode_plate = "1" @asset = Asset.create!(barcode: @barcode_plate) + allow(SequencescapeClient).to receive(:get_remote_asset).and_return(nil) end it 'should return the local asset when looking by its barcode' do expect(Asset.find_or_import_asset_with_barcode(@barcode_plate)).to eq(@asset) @@ -167,7 +153,7 @@ end it 'should try to obtain a tube' do @asset = Asset.find_or_import_asset_with_barcode(@remote_tube_asset.barcode) - expect(SequencescapeClient).to have_received(:find_by_uuid).with(@remote_tube_asset.uuid) + expect(SequencescapeClient).to have_received(:get_remote_asset).with([@remote_tube_asset.barcode]) end end @@ -178,7 +164,7 @@ end it 'should try to obtain a plate' do @asset = Asset.find_or_import_asset_with_barcode(@remote_plate_asset.barcode) - expect(SequencescapeClient).to have_received(:find_by_uuid).with(@remote_plate_asset.uuid) + expect(SequencescapeClient).to have_received(:get_remote_asset).with([@remote_plate_asset.barcode]) end context 'when the supplier sample name has not been provided to some samples' do @@ -326,16 +312,18 @@ context 'when the local copy is out of date' do before do @asset.update_attributes(remote_digest: 'RANDOM') + assetchanged2 = create :asset + @fact_changed2 = create(:fact, predicate: 'contains', object_asset: assetchanged2, is_remote?: true, literal: false) + @asset.facts << @fact_changed2 @fact_changed = @asset.facts.from_remote_asset.where(predicate: 'contains').first - @well_changed = create :asset - @dependant_fact = create :fact, predicate: 'some', object: 'Moredata', is_remote?: true + @well_changed = @fact_changed.object_asset + @dependant_fact = create :fact, predicate: 'some', object: 'Moredata', is_remote?: true, literal: true @well_changed.facts << @dependant_fact - @fact_changed.update_attributes(object_asset_id: @well_changed.id) end it 'should destroy any remote facts that has changed' do Asset.find_or_import_asset_with_barcode(@barcode_plate) - expect{@fact_changed.reload}.to raise_exception ActiveRecord::RecordNotFound + expect{@fact_changed2.reload}.to raise_exception ActiveRecord::RecordNotFound end it 'should destroy any contains dependant remote facts' do diff --git a/spec/models/kit_spec.rb b/spec/models/kit_spec.rb new file mode 100644 index 00000000..f7afd486 --- /dev/null +++ b/spec/models/kit_spec.rb @@ -0,0 +1,3 @@ +require 'rails_helper' +RSpec.describe Kit, type: :model do +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 1d9a0fd9..a0764cbf 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -61,4 +61,5 @@ # arbitrary gems may also be filtered via: # config.filter_gems_from_backtrace("gem name") + config.filter_run_excluding browser: true end diff --git a/spec/remote_assets_helper.rb b/spec/remote_assets_helper.rb index a28f7f26..6701e812 100644 --- a/spec/remote_assets_helper.rb +++ b/spec/remote_assets_helper.rb @@ -16,7 +16,15 @@ def build_remote_plate(opts = {}) end def build_remote_well(location, opts={}) - double('well', {aliquots: [build_remote_aliquot], location: location, position: { "name" => location }, uuid: SecureRandom.uuid}.merge(opts)) + obj = { + type: 'wells', + aliquots: [build_remote_aliquot], location: location, + position: { "name" => location }, uuid: SecureRandom.uuid + }.merge(opts) + well=double('well', obj) + allow(well).to receive(:attributes).and_return(obj) + allow(well).to receive(:class).and_return(Sequencescape::Well) + well end def build_remote_tube(opts = {}) @@ -60,12 +68,25 @@ def build_remote_sample(opts={}) sample end - def stub_client_with_asset(double, asset) + def stub_client_with_asset(client, asset) type = (asset.class==Sequencescape::Plate) ? :plate : :tube - allow(double).to receive(:find_by_uuid).with(asset.uuid).and_return(asset) - allow(double).to receive(:get_remote_asset) { nil } - allow(double).to receive(:get_remote_asset).with(asset.barcode).and_return(asset) - allow(double).to receive(:get_remote_asset).with(asset.uuid).and_return(asset) + allow(client).to receive(:find_by_uuid).with(asset.uuid).and_return(asset) + allow(client).to receive(:find_by_uuid).with([asset.uuid]).and_return([asset]) + allow(client).to receive(:get_remote_asset).with(asset.uuid).and_return(asset) + allow(client).to receive(:get_remote_asset).with([asset.uuid]).and_return([asset]) + if asset.respond_to?(:barcode) + allow(client).to receive(:get_remote_asset).with(asset.barcode).and_return(asset) + allow(client).to receive(:get_remote_asset).with([asset.barcode]).and_return([asset]) + end + end + + def stub_client_with_assets(client, assets) + assets.each {|asset| stub_client_with_asset(client, asset) } + if (assets.first.respond_to?(:barcode)) + allow(client).to receive(:get_remote_asset).with(assets.map(&:barcode)).and_return(assets) + end + allow(client).to receive(:get_remote_asset).with(assets.map(&:uuid)).and_return(assets) + allow(client).to receive(:find_by_uuid).with(assets.map(&:uuid)).and_return(assets) end end diff --git a/spec/script/runners/move_barcodes_from_tube_rack_to_plate_spec.rb b/spec/script/runners/move_barcodes_from_tube_rack_to_plate_spec.rb new file mode 100644 index 00000000..1fc2776a --- /dev/null +++ b/spec/script/runners/move_barcodes_from_tube_rack_to_plate_spec.rb @@ -0,0 +1,85 @@ +require 'rails_helper' + +require Rails.root.to_s+'/script/runners/move_barcodes_from_tube_rack_to_plate' + +RSpec.describe 'MoveBarcodesFromTubeRackToPlate' do + NUM_WELLS = 3 + + let(:activity) { create :activity } + let(:step) { create :step, activity: activity, state: Step::STATE_RUNNING } + + let(:barcodes) { + NUM_WELLS.times.map{|i| "FR00#{i}"} + } + let(:padded_locations) { + NUM_WELLS.times.map{|i| "A0#{i}"} + } + + let(:locations) { + NUM_WELLS.times.map{|i| "A#{i}"} + } + let(:wells_for_rack) { + NUM_WELLS.times.map do |i| + asset = create(:asset, barcode: barcodes[i]) + asset.facts << create(:fact, predicate: 'a', object: 'Tube') + asset.facts << create(:fact, predicate: 'location', object: padded_locations[i]) + asset + end + } + let(:wells_for_plate) { + NUM_WELLS.times.map do |i| + asset = create(:asset) + asset.facts << create(:fact, predicate: 'a', object: 'Well') + asset.facts << create(:fact, predicate: 'location', object: locations[i]) + asset + end + } + let(:tube_rack) { + asset = create :asset + asset.facts << create(:fact, predicate: 'a', object: 'TubeRack') + asset.facts << wells_for_rack.map{|a| create(:fact, predicate: 'contains', object_asset: a)} + asset + } + let(:plate) { + asset = create :asset + asset.facts << create(:fact, predicate: 'a', object: 'Plate') + asset.facts << wells_for_plate.map{|a| create(:fact, predicate: 'contains', object_asset: a)} + asset + } + + context 'when run with a tube rack and a plate' do + it 'adds the barcodes of the tube rack into the wells of the plate' do + group = create(:asset_group, assets: [plate, tube_rack]) + updates = MoveBarcodesFromTubeRackToPlate.new(asset_group: group).process + changes = updates.to_h + + expect(changes[:add_facts].select{|t| t[1] == 'barcode'}.count).to eq(NUM_WELLS) + + wells_for_plate.each_with_index do |w, pos| + expect(changes[:add_facts]).to include( + [w.uuid, 'barcode', barcodes[pos]]) + end + expect{ + updates.apply(step) + wells_for_plate.each(&:reload) + }.to change{wells_for_plate.first.barcode}.from(nil).to(barcodes.first) + end + it 'removes the barcodes from the tubes of the tube rack' do + group = create(:asset_group, assets: [plate, tube_rack]) + updates = MoveBarcodesFromTubeRackToPlate.new(asset_group: group).process + changes = updates.to_h + + expect(changes[:remove_facts].select{|t| t[1] == 'barcode'}.count).to eq(NUM_WELLS) + + wells_for_rack.each_with_index do |w, pos| + expect(changes[:remove_facts]).to include( + [w.uuid, 'barcode', barcodes[pos]]) + end + expect{ + updates.apply(step) + wells_for_rack.each(&:reload) + }.to change{wells_for_rack.first.barcode}.from(barcodes.first).to(nil) + end + + end +end diff --git a/spec/script/runners/remove_barcodes_from_tubes_spec.rb b/spec/script/runners/remove_barcodes_from_tubes_spec.rb new file mode 100644 index 00000000..a7a5ba49 --- /dev/null +++ b/spec/script/runners/remove_barcodes_from_tubes_spec.rb @@ -0,0 +1,54 @@ +require 'rails_helper' + +require Rails.root.to_s+'/script/runners/remove_barcodes_from_tubes' + +RSpec.describe 'RemoveBarcodesFromTubes' do + let!(:num_wells) { 3 } + + let(:activity) { create :activity } + let(:step) { create :step, activity: activity, state: Step::STATE_RUNNING } + + let(:barcodes) { + num_wells.times.map{|i| "FR00#{i}"} + } + let(:padded_locations) { + num_wells.times.map{|i| "A0#{i}"} + } + + let(:locations) { + num_wells.times.map{|i| "A#{i}"} + } + let(:wells_for_rack) { + num_wells.times.map do |i| + asset = create(:asset, barcode: barcodes[i]) + asset.facts << create(:fact, predicate: 'a', object: 'Tube') + asset.facts << create(:fact, predicate: 'location', object: padded_locations[i]) + asset + end + } + let(:tube_rack) { + asset = create :asset + asset.facts << create(:fact, predicate: 'a', object: 'TubeRack') + asset.facts << wells_for_rack.map{|a| create(:fact, predicate: 'contains', object_asset: a)} + asset + } + + context 'when run with a rack with tubes' do + it 'removes the barcodes from the tubes' do + group = create(:asset_group, assets: [tube_rack]) + updates = RemoveBarcodesFromTubes.new(asset_group: group).process + changes = updates.to_h + + expect(changes[:remove_facts].select{|t| t[1] == 'barcode'}.count).to eq(num_wells) + + wells_for_rack.each_with_index do |w, pos| + expect(changes[:remove_facts]).to include( + [w.uuid, 'barcode', barcodes[pos]]) + end + expect{ + updates.apply(step) + wells_for_rack.each(&:reload) + }.to change{wells_for_rack.first.barcode}.from(barcodes.first).to(nil) + end + end +end diff --git a/test/factories/assets.rb b/test/factories/assets.rb index b22fc897..215691d1 100644 --- a/test/factories/assets.rb +++ b/test/factories/assets.rb @@ -1,10 +1,39 @@ FactoryBot.define do factory :asset do - after(:build) do |asset| - if (Rails.configuration.respond_to?(:testing_barcodes) && asset.barcode.nil?) - asset.update_attributes(:barcode => Rails.configuration.testing_barcodes.pop) + trait :with_barcode do + barcode { generate :barcode } + end + factory :tube, class: Asset do + facts { [ create(:tube_fact) ] } + + trait :inside_rack do + transient do + parent { nil } + location { nil } + end + after(:create) do |tube, evaluator| + if evaluator.parent + evaluator.parent.facts << create(:fact, predicate: 'contains', object_asset_id: tube.id, literal: false) + tube.facts << create(:fact, predicate: 'parent', object_asset: evaluator.parent, literal: false) + end + if evaluator.location + tube.facts << create(:fact, predicate: 'location', object: evaluator.location, literal: true) + end + end end end + factory :well, class: Asset do + facts { [ create(:well_fact) ] } + end + + factory :plate, class: Asset do + facts { [ create(:plate_fact) ] } + end + + factory :tube_rack, class: Asset do + facts { [ create(:tube_rack_fact) ] } + end end + end diff --git a/test/factories/facts.rb b/test/factories/facts.rb index 3934f1b4..f237dfc5 100644 --- a/test/factories/facts.rb +++ b/test/factories/facts.rb @@ -2,4 +2,37 @@ factory :fact, class: 'Fact' do end + + factory :relation_fact, class: 'Fact' do + literal { false } + end + + factory :literal_fact, class: 'Fact' do + literal { true } + end + + factory :tube_fact, class: Fact do + predicate { 'a' } + object { 'Tube' } + literal { true } + end + + factory :well_fact, class: Fact do + predicate { 'a' } + object { 'Well' } + literal { true } + end + + factory :tube_rack_fact, class: Fact do + predicate { 'a' } + object { 'TubeRack' } + literal { true } + end + + factory :plate_fact, class: Fact do + predicate { 'a' } + object { 'Plate' } + literal { true } + end + end diff --git a/yarn.lock b/yarn.lock index e688efbe..d4e4ade1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,718 +3,787 @@ "@babel/cli@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.5.tgz#bdb6d9169e93e241a08f5f7b0265195bf38ef5ec" - integrity sha512-UHI+7pHv/tk9g6WXQKYz+kmXTI77YtuY3vqC59KIqcoWEjsJJSG6rAxKaLsgj3LDyadsPrCB929gVOKM6Hui0w== + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.0.tgz#e9ed4c3dbb163de5034c18979c118ed1aa294e05" + integrity sha512-/zOi56gIH3jBmnrfUvVf8MOMqf3hfFou2ONRYdRRpgnBSi0dUkiO+usu44YHsOEJqqwPkijBsiDKscQizouoag== dependencies: - commander "^2.8.1" + commander "^4.0.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" lodash "^4.17.13" - mkdirp "^0.5.1" - output-file-sync "^2.0.0" + make-dir "^2.1.0" slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - chokidar "^2.0.4" + chokidar "^2.1.8" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.0.tgz#8c98d4ac29d6f80f28127b1bc50970a72086c5ac" + integrity sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA== + dependencies: + "@babel/highlight" "^7.8.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== +"@babel/compat-data@^7.8.0", "@babel/compat-data@^7.8.1": + version "7.8.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.1.tgz#fc0bbbb7991e4fb2b47e168e60f2cc2c41680be9" + integrity sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw== dependencies: - "@babel/highlight" "^7.0.0" + browserslist "^4.8.2" + invariant "^2.2.4" + semver "^5.5.0" "@babel/core@^7.1.0", "@babel/core@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - convert-source-map "^1.1.0" + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.0.tgz#fd273d4faf69cc20ee3ccfd32d42df916bb4a15c" + integrity sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/generator" "^7.8.0" + "@babel/helpers" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + convert-source-map "^1.7.0" debug "^4.1.0" + gensync "^1.0.0-beta.1" json5 "^2.1.0" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== +"@babel/generator@^7.4.0", "@babel/generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.0.tgz#40a1244677be58ffdc5cd01e22634cd1d5b29edf" + integrity sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.8.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/helper-annotate-as-pure@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz#334ae2cb801e2381509631a5caa1ac6ab1c5016a" + integrity sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.8.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz#c2237beb110f64f592dddcabef1098e9d766ef88" + integrity sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.8.0" + "@babel/types" "^7.8.0" -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== +"@babel/helper-builder-react-jsx@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz#4b9111eb862f5fd8840c37d200610fa95ab0aad8" + integrity sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.8.0" esutils "^2.0.0" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== +"@babel/helper-call-delegate@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz#1cd725c5444be0ce59dbfa47b6ac5e9772168c67" + integrity sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg== + dependencies: + "@babel/helper-hoist-variables" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helper-compilation-targets@^7.8.0": + version "7.8.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz#309da97e93e6ca74896393d0c8da7af39cb4cea8" + integrity sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/compat-data" "^7.8.1" + browserslist "^4.8.2" + invariant "^2.2.4" + levenary "^1.1.0" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz#ae551572b840189a7b94e39eddc1a68d355974eb" + integrity sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g== + dependencies: + "@babel/helper-regex" "^7.8.0" + regexpu-core "^4.6.0" -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== +"@babel/helper-define-map@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz#d3180691fa189fc147d411deaa029305c1470dfe" + integrity sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" + "@babel/helper-function-name" "^7.8.0" + "@babel/types" "^7.8.0" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== +"@babel/helper-explode-assignable-expression@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz#a2ded9298a5dc9df0a8ec65ac12e4745f9af2882" + integrity sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og== dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-function-name@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz#dde5cf0d6b15c21817a67dd66fe7350348e023bf" + integrity sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw== dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@babel/helper-get-function-arity@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz#90977f61d76d2225d1ae0208def7df22ea92792e" + integrity sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.8.0" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== +"@babel/helper-hoist-variables@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz#693586b56487e60fff9d9c7074f4a86e1a8af348" + integrity sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.8.0" -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== +"@babel/helper-member-expression-to-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz#50d0ed445d2da11beb60e2dbc2c428254bd5a4ae" + integrity sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.8.0" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== +"@babel/helper-module-imports@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz#076edda55d8cd39c099981b785ce53f4303b967e" + integrity sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.8.0" -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== +"@babel/helper-module-transforms@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz#a3cbe4ac91b101c4b6db278af0c868fe7091ebae" + integrity sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/helper-module-imports" "^7.8.0" + "@babel/helper-simple-access" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-optimise-call-expression@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz#3df62773cf210db9ed34c2bb39fece5acd1e1733" + integrity sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.8.0" -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz#59ec882d43c21c544ccb51decaecb306b34a8231" + integrity sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA== -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== +"@babel/helper-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.0.tgz#dde1d2d2070e292c19a8702075e945923aa1678b" + integrity sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ== dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== +"@babel/helper-remap-async-to-generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz#034c21154dd12472717cfb31faf1713426fbc435" + integrity sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.0" + "@babel/helper-wrap-function" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helper-replace-supers@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz#d83cb117edb820eebe9ae6c970a8ad5eac09d19f" + integrity sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.0" + "@babel/helper-optimise-call-expression" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helper-simple-access@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz#a5095ab031f759995134183fa7719aa85f0ec962" + integrity sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw== + dependencies: + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helper-split-export-declaration@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz#ed10cb03b07454c0d40735fad4e9c9711e739588" + integrity sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA== + dependencies: + "@babel/types" "^7.8.0" + +"@babel/helper-wrap-function@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz#a26751c7b0be765a0db10162c6de485402cb505c" + integrity sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag== + dependencies: + "@babel/helper-function-name" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helpers@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.0.tgz#3d3e6e08febf5edbbf63b1cf64395525aa3ece37" + integrity sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA== + dependencies: + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/highlight@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.0.tgz#4cc003dc10359919e2e3a1d9459150942913dd1a" + integrity sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.0.tgz#54682775f1fb25dd29a93a02315aab29a6a292bb" + integrity sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA== -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== +"@babel/plugin-proposal-async-generator-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz#92520961d1b2220f0f2e6b576b7896698cd747f9" + integrity sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ== dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-remap-async-to-generator" "^7.8.0" + "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@babel/plugin-proposal-dynamic-import@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz#bbd7c00f351b55f02aec0fe9b9c42ad3f659b176" + integrity sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg== dependencies: - "@babel/types" "^7.4.4" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== +"@babel/plugin-proposal-json-strings@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz#99fd838398c32f4d96117770f7f3591062e72607" + integrity sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/helpers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" - integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz#1ef61239ed2241746bc4936fc643a5c6f1cb24fa" + integrity sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== +"@babel/plugin-proposal-object-rest-spread@^7.5.5", "@babel/plugin-proposal-object-rest-spread@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz#ca8ac673d32db774c2154a4c7517fd46ec45e9cf" + integrity sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA== dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== +"@babel/plugin-proposal-optional-catch-binding@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz#6a7dee0bfd72751e3f1386ba4da03e6fa82fcd95" + integrity sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== +"@babel/plugin-proposal-optional-chaining@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz#d05e4fa3c1e4ef18eaea6bc92a4b06f95eaf1df5" + integrity sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== +"@babel/plugin-proposal-unicode-property-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz#9e1c0481863485052bae8ac024fca7028e24ee31" + integrity sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-proposal-object-rest-spread@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" - integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz#e6c3dba5a61ecf72ba00a3f3f5f1234989a58e6a" + integrity sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz#3a6c1cd36af923db602df83c5aa72e08bb14353a" + integrity sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" - integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz#7f798eb7e8cfd3821388120679d23d530bae6e53" + integrity sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== +"@babel/plugin-syntax-jsx@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz#657a0306e2c74de84e0dcf8b6cb024ed990224fc" + integrity sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz#5d8f24ecffa4ae74164e53264953c5ea8ba6d149" + integrity sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz#9b37d580d459682364d8602494c69145b394fd4c" + integrity sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz#180c7bdd6b7fd81cc6d18269de12d5ddd60cabce" + integrity sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz#c40f4d4d6a4f5e71d2bfd949b0a7f1e1e6792fe0" + integrity sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== +"@babel/plugin-syntax-top-level-await@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz#8d45e3d68a1e26bce79c51b08dd9126290686207" + integrity sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== +"@babel/plugin-transform-arrow-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz#d98b7c425fed35f70cb85024a2b10008936631b3" + integrity sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-async-to-generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== +"@babel/plugin-transform-async-to-generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz#6561fb6445d89bc20b72150430944cad0e501e4a" + integrity sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-module-imports" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-remap-async-to-generator" "^7.8.0" -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== +"@babel/plugin-transform-block-scoped-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz#2ea8a33ec78825ce91244980389cb96d4c6dc6bd" + integrity sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-block-scoping@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== +"@babel/plugin-transform-block-scoping@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz#f6a81bc8c76dbbd202b718cb9e681a27f1d0af8f" + integrity sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" +"@babel/plugin-transform-classes@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz#eb4699613b3ea3ccaf095bb0447dac55f7454fc9" + integrity sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.0" + "@babel/helper-define-map" "^7.8.0" + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-optimise-call-expression" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-replace-supers" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== +"@babel/plugin-transform-computed-properties@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz#c86c200ea42cbecda754fdf636a04dfbf6371cc7" + integrity sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-destructuring@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== +"@babel/plugin-transform-destructuring@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz#579d09e8dabf825cc3ac1524414ff99669f0abf9" + integrity sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== +"@babel/plugin-transform-dotall-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz#7e9e439e85219be091c5dbf1be138320600d1172" + integrity sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== +"@babel/plugin-transform-duplicate-keys@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz#913b3fdb5cbd35e3208b017dac5ef335ef6b0d65" + integrity sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== +"@babel/plugin-transform-exponentiation-operator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz#72ddf89e1acfac75482992b8976df62f8ad813c4" + integrity sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== +"@babel/plugin-transform-for-of@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz#4a2960b76d42f4cc8a821edb66f4a7eadf6042ce" + integrity sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== +"@babel/plugin-transform-function-name@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz#9c5fdb20967f151c0e06419621d56d63120653c9" + integrity sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== +"@babel/plugin-transform-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz#bda7a4773293ee9b687174eb4e1f91fe37ed576f" + integrity sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== +"@babel/plugin-transform-member-expression-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz#da3e170e99c2fd1110785cc6146aa2f45429f664" + integrity sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== +"@babel/plugin-transform-modules-amd@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz#09f4fb47a2a7d4471866afeb446bc9a068a091b0" + integrity sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A== dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== +"@babel/plugin-transform-modules-commonjs@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz#69c682a41905f8885ffb9c37ab34ad1fe8ec3fd7" + integrity sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw== dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-simple-access" "^7.8.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== +"@babel/plugin-transform-modules-systemjs@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz#b0ff0106a7f8a465a75ce5167c88b648770b0a0c" + integrity sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-hoist-variables" "^7.8.0" + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== +"@babel/plugin-transform-modules-umd@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz#edc1a7a587a31a185070421f97ae3798b15df9b7" + integrity sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg== dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" - integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz#718e168e7f5ab83fa7e4dfd0cf1831804fc016f0" + integrity sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA== dependencies: - regexp-tree "^0.1.6" + "@babel/helper-create-regexp-features-plugin" "^7.8.0" -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== +"@babel/plugin-transform-new-target@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz#54d126788abc648cab27bc9b74a8306b4158f70f" + integrity sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== +"@babel/plugin-transform-object-super@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz#aa35d295dd62b84bbea2e155e0b3a2017eb2f4e8" + integrity sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-replace-supers" "^7.8.0" -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== +"@babel/plugin-transform-parameters@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz#edc1531beed51fb8a49e0a3f11ca6b508d083d6f" + integrity sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g== dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-call-delegate" "^7.8.0" + "@babel/helper-get-function-arity" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== +"@babel/plugin-transform-property-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz#af7538d916935ece100e72123fce109182c01ac3" + integrity sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== +"@babel/plugin-transform-react-display-name@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.0.tgz#4aa02b070a83bb12033f483bf65ab2444ba1832a" + integrity sha512-oozdOhU2hZ6Tb9LS9BceGqDSmiUrlZX8lmRqnxQuiGzqWlhflIRQ1oFBHdV+hv+Zi9e5BhRkfSYtMLRLEkuOVA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" - integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== +"@babel/plugin-transform-react-jsx-self@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.0.tgz#bd067b0ca21cf33eac80b7dfddf8699f1d13a943" + integrity sha512-hJXfJdLDDlJoxW/rAjkuIpGUUTizQ6fN9tIciW1M8KIqFsmpEf9psBPNTXYRCOLYLEsra+/WgVq+sc+1z05nQw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-jsx" "^7.8.0" -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" - integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== +"@babel/plugin-transform-react-jsx-source@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.0.tgz#97681728c12d770449d1c3657621afe974645e59" + integrity sha512-W+0VXOhMRdUTL7brjKXND+BiXbsxczfMdZongQ/Jtti0JVMtcTxWo66NMxNNtbPYvbc4aUXmgjl3eMms41sYtg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-jsx" "^7.8.0" -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== +"@babel/plugin-transform-react-jsx@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.0.tgz#5676f2a13befc16fa2a78bc557e02ff150c02a28" + integrity sha512-r5DgP2ZblaGmW/azRS9rlaf3oY4r/ByXRDA5Lcr3iHUkx3cCfL9RM10gU7AQmzwKymoq8LZ55sHyq9VeQFHwyQ== dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-builder-react-jsx" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-jsx" "^7.8.0" -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== +"@babel/plugin-transform-regenerator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz#4a0a40af2f7d60a54a3fd7ce58f06b12ab14eaf9" + integrity sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g== dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== +"@babel/plugin-transform-reserved-words@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz#572f21e11b9271e67cc5695890b8d5e58186f51e" + integrity sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== +"@babel/plugin-transform-shorthand-properties@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz#38b43048e633878f82a3ef1353868c12015ac838" + integrity sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== +"@babel/plugin-transform-spread@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz#939e17585b1f24535fdeafc5e11a439520f4b3ab" + integrity sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== +"@babel/plugin-transform-sticky-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz#98f634d133f7be471e1e6ccc613c6a95e7e9f1f5" + integrity sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-regex" "^7.8.0" -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== +"@babel/plugin-transform-template-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz#2e19e890cc5b0d58643ee6986840e928d707f7ef" + integrity sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== +"@babel/plugin-transform-typeof-symbol@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz#a8d0dd317349d3dcbb9d659808099c94486554a5" + integrity sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== +"@babel/plugin-transform-unicode-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz#20988246a9d98271f861be422e5a17898b80e5b0" + integrity sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" "@babel/preset-env@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" - integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.5.5" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.5.5" - "@babel/plugin-transform-classes" "^7.5.5" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.5" - browserslist "^4.6.0" - core-js-compat "^3.1.1" + version "7.8.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.2.tgz#dd55bd61f5d0bb1237915173c0e94aa350de3089" + integrity sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg== + dependencies: + "@babel/compat-data" "^7.8.0" + "@babel/helper-compilation-targets" "^7.8.0" + "@babel/helper-module-imports" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-proposal-async-generator-functions" "^7.8.0" + "@babel/plugin-proposal-dynamic-import" "^7.8.0" + "@babel/plugin-proposal-json-strings" "^7.8.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-proposal-object-rest-spread" "^7.8.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.0" + "@babel/plugin-proposal-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.0" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.0" + "@babel/plugin-transform-arrow-functions" "^7.8.0" + "@babel/plugin-transform-async-to-generator" "^7.8.0" + "@babel/plugin-transform-block-scoped-functions" "^7.8.0" + "@babel/plugin-transform-block-scoping" "^7.8.0" + "@babel/plugin-transform-classes" "^7.8.0" + "@babel/plugin-transform-computed-properties" "^7.8.0" + "@babel/plugin-transform-destructuring" "^7.8.0" + "@babel/plugin-transform-dotall-regex" "^7.8.0" + "@babel/plugin-transform-duplicate-keys" "^7.8.0" + "@babel/plugin-transform-exponentiation-operator" "^7.8.0" + "@babel/plugin-transform-for-of" "^7.8.0" + "@babel/plugin-transform-function-name" "^7.8.0" + "@babel/plugin-transform-literals" "^7.8.0" + "@babel/plugin-transform-member-expression-literals" "^7.8.0" + "@babel/plugin-transform-modules-amd" "^7.8.0" + "@babel/plugin-transform-modules-commonjs" "^7.8.0" + "@babel/plugin-transform-modules-systemjs" "^7.8.0" + "@babel/plugin-transform-modules-umd" "^7.8.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.0" + "@babel/plugin-transform-new-target" "^7.8.0" + "@babel/plugin-transform-object-super" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.8.0" + "@babel/plugin-transform-property-literals" "^7.8.0" + "@babel/plugin-transform-regenerator" "^7.8.0" + "@babel/plugin-transform-reserved-words" "^7.8.0" + "@babel/plugin-transform-shorthand-properties" "^7.8.0" + "@babel/plugin-transform-spread" "^7.8.0" + "@babel/plugin-transform-sticky-regex" "^7.8.0" + "@babel/plugin-transform-template-literals" "^7.8.0" + "@babel/plugin-transform-typeof-symbol" "^7.8.0" + "@babel/plugin-transform-unicode-regex" "^7.8.0" + "@babel/types" "^7.8.0" + browserslist "^4.8.2" + core-js-compat "^3.6.2" invariant "^2.2.2" - js-levenshtein "^1.1.3" + levenary "^1.1.0" semver "^5.5.0" "@babel/preset-react@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.0.tgz#fe3bdecfc94e9b4eb3aa2751cfb284e739e810be" + integrity sha512-GP9t18RjtH67ea3DA2k71VqtMnTOupYJx34Z+KUEBRoRxvdETaucmtMWH5uoGHWzAD4qxbuV5ckxpewm39NXkA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-react-display-name" "^7.8.0" + "@babel/plugin-transform-react-jsx" "^7.8.0" + "@babel/plugin-transform-react-jsx-self" "^7.8.0" + "@babel/plugin-transform-react-jsx-source" "^7.8.0" "@babel/runtime@^7.1.2": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" - integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.0.tgz#8c81711517c56b3d00c6de706b0fb13dc3531549" + integrity sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.4.0", "@babel/template@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.0.tgz#a32f57ad3be89c0fa69ae87b53b4826844dc6330" + integrity sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.0.tgz#d85266fdcff553c10e57b672604b36383a127c1f" + integrity sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/generator" "^7.8.0" + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/types" "^7.8.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.0.tgz#1a2039a028057a2c888b668d94c98e61ea906e7f" + integrity sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -908,9 +977,9 @@ webpack-manifest-plugin "^1.3.2" "@types/babel__core@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" - integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -919,9 +988,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== dependencies: "@babel/types" "^7.0.0" @@ -934,9 +1003,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" + integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== dependencies: "@babel/types" "^7.3.0" @@ -961,9 +1030,14 @@ "@types/istanbul-lib-report" "*" "@types/node@*": - version "12.7.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" - integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== + version "13.1.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.6.tgz#076028d0b0400be8105b89a0a55550c86684ffec" + integrity sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== "@types/stack-utils@^1.0.1": version "1.0.1" @@ -971,21 +1045,21 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/yargs-parser@*": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.0.0.tgz#453743c5bbf9f1bed61d959baab5b06be029b2d0" - integrity sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw== + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== "@types/yargs@^13.0.0": - version "13.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" - integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== + version "13.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.5.tgz#18121bfd39dc12f280cee58f92c5b21d32041908" + integrity sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q== dependencies: "@types/yargs-parser" "*" abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== abbrev@1: version "1.1.1" @@ -1000,9 +1074,9 @@ acorn-dynamic-import@^2.0.0: acorn "^4.0.3" acorn-globals@^4.1.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" - integrity sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" @@ -1035,11 +1109,11 @@ acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3: integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== -airbnb-prop-types@^2.13.2: +airbnb-prop-types@^2.15.0: version "2.15.0" resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef" integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA== @@ -1061,9 +1135,9 @@ ajv-keywords@^2.1.0: integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv-keywords@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" - integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" @@ -1076,9 +1150,9 @@ ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.1.0, ajv@^6.4.0, ajv@^6.5.5: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -1094,7 +1168,7 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: +alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= @@ -1207,14 +1281,13 @@ array.prototype.find@^2.1.0: define-properties "^1.1.3" es-abstract "^1.13.0" -array.prototype.flat@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" - integrity sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw== +array.prototype.flat@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.10.0" - function-bind "^1.1.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" asap@~2.0.3: version "2.0.6" @@ -1243,10 +1316,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: @@ -1260,9 +1334,9 @@ astral-regex@^1.0.0: integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-foreach@^0.1.3: version "0.1.3" @@ -1275,18 +1349,18 @@ async-limiter@~1.0.0: integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@^2.1.2, async@^2.4.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: - lodash "^4.17.11" + lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -1321,9 +1395,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" + integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -1965,9 +2039,9 @@ balanced-match@^1.0.0: integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== base@^0.11.1: version "0.11.2" @@ -1995,9 +2069,16 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" - integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" block-stream@*: version "0.0.9" @@ -2007,16 +2088,16 @@ block-stream@*: inherits "~2.0.0" bluebird@^3.5.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -2145,19 +2226,19 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.6.0, browserslist@^4.6.6: - version "4.6.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" - integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== +browserslist@^4.0.0, browserslist@^4.8.2, browserslist@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" + integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== dependencies: - caniuse-lite "^1.0.30000984" - electron-to-chromium "^1.3.191" - node-releases "^1.1.25" + caniuse-lite "^1.0.30001017" + electron-to-chromium "^1.3.322" + node-releases "^1.1.44" -bser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -2172,9 +2253,9 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -2219,6 +2300,13 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -2226,11 +2314,23 @@ caller-path@^0.1.0: dependencies: callsites "^0.2.0" +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2289,20 +2389,25 @@ caniuse-api@^2.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000942" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000942.tgz#e29e4c6afa3558edafe7c190c7f8bdd93fb7c486" - integrity sha512-HB+j2/Gywe+0JPtEMw8ioTi4ykIOco9nfSGspMGIBocqi4aMYZYALP992RmhVcUyB0oS5h8nrKGk9fCF9L1VXA== +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000830, caniuse-lite@^1.0.30000844: - version "1.0.30000942" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000942.tgz#454139b28274bce70bfe1d50c30970df7430c6e4" - integrity sha512-wLf+IhZUy2rfz48tc40OH7jHjXjnvDFEYqBHluINs/6MgzoNLPf25zhE4NOVzqxLKndf+hau81sAW0RcGHIaBQ== +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30001020" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001020.tgz#30c82517d283d6a64df76ea7734fade566e7e5e7" + integrity sha512-KMZ0k2Xg+UiQemGBh+cFKnnFi/oEYZcuGWSb1B0gofoP89ZI/fmjYJ8J9lQb9OnSupdG6cHZSxn+LtFli2Q07w== -caniuse-lite@^1.0.30000984: - version "1.0.30000989" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" - integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000830, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001017: + version "1.0.30001020" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" + integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== capture-exit@^2.0.0: version "2.0.0" @@ -2359,7 +2464,7 @@ chardet@^0.4.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= -cheerio@^1.0.0-rc.2: +cheerio@^1.0.0-rc.3: version "1.0.0-rc.3" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== @@ -2371,26 +2476,7 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" - integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - 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.0" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^2.0.4: +chokidar@^2.0.2, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2409,10 +2495,10 @@ chokidar@^2.0.4: optionalDependencies: fsevents "^1.2.7" -chownr@^1.0.1, chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== +chownr@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== ci-info@^2.0.0: version "2.0.0" @@ -2518,6 +2604,15 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" @@ -2595,6 +2690,14 @@ color@^2.0.1: color-convert "^1.9.1" color-string "^1.5.2" +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" @@ -2610,16 +2713,21 @@ colors@~1.1.2: integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.8.1, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" + integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== commander@~2.13.0: version "2.13.0" @@ -2632,9 +2740,9 @@ commondir@^1.0.1: integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compression-webpack-plugin@^1.1.11: version "1.1.12" @@ -2663,11 +2771,9 @@ concat-stream@^1.5.0, concat-stream@^1.6.0: typedarray "^0.0.6" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -2679,10 +2785,10 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" @@ -2703,13 +2809,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" - integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== +core-js-compat@^3.6.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.3.tgz#41e281ca771209d5f2eb63ce34f96037d0928538" + integrity sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg== dependencies: - browserslist "^4.6.6" - semver "^6.3.0" + browserslist "^4.8.3" + semver "7.0.0" core-js@^1.0.0: version "1.2.7" @@ -2717,24 +2823,24 @@ core-js@^1.0.0: integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.4.0, core-js@^2.5.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" - integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: + import-fresh "^2.0.0" is-directory "^0.3.1" - js-yaml "^3.9.0" + js-yaml "^3.13.1" parse-json "^4.0.0" - require-from-string "^2.0.1" create-ecdh@^4.0.0: version "4.0.3" @@ -2831,11 +2937,19 @@ css-color-function@~1.3.3: debug "^3.1.0" rgb "~0.1.0" -css-color-names@0.0.4: +css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + css-loader@^0.28.11: version "0.28.11" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" @@ -2856,6 +2970,21 @@ css-loader@^0.28.11: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -2875,6 +3004,14 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + css-unit-converter@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" @@ -2885,12 +3022,80 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= -cssnano@^3.10.0, cssnano@^3.4.0: +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= @@ -2928,6 +3133,23 @@ cssnano@^3.10.0, cssnano@^3.4.0: postcss-value-parser "^3.2.3" postcss-zindex "^2.0.1" +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + dependencies: + css-tree "1.0.0-alpha.37" + csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" @@ -2955,17 +3177,18 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: - es5-ext "^0.10.9" + es5-ext "^0.10.50" + type "^1.0.1" dashdash@^1.12.0: version "1.14.1" @@ -2983,12 +3206,7 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3026,11 +3244,6 @@ deep-equal-ident@^1.1.1: dependencies: lodash.isequal "^3.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -3081,9 +3294,9 @@ delegates@^1.0.0: integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -3095,11 +3308,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -3131,7 +3339,7 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -dom-helpers@^3.2.0, dom-helpers@^3.3.1: +dom-helpers@^3.2.0, dom-helpers@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== @@ -3139,9 +3347,9 @@ dom-helpers@^3.2.0, dom-helpers@^3.3.1: "@babel/runtime" "^7.1.2" dom-serializer@0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" - integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" entities "^2.0.0" @@ -3191,7 +3399,7 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.5.1: +domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -3199,6 +3407,13 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -3217,20 +3432,15 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== - -electron-to-chromium@^1.3.191: - version "1.3.243" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.243.tgz#32f64f00fa121532d1d49f5c0a15fd77f52ae889" - integrity sha512-+edFdHGxLSmAKftXa5xZIg19rHkkJLiW+tRu0VMVG3RKztyeKX7d3pXf707lS6+BxB9uBun3RShbxCI1PtBAgQ== +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.322, electron-to-chromium@^1.3.47: + version "1.3.332" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz#283df02d8269e25d9e2f424e11e909c9730a8a82" + integrity sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg== elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -3258,9 +3468,9 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -3285,72 +3495,82 @@ entities@^2.0.0: integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== enzyme-adapter-react-16@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz#204722b769172bcf096cb250d33e6795c1f1858f" - integrity sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz#b16db2f0ea424d58a808f9df86ab6212895a4501" + integrity sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q== dependencies: - enzyme-adapter-utils "^1.12.0" + enzyme-adapter-utils "^1.13.0" + enzyme-shallow-equal "^1.0.1" has "^1.0.3" object.assign "^4.1.0" - object.values "^1.1.0" + object.values "^1.1.1" prop-types "^15.7.2" - react-is "^16.8.6" + react-is "^16.12.0" react-test-renderer "^16.0.0-0" semver "^5.7.0" -enzyme-adapter-utils@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz#96e3730d76b872f593e54ce1c51fa3a451422d93" - integrity sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA== +enzyme-adapter-utils@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78" + integrity sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ== dependencies: - airbnb-prop-types "^2.13.2" - function.prototype.name "^1.1.0" + airbnb-prop-types "^2.15.0" + function.prototype.name "^1.1.2" object.assign "^4.1.0" - object.fromentries "^2.0.0" + object.fromentries "^2.0.2" prop-types "^15.7.2" - semver "^5.6.0" + semver "^5.7.1" -enzyme-matchers@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-7.1.0.tgz#7224298028679af41d224fdff02b9a9a61f2ad86" - integrity sha512-PCfIvyNnZh4ougBaMXKeqNrN6yilzkbtphpi2X74uFeqbPabDUcvNq30Bcw29sSIv7QI1ZCTlQ2ktGep/4jIBw== +enzyme-matchers@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-7.1.2.tgz#d80530a61f22d28bb993dd7588abba38bd4de282" + integrity sha512-03WqAg2XDl7id9rARIO97HQ1JIw9F2heJ3R4meGu/13hx0ULTDEgl0E67MGl2Uq1jq1DyRnJfto1/VSzskdV5A== dependencies: circular-json-es6 "^2.0.1" deep-equal-ident "^1.1.1" +enzyme-shallow-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz#7afe03db3801c9b76de8440694096412a8d9d49e" + integrity sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ== + dependencies: + has "^1.0.3" + object-is "^1.0.2" + enzyme-to-json@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.4.0.tgz#2b6330a784a57ba68298e3c0d6cef17ee4fedc0e" - integrity sha512-gbu8P8PMAtb+qtKuGVRdZIYxWHC03q1dGS3EKRmUzmTDIracu3o6cQ0d4xI2YWojbelbxjYOsmqM5EgAL0WgIA== + version "3.4.3" + resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.4.3.tgz#ed4386f48768ed29e2d1a2910893542c34e7e0af" + integrity sha512-jqNEZlHqLdz7OTpXSzzghArSS3vigj67IU/fWkPyl1c0TCj9P5s6Ze0kRkYZWNEoCqCR79xlQbigYlMx5erh8A== dependencies: - lodash "^4.17.12" + lodash "^4.17.15" enzyme@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.10.0.tgz#7218e347c4a7746e133f8e964aada4a3523452f6" - integrity sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg== - dependencies: - array.prototype.flat "^1.2.1" - cheerio "^1.0.0-rc.2" - function.prototype.name "^1.1.0" + version "3.11.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" + integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw== + dependencies: + array.prototype.flat "^1.2.3" + cheerio "^1.0.0-rc.3" + enzyme-shallow-equal "^1.0.1" + function.prototype.name "^1.1.2" has "^1.0.3" - html-element-map "^1.0.0" - is-boolean-object "^1.0.0" - is-callable "^1.1.4" - is-number-object "^1.0.3" - is-regex "^1.0.4" - is-string "^1.0.4" + html-element-map "^1.2.0" + is-boolean-object "^1.0.1" + is-callable "^1.1.5" + is-number-object "^1.0.4" + is-regex "^1.0.5" + is-string "^1.0.5" is-subset "^0.1.1" lodash.escape "^4.0.1" lodash.isequal "^4.5.0" - object-inspect "^1.6.0" - object-is "^1.0.1" + object-inspect "^1.7.0" + object-is "^1.0.2" object.assign "^4.1.0" - object.entries "^1.0.4" - object.values "^1.0.4" - raf "^3.4.0" + object.entries "^1.1.1" + object.values "^1.1.1" + raf "^3.4.1" rst-selector-parser "^2.2.3" - string.prototype.trim "^1.1.2" + string.prototype.trim "^1.2.1" errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -3366,37 +3586,42 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== +es-abstract@^1.13.0, es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== dependencies: - es-to-primitive "^1.2.0" + es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.48" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.48.tgz#9a0b31eeded39e64453bcedf6f9d50bbbfb43850" - integrity sha512-CdRvPlX/24Mj5L4NVxTs4804sxiS2CjVprgCmrgoDkdmjdY4D+ySHa7K3jJf8R40dFg0tIm3z/dk326LrnuSGw== +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== dependencies: es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" + es6-symbol "~3.1.3" + next-tick "~1.0.0" -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: +es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -3428,7 +3653,7 @@ es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: +es6-symbol@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= @@ -3436,14 +3661,22 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: d "1" es5-ext "~0.10.14" +es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== dependencies: d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" es6-symbol "^3.1.1" escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: @@ -3452,9 +3685,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.9.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + version "1.12.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" + integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -3489,9 +3722,9 @@ eslint-scope@^3.7.1: estraverse "^4.1.1" eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@^4.19.1: version "4.19.1" @@ -3574,26 +3807,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - -estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^2.0.0: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" @@ -3603,9 +3826,9 @@ event-emitter@~0.3.5: es5-ext "~0.10.14" events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3616,9 +3839,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== execa@^0.7.0: version "0.7.0" @@ -3676,6 +3899,13 @@ expect@^24.9.0: jest-message-util "^24.9.0" jest-regex-util "^24.9.0" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3750,11 +3980,11 @@ fast-deep-equal@^2.0.1: integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -3765,11 +3995,11 @@ fastparse@^1.1.1: integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - bser "^2.0.0" + bser "2.1.1" fbjs@^0.8.9: version "0.8.17" @@ -3807,6 +4037,11 @@ file-loader@^1.1.11: loader-utils "^1.0.2" schema-utils "^0.4.5" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3880,9 +4115,9 @@ flat-cache@^1.2.1: write "^0.2.1" flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== flush-write-stream@^1.0.0: version "1.1.1" @@ -3949,13 +4184,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== - dependencies: - minipass "^2.2.1" - fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -3977,17 +4205,17 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + bindings "^1.5.0" + nan "^2.12.1" -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3999,25 +4227,24 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.0, function.prototype.name@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" - integrity sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q== +function.prototype.name@^1.1.1, function.prototype.name@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" + integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" - functions-have-names "^1.1.1" - is-callable "^1.1.4" + es-abstract "^1.17.0-next.1" + functions-have-names "^1.2.0" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -functions-have-names@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.1.1.tgz#79d35927f07b8e7103d819fed475b64ccf7225ea" - integrity sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw== +functions-have-names@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" + integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== gauge@~2.7.3: version "2.7.4" @@ -4040,6 +4267,11 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -4092,10 +4324,10 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4104,24 +4336,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - 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" - -globals@^11.0.1: - version "11.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" - integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== - -globals@^11.1.0: +globals@^11.0.1, globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -4132,40 +4347,24 @@ globals@^9.18.0: integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.0.tgz#41d0e9fb44afd4b80d93a23263714f90b3dec904" + integrity sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg== dependencies: glob "~7.1.1" lodash "~4.17.10" minimatch "~3.0.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - -graceful-fs@^4.1.15: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -4206,10 +4405,10 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== has-unicode@^2.0.0: version "2.0.1" @@ -4247,7 +4446,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1, has@^1.0.3: +has@^1.0.0, has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -4270,6 +4469,11 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -4288,19 +4492,29 @@ home-or-tmp@^2.0.0: os-tmpdir "^1.0.1" hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= html-comment-regex@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -html-element-map@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.1.0.tgz#e5aab9a834caf883b421f8bd9eaedcaac887d63c" - integrity sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA== +html-element-map@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22" + integrity sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw== dependencies: array-filter "^1.0.0" @@ -4311,6 +4525,11 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -4346,7 +4565,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4373,22 +4592,15 @@ identity-obj-proxy@^3.0.0: harmony-reflect "^1.4.6" ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.3: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -4401,6 +4613,14 @@ import-cwd@^2.0.0: dependencies: import-from "^2.1.0" +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -4438,11 +4658,6 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4451,20 +4666,20 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inquirer@^3.0.6: version "3.3.0" @@ -4539,20 +4754,20 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= +is-boolean-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" + integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== is-ci@^2.0.0: version "2.0.0" @@ -4561,6 +4776,18 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -4576,9 +4803,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-descriptor@^0.1.0: version "0.1.6" @@ -4652,16 +4879,16 @@ is-glob@^3.1.0: is-extglob "^2.1.0" is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== is-number@^3.0.0: version "3.0.0" @@ -4670,12 +4897,17 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -4687,12 +4919,12 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== dependencies: - has "^1.0.1" + has "^1.0.3" is-resolvable@^1.0.0: version "1.1.0" @@ -4704,10 +4936,10 @@ is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - integrity sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ= +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== is-subset@^0.1.1: version "0.1.1" @@ -4721,12 +4953,19 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.1" is-typedarray@~1.0.0: version "1.0.0" @@ -4827,11 +5066,11 @@ istanbul-lib-source-maps@^3.0.1: source-map "^0.6.1" istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== dependencies: - handlebars "^4.1.2" + html-escaper "^2.0.0" jest-changed-files@^24.9.0: version "24.9.0" @@ -4912,10 +5151,10 @@ jest-each@^24.9.0: jest-util "^24.9.0" pretty-format "^24.9.0" -jest-environment-enzyme@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-enzyme/-/jest-environment-enzyme-7.1.0.tgz#1181d174034a2a4d8ba8fd6ba2123f243ccaf7ec" - integrity sha512-31nPBYx1MZfihsKUgZg16zLS4+f4gBvo4YpYMU4TIvQ2IjbREU9bLFwAszTgcs5mkE7SNOykm/68OjPmgDd4/Q== +jest-environment-enzyme@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/jest-environment-enzyme/-/jest-environment-enzyme-7.1.2.tgz#4561f26a719e8e87ce8c9a6d3f540a92663ba8d5" + integrity sha512-3tfaYAzO7qZSRrv+srQnfK16Vu5XwH/pHi8FpoqSHjKKngbHzXf7aBCBuWh8y3w0OtknHRfDMFrC60Khj+g1hA== dependencies: jest-environment-jsdom "^24.0.0" @@ -4943,13 +5182,13 @@ jest-environment-node@^24.9.0: jest-util "^24.9.0" jest-enzyme@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-7.1.0.tgz#4345e989382a6cd70c15c7225dad9c9a9bb79cbc" - integrity sha512-ukL9jFwvQ3xbzhoKniDVTkAgZzGCFJNeJVU058RyY0R46fVhjJlPEV/hYlmJl518qfCmKNW6zXgtmyPcaDgxhA== + version "7.1.2" + resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-7.1.2.tgz#91a10b2d3be1b56c0d65b34286e5bdc41ab4ba3d" + integrity sha512-j+jkph3t5hGBS12eOldpfsnERYRCHi4c/0KWPMnqRPoJJXvCpLIc5th1MHl0xDznQDXVU0AHUXg3rqMrf8vGpA== dependencies: - enzyme-matchers "^7.1.0" + enzyme-matchers "^7.1.2" enzyme-to-json "^3.3.0" - jest-environment-enzyme "^7.1.0" + jest-environment-enzyme "^7.1.2" jest-get-type@^24.9.0: version "24.9.0" @@ -5213,11 +5452,6 @@ js-base64@^2.1.8, js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -5228,10 +5462,10 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.9.0, js-yaml@^3.9.1: - version "3.12.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" - integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== +js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.9.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -5344,9 +5578,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -5433,6 +5667,13 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levenary@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.0.tgz#fc146fe75f32dc483a0a2c64aef720f602cd6210" + integrity sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ== + dependencies: + leven "^3.1.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -5533,26 +5774,16 @@ lodash._getnative@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= -lodash._reinterpolate@~3.0.0: +lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clonedeep@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" @@ -5605,11 +5836,6 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.mergewith@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -5621,31 +5847,26 @@ lodash.tail@^4.1.1: integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= lodash.template@^4.2.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" lodash.templatesettings "^4.0.0" lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@^4.15.0, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.6.1: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -5731,6 +5952,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" @@ -5794,17 +6020,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.22" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" - integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: - mime-db "~1.38.0" + mime-db "1.43.0" mimic-fn@^1.0.0: version "1.2.0" @@ -5838,26 +6064,6 @@ minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== - dependencies: - minipass "^2.2.1" - mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -5875,9 +6081,9 @@ mississippi@^2.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5925,19 +6131,19 @@ ms@2.0.0: integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.10.0, nan@^2.9.2: - version "2.12.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" - integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== +nan@^2.12.1, nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -5962,9 +6168,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= nearley@^2.7.10: - version "2.18.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.18.0.tgz#a9193612dd6d528a2e47e743b1dc694cfe105223" - integrity sha512-/zQOMCeJcioI0xJtd5RpBiWw2WP7wLe6vq8/3Yu0rEwgus/G/+pViX80oA87JdVgjRt2895mZSv2VfZmy4W1uw== + version "2.19.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.0.tgz#37717781d0fd0f2bfc95e233ebd75678ca4bda46" + integrity sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA== dependencies: commander "^2.19.0" moo "^0.4.3" @@ -5972,26 +6178,12 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - neo-async@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== - -neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -next-tick@1: +next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= @@ -6038,9 +6230,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -6052,7 +6244,7 @@ node-libs-browser@^2.0.0: events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -6064,7 +6256,7 @@ node-libs-browser@^2.0.0: tty-browserify "0.0.0" url "^0.11.0" util "^0.11.0" - vm-browserify "0.0.4" + vm-browserify "^1.0.1" node-modules-regexp@^1.0.0: version "1.0.0" @@ -6082,33 +6274,17 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-releases@^1.1.44: + version "1.1.45" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2" + integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg== dependencies: - 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" - -node-releases@^1.1.25: - version "1.1.28" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.28.tgz#503c3c70d0e4732b84e7aaa2925fbdde10482d4a" - integrity sha512-AQw4emh6iSXnCpDiFe0phYcThiccmkNWMZnFZ+lDJjAP8J0m2fVd59duvUUyuTirQOhIAajTFkzG6FHCLBO59g== - dependencies: - semver "^5.3.0" + semver "^6.3.0" -node-sass@^4.9.2: - version "4.11.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a" - integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA== +node-sass@^4.12.0, node-sass@^4.9.2: + version "4.13.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066" + integrity sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -6117,12 +6293,10 @@ node-sass@^4.9.2: get-stdin "^4.0.1" glob "^7.0.3" in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - lodash.mergewith "^4.6.0" + lodash "^4.17.15" meow "^3.7.0" mkdirp "^0.5.1" - nan "^2.10.0" + nan "^2.13.2" node-gyp "^3.8.0" npmlog "^4.0.0" request "^2.88.0" @@ -6131,9 +6305,9 @@ node-sass@^4.9.2: "true-case-path" "^1.0.2" node@^10.0.0: - version "10.15.3" - resolved "https://registry.yarnpkg.com/node/-/node-10.15.3.tgz#ab238afa60540e04adcb349265d32b480d3f733a" - integrity sha512-8FAchZpzFwaxNLcdgr1QrXMj2D5taqRi6DwW70d560HApdHW+bkrdLjiGcPZCRG3xVxtvv1JAkCKilIPHvhljA== + version "10.18.1" + resolved "https://registry.yarnpkg.com/node/-/node-10.18.1.tgz#f3228f223df9feb13e9b14a04130ace74db3877b" + integrity sha512-q1a2p7bUcAGN3NCpIkD3J/RtXXUToiwaqgJHzAZltHFZVq37l3+XQq/G1fU5limbxdUYf0LNEs/b6Icz/JGMog== dependencies: node-bin-setup "^1.0.0" @@ -6144,14 +6318,6 @@ node@^10.0.0: dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -6189,18 +6355,10 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== npm-run-path@^2.0.0: version "2.0.2" @@ -6209,7 +6367,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -6219,7 +6377,7 @@ npm-run-path@^2.0.0: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@~1.0.1: +nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== @@ -6237,9 +6395,9 @@ number-is-nan@^1.0.0: integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.0.7: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== oauth-sign@~0.9.0: version "0.9.0" @@ -6265,26 +6423,21 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-is@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" - integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= +object-is@^1.0.1, object-is@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== -object-keys@^1.0.11: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-keys@^1.0.12: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" - integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -6302,33 +6455,33 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.0.4, object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" - integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== +object.entries@^1.1.0, object.entries@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" -object.fromentries@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" - integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.11.0" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" - has "^1.0.1" + has "^1.0.3" object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -6337,13 +6490,13 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.0.4, object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" @@ -6366,33 +6519,25 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optimize-css-assets-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz#09a40c4cefde1dd0142444a873c56aa29eb18e6f" - integrity sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.1.tgz#9d18654a0e058c090bdd991b04bcb0f6f2486573" + integrity sha512-FSoF15xKSEM2qCE3/y2gH92PysJSBY58Wx/hmSdIzVSOd0vg+FRS28NWZADId1wh6PDlbVt0lfPduV0IBufItQ== dependencies: - cssnano "^3.4.0" + cssnano "^4.1.10" last-call-webpack-plugin "^2.1.2" optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" os-browserify@^0.3.0: version "0.3.0" @@ -6425,7 +6570,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -6433,15 +6578,6 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" - integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== - dependencies: - graceful-fs "^4.1.11" - is-plain-obj "^1.1.0" - mkdirp "^0.5.1" - p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -6462,9 +6598,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: p-try "^2.0.0" @@ -6503,18 +6639,18 @@ pako@~1.0.5: integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: - cyclist "~0.2.2" + cyclist "^1.0.1" inherits "^2.0.3" readable-stream "^2.1.5" parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -6555,10 +6691,10 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-complete-extname@^1.0.0: version "1.0.0" @@ -6757,15 +6893,25 @@ postcss-calc@^6.0.0: postcss-selector-parser "^2.2.2" reduce-css-calc "^2.0.0" +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + postcss-color-function@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.0.1.tgz#402b3f2cebc3f6947e618fb6be3654fbecef6444" - integrity sha1-QCs/LOvD9pR+YY+2vjZU++zvZEQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.1.0.tgz#b6f9355e07b12fcc5c34dab957834769b03d8f57" + integrity sha512-2/fuv6mP5Lt03XbRpVfMdGC8lRP1sykme+H1bR4ARyOmSMB8LPSjcL6EAI1iX6dqUF+jNEvKIVVXhan1w/oFDQ== dependencies: css-color-function "~1.3.3" - postcss "^6.0.1" + postcss "^6.0.23" postcss-message-helpers "^2.0.0" - postcss-value-parser "^3.3.0" + postcss-value-parser "^3.3.1" postcss-color-gray@^4.0.0: version "4.1.0" @@ -6839,6 +6985,17 @@ postcss-colormin@^2.1.8: postcss "^5.0.13" postcss-value-parser "^3.2.3" +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" @@ -6847,6 +7004,14 @@ postcss-convert-values@^2.3.4: postcss "^5.0.11" postcss-value-parser "^3.1.2" +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-cssnext@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/postcss-cssnext/-/postcss-cssnext-3.1.0.tgz#927dc29341a938254cde38ea60a923b9dfedead9" @@ -6914,6 +7079,13 @@ postcss-discard-comments@^2.0.4: dependencies: postcss "^5.0.14" +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" @@ -6921,6 +7093,13 @@ postcss-discard-duplicates@^2.0.1: dependencies: postcss "^5.0.4" +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + postcss-discard-empty@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" @@ -6928,6 +7107,13 @@ postcss-discard-empty@^2.0.1: dependencies: postcss "^5.0.14" +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + postcss-discard-overridden@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" @@ -6935,6 +7121,13 @@ postcss-discard-overridden@^0.1.1: dependencies: postcss "^5.0.16" +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + postcss-discard-unused@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" @@ -6991,11 +7184,11 @@ postcss-initial@^2.0.0: postcss "^6.0.1" postcss-load-config@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" - integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== dependencies: - cosmiconfig "^4.0.0" + cosmiconfig "^5.0.0" import-cwd "^2.0.0" postcss-loader@^2.1.5: @@ -7036,6 +7229,16 @@ postcss-merge-longhand@^2.0.1: dependencies: postcss "^5.0.4" +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" @@ -7047,6 +7250,18 @@ postcss-merge-rules@^2.0.3: postcss-selector-parser "^2.2.2" vendors "^1.0.0" +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" @@ -7061,6 +7276,14 @@ postcss-minify-font-values@^1.0.2: postcss "^5.0.4" postcss-value-parser "^3.0.2" +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-minify-gradients@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" @@ -7069,6 +7292,16 @@ postcss-minify-gradients@^1.0.1: postcss "^5.0.12" postcss-value-parser "^3.3.0" +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-minify-params@^1.0.4: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" @@ -7079,6 +7312,18 @@ postcss-minify-params@^1.0.4: postcss-value-parser "^3.0.2" uniqs "^2.0.0" +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + postcss-minify-selectors@^2.0.4: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" @@ -7089,6 +7334,16 @@ postcss-minify-selectors@^2.0.4: postcss "^5.0.14" postcss-selector-parser "^2.0.0" +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + postcss-modules-extract-imports@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" @@ -7134,6 +7389,69 @@ postcss-normalize-charset@^1.1.0: dependencies: postcss "^5.0.5" +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-normalize-url@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" @@ -7144,6 +7462,24 @@ postcss-normalize-url@^3.0.7: postcss "^5.0.14" postcss-value-parser "^3.2.3" +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" @@ -7152,6 +7488,15 @@ postcss-ordered-values@^2.1.0: postcss "^5.0.4" postcss-value-parser "^3.0.1" +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-pseudo-class-any-link@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-4.0.0.tgz#9152a0613d3450720513e8892854bae42d0ee68e" @@ -7182,6 +7527,16 @@ postcss-reduce-initial@^1.0.0: dependencies: postcss "^5.0.4" +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-reduce-transforms@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" @@ -7191,6 +7546,16 @@ postcss-reduce-transforms@^1.0.3: postcss "^5.0.8" postcss-value-parser "^3.0.1" +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + postcss-replace-overflow-wrap@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz#794db6faa54f8db100854392a93af45768b4e25b" @@ -7223,6 +7588,24 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2, postcss-selector indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" @@ -7233,6 +7616,16 @@ postcss-svgo@^2.1.1: postcss-value-parser "^3.2.3" svgo "^0.7.0" +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + postcss-unique-selectors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" @@ -7242,7 +7635,16 @@ postcss-unique-selectors@^2.0.2: postcss "^5.0.4" uniqs "^2.0.0" -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== @@ -7275,7 +7677,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.18, postcss@^6.0.22, postcss@^6.0.5, postcss@^6.0.6: +postcss@^6.0, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.18, postcss@^6.0.22, postcss@^6.0.23, postcss@^6.0.5, postcss@^6.0.6: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -7284,10 +7686,10 @@ postcss@^6.0, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.2: - version "7.0.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" - integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2, postcss@^7.0.5: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -7319,9 +7721,9 @@ private@^0.1.6, private@^0.1.8: integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" @@ -7346,9 +7748,9 @@ promise@^7.1.1: asap "~2.0.3" prompts@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" - integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== dependencies: kleur "^3.0.3" sisteransi "^1.0.3" @@ -7381,15 +7783,10 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== - -psl@^1.1.28: - version "1.3.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" - integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== +psl@^1.1.24, psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== public-encrypt@^4.0.0: version "4.0.3" @@ -7471,7 +7868,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -raf@^3.4.0: +raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== @@ -7506,25 +7903,15 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-dom@^16.4.1: - version "16.8.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.4.tgz#1061a8e01a2b3b0c8160037441c3bf00a0e3bc48" - integrity sha512-Ob2wK7XG2tUDt7ps7LtLzGYYB6DXMCLj0G5fO6WeEICtT4/HdpOi7W/xLzZnR6RCG1tYza60nMdqtxzA8FaPJQ== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.4" + scheduler "^0.18.0" react-fine-uploader@^1.1.0: version "1.1.1" @@ -7553,15 +7940,10 @@ react-inlinesvg@^0.8.1: httpplease "^0.16.4" once "^1.4.0" -react-is@^16.8.1: - version "16.8.4" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2" - integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA== - -react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" - integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== +react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -7592,9 +7974,9 @@ react-spinkit@^3.0.0: prop-types "^15.5.8" react-split-pane@^0.1.87: - version "0.1.87" - resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.87.tgz#a7027ae554abfacca35f5f780288b07fe4ec4cbd" - integrity sha512-F22jqWyKB1WximT0U5HKdSuB9tmJGjjP+WUyveHxJJys3ANsljj163kCdsI6M3gdfyCVC+B2rq8sc5m2Ko02RA== + version "0.1.89" + resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.89.tgz#e111e5f7e6e1cd3c86a5aa0d9ddf987c2165f0d0" + integrity sha512-bGEiOevi6nBE1evEJOsZjd5A7plLboFAU4+HGASWWVm94XUg7QdsuPInGOB+5Ym4RtY3TZCpmUvLe6qQmrZUOg== dependencies: prop-types "^15.5.10" react-lifecycles-compat "^3.0.4" @@ -7608,36 +7990,36 @@ react-style-proptype@^3.0.0: prop-types "^15.5.4" react-test-renderer@^16.0.0-0: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.9.0.tgz#7ed657a374af47af88f66f33a3ef99c9610c8ae9" - integrity sha512-R62stB73qZyhrJo7wmCW9jgl/07ai+YzvouvCXIJLBkRlRqLx4j9RqcLEAfNfU3OxTGucqR2Whmn3/Aad6L3hQ== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f" + integrity sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w== dependencies: object-assign "^4.1.1" prop-types "^15.6.2" - react-is "^16.9.0" - scheduler "^0.15.0" + react-is "^16.8.6" + scheduler "^0.18.0" react-toggle@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.0.2.tgz#77f487860efb87fafd197672a2db8c885be1440f" - integrity sha512-EPTWnN7gQHgEAUEmjheanZXNzY5TPnQeyyHfEs3YshaiWZf5WNjfYDrglO5F1Hl/dNveX18i4l0grTEsYH2Ccw== + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.1.tgz#2317f67bf918ea3508a96b09dd383efd9da572af" + integrity sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw== dependencies: classnames "^2.2.5" react-tooltip@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-3.10.0.tgz#268b5ef519fd8a1369288d1f086f42c90d5da7ef" - integrity sha512-GGdxJvM1zSFztkTP7gCQbLTstWr1OOoMpJ5WZUGhimj0nhRY+MPz+92MpEnKmj0cftJ9Pd/M6FfSl0sfzmZWkg== + version "3.11.2" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-3.11.2.tgz#78972910657d6184defdcdc9a0182c1e44e01ce6" + integrity sha512-7EJ7Cv7lgctw02j0hyp+PpJklIP3gyDbm4CvVQvq7U6zgZtuI+bFFnRzsQB1oTiHPkkhE2NU04EIkgBDiVNzxw== dependencies: classnames "^2.2.5" prop-types "^15.6.0" react-transition-group@2.x: - version "2.6.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.6.0.tgz#3c41cbdd9c044c5f8604d4e8d319e860919c9fae" - integrity sha512-VzZ+6k/adL3pJHo4PU/MHEPjW59/TGQtRsXC+wnxsx2mxjQKNHnDdJL/GpYuPJIsyHGjYbBQfIJ2JNOAdPc8GQ== + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: - dom-helpers "^3.3.1" + dom-helpers "^3.4.0" loose-envify "^1.4.0" prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" @@ -7654,19 +8036,20 @@ react-transition-group@^1.2.1: warning "^3.0.0" react@^16.2.0: - version "16.8.4" - resolved "https://registry.yarnpkg.com/react/-/react-16.8.4.tgz#fdf7bd9ae53f03a9c4cd1a371432c206be1c4768" - integrity sha512-0GQ6gFXfUH7aZcjGVymlPOASTuSjlQL4ZtVC5YKH+3JL6bBLCVO21DknzmaPlI90LN253ojj02nsapy+j7wIjg== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.4" -react_ujs@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/react_ujs/-/react_ujs-2.4.4.tgz#49bac535d24024a96b0a35d7514d18188aea42bc" - integrity sha512-RON6mgV+I3s6KkmvxTQi+WGuoLbhZ+TzRat06EE/RHFvzU+Na1Eom6XnesQeOP7WCrTZGOdcZEPP0P7QrJrHfg== +react_ujs@^2.4.4, react_ujs@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/react_ujs/-/react_ujs-2.6.1.tgz#a202a33c95c9e2bb18ab56926b7e79f3325ec855" + integrity sha512-9M33/A8cubStkZ2cpJSimcTD0RlCWiqXF6e90IQmMw/Caf/W0dtAzOtHtiQE3JjLbt/nhRR7NLPxMfnlm141ig== + dependencies: + react_ujs "^2.6.0" read-cache@^1.0.0: version "1.0.0" @@ -7727,9 +8110,9 @@ read-pkg@^3.0.0: path-type "^3.0.0" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7782,19 +8165,19 @@ reduce-css-calc@^1.2.6, reduce-css-calc@^1.2.7: reduce-function-call "^1.0.1" reduce-css-calc@^2.0.0: - version "2.1.6" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.6.tgz#050fe6ee7d98a1d70775d2e93ce0b713cee394d2" - integrity sha512-+l5/qlQmdsbM9h6JerJ/y5vR5Ci0k93aszLNpCmbadC3nBcbRGmIBm0s9Nj59i22LvCjTGftWzdQRwdknayxhw== + version "2.1.7" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz#1ace2e02c286d78abcd01fd92bfe8097ab0602c2" + integrity sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA== dependencies: css-unit-converter "^1.1.1" postcss-value-parser "^3.3.0" reduce-function-call@^1.0.1, reduce-function-call@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= + version "1.0.3" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== dependencies: - balanced-match "^0.4.2" + balanced-match "^1.0.0" reflect.ownkeys@^0.2.0: version "0.2.0" @@ -7823,12 +8206,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== - -regenerator-runtime@^0.13.3: +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== @@ -7857,11 +8235,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.6: - version "0.1.12" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.12.tgz#28eaaa6e66eeb3527c15108a3ff740d9e574e420" - integrity sha512-TsXZ8+cv2uxMEkLfgwO0E068gsNMLfuYwMMhiUxf0Kw2Vcgzq93vgl6wIlIYuPmfMqMjfQ9zAporiozqCnwLuQ== - regexpp@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" @@ -7885,10 +8258,10 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.5.4: - version "4.5.5" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.5.tgz#aaffe61c2af58269b3e516b61a73790376326411" - integrity sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ== +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.1.0" @@ -7903,9 +8276,9 @@ regjsgen@^0.2.0: integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.1.4: version "0.1.5" @@ -7915,9 +8288,9 @@ regjsparser@^0.1.4: jsesc "~0.5.0" regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + version "0.6.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.2.tgz#fd62c753991467d9d1ffe0a9f67f27a529024b96" + integrity sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q== dependencies: jsesc "~0.5.0" @@ -7943,19 +8316,19 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== dependencies: - lodash "^4.17.11" + lodash "^4.17.15" request-promise-native@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== dependencies: - request-promise-core "1.1.2" + request-promise-core "1.1.3" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -7990,11 +8363,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -8040,17 +8408,10 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.7, resolve@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== - dependencies: - path-parse "^1.0.6" - -resolve@^1.3.2: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" + integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== dependencies: path-parse "^1.0.6" @@ -8072,11 +8433,21 @@ rgb-hex@^2.1.0: resolved "https://registry.yarnpkg.com/rgb-hex/-/rgb-hex-2.1.0.tgz#c773c5fe2268a25578d92539a82a7a5ce53beda6" integrity sha1-x3PF/iJoolV42SU5qCp6XOU77aY= +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + rgb@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5" integrity sha1-vieykej+/+rBvZlylyG/pA/AN7U= +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -8084,20 +8455,20 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^2.6.3: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -8145,16 +8516,16 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -8203,23 +8574,15 @@ sass-loader@^6.0.7: neo-async "^2.5.0" pify "^3.0.0" -sax@^1.2.4, sax@~1.2.1: +sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.4.tgz#8fef05e7a3580c76c0364d2df5e550e4c9140298" - integrity sha512-cvSOlRPxOHs5dAhP9yiS/6IDmVAVxmk33f0CtTJRkmUWcb1Us+t7b1wqdzoC0REw2muC9V5f1L/w5R5uKGaepA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scheduler@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e" - integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -8247,16 +8610,16 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -"semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -8268,29 +8631,19 @@ semver@~5.3.0: integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= serialize-javascript@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" - integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - 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.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -8349,9 +8702,9 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sisteransi@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" - integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== slash@^1.0.0: version "1.0.0" @@ -8413,11 +8766,11 @@ source-list-map@^2.0.0: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -8431,9 +8784,9 @@ source-map-support@^0.4.15: source-map "^0.5.6" source-map-support@^0.5.6: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -8482,9 +8835,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" - integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -8520,6 +8873,11 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" @@ -8573,9 +8931,9 @@ stream-http@^2.7.2: xtend "^4.0.0" stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== strict-uri-encode@^1.0.0: version "1.1.0" @@ -8616,23 +8974,32 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.trim@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" - integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== +string.prototype.trim@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" + integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== dependencies: define-properties "^1.1.3" - es-abstract "^1.13.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" -string_decoder@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== dependencies: - safe-buffer "~5.1.0" + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" -string_decoder@^1.1.1: +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -8704,6 +9071,15 @@ style-loader@^0.21.0: loader-utils "^1.1.0" schema-utils "^0.4.5" +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -8750,6 +9126,25 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + symbol-tree@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -8773,27 +9168,14 @@ tapable@^0.2.7: integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== dependencies: block-stream "*" - fstream "^1.0.2" + fstream "^1.0.12" inherits "2" -tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== - dependencies: - 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" - test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -8828,16 +9210,21 @@ through@^2.3.6: integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== dependencies: setimmediate "^1.0.4" +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + tlds@^1.121.0: - version "1.203.1" - resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" - integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== + version "1.207.0" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.207.0.tgz#459264e644cf63ddc0965fece3898913286b1afd" + integrity sha512-k7d7Q1LqjtAvhtEOs3yN14EabsNO8ZCoY6RESSJDB9lst3bTx3as/m1UuAeCKzYxiyhR1qq72ZPhpSf+qlqiwg== tmp@^0.0.33: version "0.0.33" @@ -8960,15 +9347,25 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= ua-parser-js@^0.7.18: - version "0.7.19" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" - integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uc.micro@^1.0.1: version "1.0.6" @@ -8993,14 +9390,6 @@ uglify-js@^2.8.29: optionalDependencies: uglify-to-browserify "~1.0.0" -uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== - dependencies: - commander "~2.20.0" - source-map "~0.6.1" - uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -9053,14 +9442,14 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" uniq@^1.0.1: version "1.0.1" @@ -9080,9 +9469,9 @@ unique-filename@^1.1.0: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" @@ -9094,6 +9483,11 @@ units-css@^0.4.0: isnumeric "^0.2.0" viewport-dimensions "^0.2.0" +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -9102,15 +9496,10 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.5, upath@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.1.tgz#497f7c1090b0818f310bbfb06783586a68d28014" - integrity sha512-D0yetkpIOKiZQquxjM2Syvy48Y1DbZ0SWxgsZiwd9GCWRpc75vN8ytzem14WDSg+oiX6+Qt31FpiS/ExODCrLg== - -upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== +upath@^1.0.5, upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: version "4.2.2" @@ -9149,7 +9538,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0: +util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -9172,9 +9561,9 @@ util@^0.11.0: inherits "2.0.3" uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -9185,9 +9574,9 @@ validate-npm-package-license@^3.0.1: spdx-expression-parse "^3.0.0" vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" + integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== verror@1.10.0: version "1.10.0" @@ -9203,12 +9592,10 @@ viewport-dimensions@^0.2.0: resolved "https://registry.yarnpkg.com/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz#de740747db5387fd1725f5175e91bac76afdf36c" integrity sha1-3nQHR9tTh/0XJfUXXpG6x2r982w= -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.1: version "1.0.1" @@ -9254,9 +9641,9 @@ webpack-manifest-plugin@^1.3.2: lodash ">=3.5 <5" webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" @@ -9321,9 +9708,9 @@ whatwg-url@^6.4.1: webidl-conversions "^4.0.2" whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -9363,25 +9750,20 @@ window-size@0.1.0: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" @@ -9441,9 +9823,9 @@ xmlhttprequest@*: integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== xtend@~3.0.0: version "3.0.0" @@ -9465,11 +9847,6 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== - yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"