diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b20acdfc..f966ebf9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,7 +77,7 @@ jobs: run: bundle exec rspec --color --format progress --require spec_helper --require rails_helper - name: Send coverage to CodeClimate - uses: paambaati/codeclimate-action@v2.7.4 + uses: paambaati/codeclimate-action@v3.0.0 continue-on-error: true if: ${{ success() || failure() }} env: diff --git a/Gemfile.lock b/Gemfile.lock index e4ebea24..d055eb52 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,9 @@ GIT remote: https://github.com/evolve75/RubyTree.git - revision: eb045068f73529c66d9d84f0553fdf85fc98bc4f + revision: 6081d0959b706dcefb85e85faa329ebb2dabcf9e specs: rubytree (1.0.2) - json (~> 2.3.1) + json (~> 2.6.1) structured_warnings (~> 0.4.0) GIT @@ -30,64 +30,64 @@ GEM remote: https://rubygems.org/ specs: ZenTest (4.12.0) - actioncable (6.1.4.1) - actionpack (= 6.1.4.1) - activesupport (= 6.1.4.1) + actioncable (6.1.4.4) + actionpack (= 6.1.4.4) + activesupport (= 6.1.4.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.4.1) - actionpack (= 6.1.4.1) - activejob (= 6.1.4.1) - activerecord (= 6.1.4.1) - activestorage (= 6.1.4.1) - activesupport (= 6.1.4.1) + actionmailbox (6.1.4.4) + actionpack (= 6.1.4.4) + activejob (= 6.1.4.4) + activerecord (= 6.1.4.4) + activestorage (= 6.1.4.4) + activesupport (= 6.1.4.4) mail (>= 2.7.1) - actionmailer (6.1.4.1) - actionpack (= 6.1.4.1) - actionview (= 6.1.4.1) - activejob (= 6.1.4.1) - activesupport (= 6.1.4.1) + actionmailer (6.1.4.4) + actionpack (= 6.1.4.4) + actionview (= 6.1.4.4) + activejob (= 6.1.4.4) + activesupport (= 6.1.4.4) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.4.1) - actionview (= 6.1.4.1) - activesupport (= 6.1.4.1) + actionpack (6.1.4.4) + actionview (= 6.1.4.4) + activesupport (= 6.1.4.4) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.4.1) - actionpack (= 6.1.4.1) - activerecord (= 6.1.4.1) - activestorage (= 6.1.4.1) - activesupport (= 6.1.4.1) + actiontext (6.1.4.4) + actionpack (= 6.1.4.4) + activerecord (= 6.1.4.4) + activestorage (= 6.1.4.4) + activesupport (= 6.1.4.4) nokogiri (>= 1.8.5) - actionview (6.1.4.1) - activesupport (= 6.1.4.1) + actionview (6.1.4.4) + activesupport (= 6.1.4.4) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.1.4.1) - activesupport (= 6.1.4.1) + activejob (6.1.4.4) + activesupport (= 6.1.4.4) globalid (>= 0.3.6) - activemodel (6.1.4.1) - activesupport (= 6.1.4.1) + activemodel (6.1.4.4) + activesupport (= 6.1.4.4) activemodel-serializers-xml (1.0.2) activemodel (> 5.x) activesupport (> 5.x) builder (~> 3.1) - activerecord (6.1.4.1) - activemodel (= 6.1.4.1) - activesupport (= 6.1.4.1) - activestorage (6.1.4.1) - actionpack (= 6.1.4.1) - activejob (= 6.1.4.1) - activerecord (= 6.1.4.1) - activesupport (= 6.1.4.1) + activerecord (6.1.4.4) + activemodel (= 6.1.4.4) + activesupport (= 6.1.4.4) + activestorage (6.1.4.4) + actionpack (= 6.1.4.4) + activejob (= 6.1.4.4) + activerecord (= 6.1.4.4) + activesupport (= 6.1.4.4) marcel (~> 1.0.0) mini_mime (>= 1.1.0) - activesupport (6.1.4.1) + activesupport (6.1.4.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -109,7 +109,7 @@ GEM bindex (0.8.1) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bootsnap (1.9.1) + bootsnap (1.9.3) msgpack (~> 1.0) bootstrap-will_paginate (1.0.0) will_paginate @@ -151,7 +151,7 @@ GEM database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) debug_inspector (1.1.0) - diff-lcs (1.4.4) + diff-lcs (1.5.0) docile (1.4.0) docker-api (2.2.0) excon (>= 0.47.0) @@ -162,37 +162,41 @@ GEM regexp_parser (~> 2.0) erubi (1.10.0) eventmachine (1.2.7) - excon (0.88.0) + excon (0.89.0) factory_bot (6.2.0) activesupport (>= 5.0.0) factory_bot_rails (6.2.0) factory_bot (~> 6.2.0) railties (>= 5.0.0) - faraday (1.8.0) + faraday (1.9.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) + faraday-net_http_persistent (~> 1.0) faraday-patron (~> 1.0) faraday-rack (~> 1.0) - multipart-post (>= 1.2, < 3) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-em_http (1.0.0) faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) faraday-httpclient (1.0.1) + faraday-multipart (1.0.2) + multipart-post (>= 1.2, < 3) faraday-net_http (1.0.1) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) + faraday-retry (1.0.3) faye-websocket (0.11.1) eventmachine (>= 0.12.0) websocket-driver (>= 0.5.1) ffi (1.15.4) forgery (0.8.1) - globalid (0.5.2) + globalid (1.0.0) activesupport (>= 5.0) haml (5.2.2) temple (>= 0.8.0) @@ -215,7 +219,8 @@ GEM builder (>= 1.0, < 4.0) oauth (>= 0.4.5, < 0.6) influxdb (0.8.1) - jbuilder (2.11.3) + jbuilder (2.11.5) + actionview (>= 5.0.0) activesupport (>= 5.0.0) jquery-rails (4.4.0) rails-dom-testing (>= 1, < 3) @@ -223,33 +228,33 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (6.0.1) railties (>= 3.2.16) - js-routes (2.1.2) + js-routes (2.2.0) railties (>= 4) - json (2.3.1) + json (2.6.1) json_schemer (0.2.18) ecma-re-validator (~> 0.3) hana (~> 1.3) regexp_parser (~> 2.0) uri_template (~> 0.7) jwt (2.3.0) - kaminari (1.2.1) + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) kramdown (2.3.1) rexml listen (3.7.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.12.0) + loofah (2.13.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -257,16 +262,16 @@ GEM marcel (1.0.2) matrix (0.4.2) method_source (1.0.0) - mime-types (3.3.1) + mime-types (3.4.1) mime-types-data (~> 3.2015) - mime-types-data (3.2021.0901) + mime-types-data (3.2022.0105) mimemagic (0.4.3) nokogiri (~> 1) rake mini_magick (4.11.0) mini_mime (1.1.2) mini_portile2 (2.5.3) - minitest (5.14.4) + minitest (5.15.0) minitest-autotest (1.1.1) minitest-server (~> 1.0) path_expander (~> 1.0) @@ -283,14 +288,14 @@ GEM net-http-persistent (4.0.1) connection_pool (~> 2.2) netrc (0.11.0) - newrelic_rpm (8.1.0) + newrelic_rpm (8.2.0) nio4r (2.5.8) nokogiri (1.11.7) mini_portile2 (~> 2.5.0) racc (~> 1.4) nyan-cat-formatter (0.12.0) rspec (>= 2.99, >= 2.14.2, < 4) - oauth (0.5.7) + oauth (0.5.8) oauth2 (1.4.7) faraday (>= 0.8, < 2.0) jwt (>= 1.0, < 3.0) @@ -300,11 +305,11 @@ GEM pagedown-bootstrap-rails (2.1.4) railties (> 3.1) parallel (1.21.0) - parser (3.0.2.0) + parser (3.1.0.0) ast (~> 2.4.1) path_expander (1.1.0) pg (1.2.3) - prometheus_exporter (0.8.1) + prometheus_exporter (1.0.1) webrick pry (0.13.1) coderay (~> 1.1) @@ -326,24 +331,24 @@ GEM rack-pjax (1.1.0) nokogiri (~> 1.5) rack (>= 1.1) - rack-proxy (0.7.0) + rack-proxy (0.7.2) rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (6.1.4.1) - actioncable (= 6.1.4.1) - actionmailbox (= 6.1.4.1) - actionmailer (= 6.1.4.1) - actionpack (= 6.1.4.1) - actiontext (= 6.1.4.1) - actionview (= 6.1.4.1) - activejob (= 6.1.4.1) - activemodel (= 6.1.4.1) - activerecord (= 6.1.4.1) - activestorage (= 6.1.4.1) - activesupport (= 6.1.4.1) + rails (6.1.4.4) + actioncable (= 6.1.4.4) + actionmailbox (= 6.1.4.4) + actionmailer (= 6.1.4.4) + actionpack (= 6.1.4.4) + actiontext (= 6.1.4.4) + actionview (= 6.1.4.4) + activejob (= 6.1.4.4) + activemodel (= 6.1.4.4) + activerecord (= 6.1.4.4) + activestorage (= 6.1.4.4) + activesupport (= 6.1.4.4) bundler (>= 1.15.0) - railties (= 6.1.4.1) + railties (= 6.1.4.4) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -354,9 +359,9 @@ GEM nokogiri (>= 1.6) rails-html-sanitizer (1.4.2) loofah (~> 2.3) - rails-i18n (6.0.0) + rails-i18n (7.0.1) i18n (>= 0.7, < 2) - railties (>= 6.0.0, < 7) + railties (>= 6.0.0, < 8) rails-timeago (2.19.1) actionpack (>= 3.1) activesupport (>= 3.1) @@ -372,15 +377,15 @@ GEM rails (>= 5.0, < 7) remotipart (~> 1.3) sassc-rails (>= 1.3, < 3) - railties (6.1.4.1) - actionpack (= 6.1.4.1) - activesupport (= 6.1.4.1) + railties (6.1.4.4) + actionpack (= 6.1.4.4) + activesupport (= 6.1.4.4) method_source rake (>= 0.13) thor (~> 1.0) rainbow (3.0.0) rake (13.0.6) - ransack (2.4.2) + ransack (2.5.0) activerecord (>= 5.2.4) activesupport (>= 5.2.4) i18n @@ -388,7 +393,7 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) rbtree (0.4.4) - regexp_parser (2.1.1) + regexp_parser (2.2.0) remotipart (1.4.4) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) @@ -421,28 +426,28 @@ GEM rspec-mocks (~> 3.10) rspec-support (~> 3.10) rspec-support (3.10.3) - rubocop (1.23.0) + rubocop (1.24.1) parallel (~> 1.10) parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 1.12.0, < 2.0) + rubocop-ast (>= 1.15.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.13.0) + rubocop-ast (1.15.1) parser (>= 3.0.1.1) - rubocop-performance (1.12.0) + rubocop-performance (1.13.1) rubocop (>= 1.7.0, < 2.0) rubocop-ast (>= 0.4.0) - rubocop-rails (2.12.4) + rubocop-rails (2.13.1) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.7.0, < 2.0) - rubocop-rspec (2.6.0) + rubocop-rspec (2.7.0) rubocop (~> 1.19) ruby-progressbar (1.11.0) - ruby-vips (2.1.3) + ruby-vips (2.1.4) ffi (~> 1.12) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -461,18 +466,18 @@ GEM rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2) semantic_range (3.0.0) - sentry-rails (4.8.0) + sentry-rails (4.8.3) railties (>= 5.0) - sentry-ruby-core (~> 4.8.0) - sentry-ruby (4.8.0) + sentry-ruby-core (~> 4.8.3) + sentry-ruby (4.8.3) concurrent-ruby (~> 1.0, >= 1.0.2) - faraday (>= 1.0) - sentry-ruby-core (= 4.8.0) - sentry-ruby-core (4.8.0) + faraday (~> 1.0) + sentry-ruby-core (= 4.8.3) + sentry-ruby-core (4.8.3) concurrent-ruby faraday set (1.0.2) - shoulda-matchers (5.0.0) + shoulda-matchers (5.1.0) activesupport (>= 5.2.0) simplecov (0.21.2) docile (~> 1.1) @@ -487,27 +492,27 @@ GEM actionpack (>= 3.1) railties (>= 3.1) slim (>= 3.0, < 5.0) - sorcery (0.16.1) + sorcery (0.16.2) bcrypt (~> 3.1) oauth (~> 0.5, >= 0.5.5) oauth2 (~> 1.0, >= 0.8.0) sorted_set (1.0.3) rbtree set (~> 1.0) - spring (3.0.0) + spring (4.0.0) sprockets (4.0.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) ssrf_filter (1.0.7) structured_warnings (0.4.0) telegraf (2.0.0) influxdb temple (0.8.2) - thor (1.1.0) + thor (1.2.1) tilt (2.0.10) turbolinks (5.2.1) turbolinks-source (~> 5.2) @@ -543,7 +548,7 @@ GEM will_paginate (3.3.1) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.5.1) + zeitwerk (2.5.3) PLATFORMS ruby @@ -624,4 +629,4 @@ DEPENDENCIES whenever BUNDLED WITH - 2.2.29 + 2.3.4 diff --git a/app/assets/javascripts/dashboard.js b/app/assets/javascripts/dashboard.js index 6ae38079..38504849 100644 --- a/app/assets/javascripts/dashboard.js +++ b/app/assets/javascripts/dashboard.js @@ -68,7 +68,7 @@ $(document).on('turbolinks:load', function() { _.each(response.docker, function(data) { groups.update({ id: data.id, - visible: data.pool_size > 0 + visible: data.prewarmingPoolSize > 0 }); }); }; @@ -78,26 +78,27 @@ $(document).on('turbolinks:load', function() { dataset.add({ group: data.id, x: vis.moment(), - y: data.quantity + y: data.usedRunners }); }); }; var updateProgressBar = function(progress_bar, data) { - var percentage = Math.min(Math.round(data.quantity / data.pool_size * 100), 100); + var percentage = Math.min(Math.round(data.idleRunners / data.prewarmingPoolSize * 100), 100); progress_bar.attr({ - 'aria-valuemax': data.pool_size, - 'aria-valuenow': data.quantity, + 'aria-valuemax': data.prewarmingPoolSize, + 'aria-valuenow': data.idleRunners, style: 'width: ' + percentage + '%' }); - progress_bar.html(data.quantity); + progress_bar.html(data.idleRunners); }; var updateTable = function(response) { _.each(response.docker, function(data) { var row = $('tbody tr[data-id=' + data.id + ']'); - $('.pool-size', row).html(data.pool_size); - var progress_bar = $('.quantity .progress .progress-bar', row); + $('.prewarming-pool-size', row).html(data.prewarmingPoolSize); + $('.used-runners', row).html(`+ ${data.usedRunners}`); + var progress_bar = $('.idle-runners .progress .progress-bar', row); updateProgressBar(progress_bar, data); }); }; diff --git a/app/assets/javascripts/editor/editor.js.erb b/app/assets/javascripts/editor/editor.js.erb index 3b0a0281..cce1c53e 100644 --- a/app/assets/javascripts/editor/editor.js.erb +++ b/app/assets/javascripts/editor/editor.js.erb @@ -17,6 +17,7 @@ var CodeOceanEditor = { //Request-For-Comments-Configuration REQUEST_FOR_COMMENTS_DELAY: 0, REQUEST_TOOLTIP_TIME: 5000, + REQUEST_TOOLTIP_DELAY: 10 * 60 * 1000, editors: [], editor_for_file: new Map(), @@ -170,7 +171,7 @@ var CodeOceanEditor = { this.active_frame = frame; frame.show(); - this.resizeParentOfAceEditor(frame.find('.ace_editor.ace-tm')); + this.resizeParentOfAceEditor(frame.find('.ace_editor')); }, getProgressBarClass: function (percentage) { @@ -406,7 +407,7 @@ var CodeOceanEditor = { initializeRegexes: function () { // These RegEx are run on the HTML escaped output! this.regex_for_language.set("ace/mode/python", /File "(.+?)", line (\d+)/g); - this.regex_for_language.set("ace/mode/java", /(.*\.java):(\d+):/g); + this.regex_for_language.set("ace/mode/java", /(?:\.\/)?(.*\.java):(\d+):/g); }, initializeTooltips: function () { @@ -444,10 +445,12 @@ var CodeOceanEditor = { setTimeout(function () { button.prop('disabled', false); - button.tooltip('show'); setTimeout(function () { - button.tooltip('hide'); - }, this.REQUEST_TOOLTIP_TIME); + button.tooltip('show'); + setTimeout(function () { + button.tooltip('hide'); + }, this.REQUEST_TOOLTIP_TIME); + }, this.REQUEST_TOOLTIP_DELAY) }.bind(this), this.REQUEST_FOR_COMMENTS_DELAY); }, @@ -623,15 +626,18 @@ var CodeOceanEditor = { }, jumpToSourceLine: function (event) { - var file = $(event.target).data('file'); - var line = $(event.target).data('line'); + const file = $(event.target).data('file'); + const line = $(event.target).data('line'); - // set active file, only needed for codepilot, so skipped for now - - var frame = $('div.frame[data-filename="' + file + '"]'); + const frame = $('div.frame[data-filename="' + file + '"]'); this.showFrame(frame); + this.toggleButtonStates(); - var editor = this.editor_for_file.get(file); + const file_id = frame.find('.editor').data('file-id'); + this.setActiveFile(frame.data('filename'), file_id); + this.selectFileInJsTree($('#files'), file_id); + + const editor = this.editor_for_file.get(file); editor.gotoLine(line, 0); event.preventDefault(); }, @@ -829,7 +835,11 @@ var CodeOceanEditor = { const percentile75 = data['working_time_75_percentile']; const accumulatedWorkTimeUser = data['working_time_accumulated']; - const minTimeIntervention = 10 * 60 * 1000; + let minTimeIntervention = 10 * 60 * 1000; + if ($('#editor').data('exercise-id') === 909) { + // 30 minutes for our large Map exercise + minTimeIntervention = 30 * 60 * 1000; + } let timeUntilIntervention; if ((accumulatedWorkTimeUser - percentile75) > 0) { diff --git a/app/assets/javascripts/editor/submissions.js b/app/assets/javascripts/editor/submissions.js index 219bae71..e8cae56e 100644 --- a/app/assets/javascripts/editor/submissions.js +++ b/app/assets/javascripts/editor/submissions.js @@ -115,7 +115,7 @@ CodeOceanEditorSubmissions = { this.showSpinner(this); this.ajax({ method: 'GET', - url: $('#start-over').data('url') + url: $('#start-over').data('url') || $('#start-over-active-file').data('url') }).done(function(response) { this.hideSpinner(); _.each(this.editors, function(editor) { @@ -196,9 +196,9 @@ CodeOceanEditorSubmissions = { const button = $(event.target) || $('#submit'); this.createSubmission(button, null, function (response) { if (response.redirect) { + this.unloadAutoSave(); this.editors = []; Turbolinks.clearCache(); - clearTimeout(this.autosaveTimer); Turbolinks.visit(response.redirect); } else if (response.status === 'container_depleted') { this.showContainerDepletedMessage(); diff --git a/app/controllers/community_solutions_controller.rb b/app/controllers/community_solutions_controller.rb index 414283c8..170bb0e5 100644 --- a/app/controllers/community_solutions_controller.rb +++ b/app/controllers/community_solutions_controller.rb @@ -29,16 +29,17 @@ class CommunitySolutionsController < ApplicationController if last_contribution.blank? last_contribution = @community_solution.exercise new_readme_file = {content: '', file_type: FileType.find_by(file_extension: '.txt'), hidden: false, read_only: false, name: 'ReadMe', role: 'regular_file', context: @community_solution} - @files << CodeOcean::File.create!(new_readme_file) + # If the first user did not save, the ReadMe file already exists + @files << CodeOcean::File.find_or_create_by!(new_readme_file) end all_visible_files = last_contribution.files.select(&:visible) # Add the ReadMe file first - @files += all_visible_files.select {|f| CodeOcean::File.find_by(id: f.file_id).context_type == 'CommunitySolution' } + @files += all_visible_files.select {|f| CodeOcean::File.find_by(id: f.file_id)&.context_type == 'CommunitySolution' } # Then, add all remaining files and sort them by name with extension - @files += (all_visible_files - @files).sort_by(&:name_with_extension) + @files += (all_visible_files - @files).sort_by(&:filepath) # Own Submission as a reference - @own_files = @submission.collect_files.select(&:visible).sort_by(&:name_with_extension) + @own_files = @submission.collect_files.select(&:visible).sort_by(&:filepath) # Remove the file_id from the second graph. Otherwise, the comparison and file-tree selection does not work as expected @own_files.map do |file| file.file_id = nil diff --git a/app/controllers/concerns/redirect_behavior.rb b/app/controllers/concerns/redirect_behavior.rb index 5292e0d7..a3d6fd24 100644 --- a/app/controllers/concerns/redirect_behavior.rb +++ b/app/controllers/concerns/redirect_behavior.rb @@ -5,7 +5,7 @@ module RedirectBehavior def redirect_after_submit Rails.logger.debug { "Redirecting user with score:s #{@submission.normalized_score}" } - if @submission.normalized_score.to_d == 1.0.to_d + if @submission.normalized_score.to_d == BigDecimal('1.0') if redirect_to_community_solution? redirect_to_community_solution return diff --git a/app/controllers/execution_environments_controller.rb b/app/controllers/execution_environments_controller.rb index 5bc8328e..bc05e631 100644 --- a/app/controllers/execution_environments_controller.rb +++ b/app/controllers/execution_environments_controller.rb @@ -4,7 +4,7 @@ class ExecutionEnvironmentsController < ApplicationController include CommonBehavior before_action :set_docker_images, only: %i[create edit new update] - before_action :set_execution_environment, only: MEMBER_ACTIONS + %i[execute_command shell statistics] + before_action :set_execution_environment, only: MEMBER_ACTIONS + %i[execute_command shell statistics sync_to_runner_management] before_action :set_testing_framework_adapters, only: %i[create edit new update] def authorize! @@ -166,6 +166,20 @@ class ExecutionEnvironmentsController < ApplicationController update_and_respond(object: @execution_environment, params: execution_environment_params) end + def sync_to_runner_management + return unless Runner.management_active? + + begin + Runner.strategy_class.sync_environment(@execution_environment) + rescue Runner::Error => e + Rails.logger.debug { "Runner error while synchronizing execution environment with id #{@execution_environment.id}: #{e.message}" } + Sentry.capture_exception(e) + redirect_to @execution_environment, alert: t('execution_environments.index.synchronize.failure', error: e.message) + else + redirect_to @execution_environment, notice: t('execution_environments.index.synchronize.success') + end + end + def sync_all_to_runner_management authorize ExecutionEnvironment @@ -179,6 +193,7 @@ class ExecutionEnvironmentsController < ApplicationController success << true rescue Runner::Error => e Rails.logger.debug { "Runner error while getting all execution environments: #{e.message}" } + Sentry.capture_exception(e) environments_to_remove = [] success << false end @@ -189,6 +204,7 @@ class ExecutionEnvironmentsController < ApplicationController Runner.strategy_class.sync_environment(execution_environment) rescue Runner::Error => e Rails.logger.debug { "Runner error while synchronizing execution environment with id #{execution_environment.id}: #{e.message}" } + Sentry.capture_exception(e) false end @@ -198,6 +214,7 @@ class ExecutionEnvironmentsController < ApplicationController Runner.strategy_class.remove_environment(execution_environment) rescue Runner::Error => e Rails.logger.debug { "Runner error while deleting execution environment with id #{execution_environment.id}: #{e.message}" } + Sentry.capture_exception(e) false end diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 54600a4d..b484d4b6 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -59,7 +59,7 @@ raise: false end def collect_paths(files) - unique_paths = files.map(&:path).reject(&:blank?).uniq + unique_paths = files.map(&:path).compact_blank.uniq subpaths = unique_paths.map do |path| Array.new((path.split('/').length + 1)) do |n| path.split('/').shift(n).join('/') @@ -321,7 +321,7 @@ raise: false @search = Search.new @search.exercise = @exercise @submission = current_user.submissions.where(exercise_id: @exercise.id).order('created_at DESC').first - @files = (@submission ? @submission.collect_files : @exercise.files).select(&:visible).sort_by(&:name_with_extension) + @files = (@submission ? @submission.collect_files : @exercise.files).select(&:visible).sort_by(&:filepath) @paths = collect_paths(@files) @user_id = if current_user.respond_to? :external_id diff --git a/app/controllers/ping_controller.rb b/app/controllers/ping_controller.rb index 3373da09..8ba2a7ad 100644 --- a/app/controllers/ping_controller.rb +++ b/app/controllers/ping_controller.rb @@ -15,8 +15,9 @@ class PingController < ApplicationController private def postgres_connected! + # any unhandled exception leads to a HTTP 500 response. ApplicationRecord.establish_connection ApplicationRecord.connection - ApplicationRecord.connected? + raise ActiveRecord::ConnectionNotEstablished unless ApplicationRecord.connected? end end diff --git a/app/controllers/proxy_exercises_controller.rb b/app/controllers/proxy_exercises_controller.rb index 74ff9908..d6f0863a 100644 --- a/app/controllers/proxy_exercises_controller.rb +++ b/app/controllers/proxy_exercises_controller.rb @@ -24,7 +24,7 @@ class ProxyExercisesController < ApplicationController def create myparams = proxy_exercise_params - myparams[:exercises] = Exercise.find(myparams[:exercise_ids].reject(&:empty?)) + myparams[:exercises] = Exercise.find(myparams[:exercise_ids].compact_blank) @proxy_exercise = ProxyExercise.new(myparams) authorize! @@ -78,7 +78,7 @@ class ProxyExercisesController < ApplicationController def update myparams = proxy_exercise_params - myparams[:exercises] = Exercise.find(myparams[:exercise_ids].reject(&:blank?)) + myparams[:exercises] = Exercise.find(myparams[:exercise_ids].compact_blank) update_and_respond(object: @proxy_exercise, params: myparams) end end diff --git a/app/controllers/study_groups_controller.rb b/app/controllers/study_groups_controller.rb index 1bd3a4fa..87b8f8ea 100644 --- a/app/controllers/study_groups_controller.rb +++ b/app/controllers/study_groups_controller.rb @@ -23,7 +23,7 @@ class StudyGroupsController < ApplicationController def update myparams = study_group_params myparams[:external_users] = - StudyGroupMembership.find(myparams[:study_group_membership_ids].reject(&:empty?)).map(&:user) + StudyGroupMembership.find(myparams[:study_group_membership_ids].compact_blank).map(&:user) myparams.delete(:study_group_membership_ids) update_and_respond(object: @study_group, params: myparams) end diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index 375142b1..de9cf368 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -27,12 +27,7 @@ class SubmissionsController < ApplicationController stringio = Zip::OutputStream.write_buffer do |zio| @files.each do |file| - zio.put_next_entry(if file.path.to_s == '' - file.name_with_extension - else - File.join(file.path, - file.name_with_extension) - end) + zio.put_next_entry(file.filepath) zio.write(file.content.presence || file.native_file.read) end @@ -247,12 +242,9 @@ class SubmissionsController < ApplicationController # parse remote request url content += "#{request.base_url}/evaluate\n" @submission.files.each do |file| - file_path = file.path.to_s == '' ? file.name_with_extension : File.join(file.path, file.name_with_extension) - content += "#{file_path}=#{file.file_id}\n" - end - File.open(path, 'w+') do |f| - f.write(content) + content += "#{file.filepath}=#{file.file_id}\n" end + File.write(path, content) path end @@ -317,7 +309,7 @@ class SubmissionsController < ApplicationController # @files contains all visible files for the user # @file contains the specific file requested for run / test / render / ... set_files - @file = @files.detect {|file| file.name_with_extension == sanitize_filename } + @file = @files.detect {|file| file.filepath == sanitize_filename } head :not_found unless @file end diff --git a/app/controllers/user_exercise_feedbacks_controller.rb b/app/controllers/user_exercise_feedbacks_controller.rb index bde9bd43..e07b9c4a 100644 --- a/app/controllers/user_exercise_feedbacks_controller.rb +++ b/app/controllers/user_exercise_feedbacks_controller.rb @@ -39,7 +39,7 @@ class UserExerciseFeedbacksController < ApplicationController authorize! if validate_inputs(uef_params) path = - if rfc && submission && submission.normalized_score.to_d == 1.0.to_d + if rfc && submission && submission.normalized_score.to_d == BigDecimal('1.0') request_for_comment_path(rfc) else implement_exercise_path(@exercise) @@ -82,7 +82,7 @@ class UserExerciseFeedbacksController < ApplicationController authorize! if @exercise && validate_inputs(uef_params) path = - if rfc && submission && submission.normalized_score.to_d == 1.0.to_d + if rfc && submission && submission.normalized_score.to_d == BigDecimal('1.0') request_for_comment_path(rfc) else implement_exercise_path(@exercise) diff --git a/app/helpers/admin/dashboard_helper.rb b/app/helpers/admin/dashboard_helper.rb index 1b209fb8..d6d48129 100644 --- a/app/helpers/admin/dashboard_helper.rb +++ b/app/helpers/admin/dashboard_helper.rb @@ -11,12 +11,29 @@ module Admin Runner.strategy_class.pool_size rescue Runner::Error => e Rails.logger.debug { "Runner error while fetching current pool size: #{e.message}" } - [] + {} end ExecutionEnvironment.order(:id).select(:id, :pool_size).map do |execution_environment| - execution_environment.attributes.merge(quantity: pool_size[execution_environment.id]) + # Fetch the actual values (ID is stored as a symbol) or get an empty hash for merge + actual = pool_size[execution_environment.id.to_s.to_sym] || {} + + template = { + id: execution_environment.id, + prewarmingPoolSize: execution_environment.pool_size, + idleRunners: 0, + usedRunners: 0, + } + + # Existing values in the template get replaced with actual values + template.merge(actual) end end + + def self.runner_management_release + Runner.strategy_class.release + rescue Runner::Error => e + e.inspect + end end end diff --git a/app/models/code_ocean/file.rb b/app/models/code_ocean/file.rb index 7bbba9b5..152286dd 100644 --- a/app/models/code_ocean/file.rb +++ b/app/models/code_ocean/file.rb @@ -41,7 +41,6 @@ module CodeOcean validates :feedback_message, if: :teacher_defined_assessment?, presence: true validates :feedback_message, absence: true, unless: :teacher_defined_assessment? - validates :file_type_id, presence: true validates :hashed_content, if: :content_present?, presence: true validates :hidden, boolean_presence: true validates :name, presence: true @@ -99,7 +98,7 @@ module CodeOcean private :incomplete_descendent? def name_with_extension - name + (file_type.file_extension || '') + name.to_s + (file_type&.file_extension || '') end def set_ancestor_values diff --git a/app/models/concerns/creation.rb b/app/models/concerns/creation.rb index ec16164f..926245bc 100644 --- a/app/models/concerns/creation.rb +++ b/app/models/concerns/creation.rb @@ -7,8 +7,5 @@ module Creation belongs_to :user, polymorphic: true alias_method :author, :user alias_method :creator, :user - - validates :user_id, presence: true - validates :user_type, presence: true end end diff --git a/app/models/execution_environment.rb b/app/models/execution_environment.rb index 2f16db6b..91c62898 100644 --- a/app/models/execution_environment.rb +++ b/app/models/execution_environment.rb @@ -36,6 +36,7 @@ class ExecutionEnvironment < ApplicationRecord after_destroy :delete_runner_environment after_save :working_docker_image?, if: :validate_docker_image? + after_update_commit :sync_runner_environment, unless: proc {|_| Rails.env.test? } after_rollback :delete_runner_environment, on: :create after_rollback :sync_runner_environment, on: %i[update destroy] @@ -79,7 +80,7 @@ class ExecutionEnvironment < ApplicationRecord def validate_docker_image? # We only validate the code execution with the provided image if there is at least one container to test with. - pool_size.positive? && docker_image.present? && !Rails.env.test? + pool_size.positive? && docker_image.present? && !Rails.env.test? && Runner.management_active? end def working_docker_image? @@ -92,9 +93,9 @@ class ExecutionEnvironment < ApplicationRecord rescue Runner::Error => e # In case of an Runner::Error, we retry multiple times before giving up. # The time between each retry increases to allow the runner management to catch up. - if retries < 5 && !Rails.env.test? + if retries < 30 && !Rails.env.test? retries += 1 - sleep retries + sleep 1.second.to_i retry elsif errors.exclude?(:docker_image) errors.add(:docker_image, "error: #{e}") @@ -104,7 +105,7 @@ class ExecutionEnvironment < ApplicationRecord end def delete_runner_environment - Runner.strategy_class.remove_environment(self) + Runner.strategy_class.remove_environment(self) if Runner.management_active? rescue Runner::Error => e unless errors.include?(:docker_image) errors.add(:docker_image, "error: #{e}") @@ -114,7 +115,7 @@ class ExecutionEnvironment < ApplicationRecord def sync_runner_environment previous_saved_environment = self.class.find(id) - Runner.strategy_class.sync_environment(previous_saved_environment) + Runner.strategy_class.sync_environment(previous_saved_environment) if Runner.management_active? rescue Runner::Error => e unless errors.include?(:docker_image) errors.add(:docker_image, "error: #{e}") diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 9aae3476..5f9a927a 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -49,7 +49,7 @@ class Exercise < ApplicationRecord MAX_GROUP_EXERCISE_FEEDBACKS = 20 def average_percentage - if average_score && (maximum_score.to_d != 0.0.to_d) && submissions.exists?(cause: 'submit') + if average_score && (maximum_score.to_d != BigDecimal('0.0')) && submissions.exists?(cause: 'submit') (average_score / maximum_score * 100).round(2) else 0 @@ -580,7 +580,7 @@ cause: %w[submit assess remoteSubmit remoteAssess]}).distinct private :valid_submission_deadlines? def needs_more_feedback?(submission) - if submission.normalized_score.to_d == 1.0.to_d + if submission.normalized_score.to_d == BigDecimal('1.0') user_exercise_feedbacks.final.size <= MAX_GROUP_EXERCISE_FEEDBACKS else user_exercise_feedbacks.intermediate.size <= MAX_GROUP_EXERCISE_FEEDBACKS diff --git a/app/models/external_user.rb b/app/models/external_user.rb index 9081f850..25df7be7 100644 --- a/app/models/external_user.rb +++ b/app/models/external_user.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class ExternalUser < User - validates :consumer_id, presence: true validates :external_id, presence: true def displayname diff --git a/app/models/proxy_exercise.rb b/app/models/proxy_exercise.rb index 6ef8cf7b..497a2d70 100644 --- a/app/models/proxy_exercise.rb +++ b/app/models/proxy_exercise.rb @@ -175,7 +175,7 @@ class ProxyExercise < ApplicationRecord return 0.0 end points_ratio = exercise.maximum_score(user) / max_score - if points_ratio.to_d == 0.0.to_d + if points_ratio.to_d == BigDecimal('0.0') Rails.logger.debug { "scoring user #{user.id} for exercise #{exercise.id}: points_ratio=#{points_ratio} score: 0" } return 0.0 elsif points_ratio > 1.0 diff --git a/app/models/runner.rb b/app/models/runner.rb index 63f080f1..67edef2e 100644 --- a/app/models/runner.rb +++ b/app/models/runner.rb @@ -6,7 +6,7 @@ class Runner < ApplicationRecord before_validation :request_id - validates :execution_environment, :user, :runner_id, presence: true + validates :runner_id, presence: true attr_accessor :strategy diff --git a/app/models/submission.rb b/app/models/submission.rb index d3281288..6b8a4fd8 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -45,7 +45,6 @@ class Submission < ApplicationRecord scope :in_study_group_of, ->(user) { where(study_group_id: user.study_groups) unless user.admin? } validates :cause, inclusion: {in: CAUSES} - validates :exercise_id, presence: true # after_save :trigger_working_times_action_cable @@ -160,7 +159,7 @@ class Submission < ApplicationRecord # @raise [Runner::Error] if the code could not be run due to a failure with the runner. # See the specific type and message for more details. def run(file, &block) - run_command = command_for execution_environment.run_command, file.name_with_extension + run_command = command_for execution_environment.run_command, file.filepath durations = {} prepared_runner do |runner, waiting_duration| durations[:execution_duration] = runner.attach_to_execution(run_command, &block) @@ -185,7 +184,7 @@ class Submission < ApplicationRecord end def run_test_file(file, runner, waiting_duration) - test_command = command_for execution_environment.test_command, file.name_with_extension + test_command = command_for execution_environment.test_command, file.filepath result = {file_role: file.role, waiting_for_container_time: waiting_duration} output = runner.execute_command(test_command, raise_exception: false) result.merge(output) @@ -222,7 +221,7 @@ class Submission < ApplicationRecord end def command_for(template, file) - filepath = collect_files.find {|f| f.name_with_extension == file }.filepath + filepath = collect_files.find {|f| f.filepath == file }.filepath template % command_substitutions(filepath) end @@ -255,7 +254,7 @@ class Submission < ApplicationRecord waiting_for_container_time: output[:waiting_for_container_time] ) - filename = file.name_with_extension + filename = file.filepath if file.teacher_defined_linter? LinterCheckRun.create_from(testrun, assessment) @@ -291,8 +290,9 @@ class Submission < ApplicationRecord score += output[:score] * output[:weight] unless output.nil? end end - update(score: score) - if normalized_score.to_d == 1.0.to_d + # Prevent floating point precision issues by converting to BigDecimal, e.g., for `0.28 * 25` + update(score: score.to_d) + if normalized_score.to_d == BigDecimal('1.0') Thread.new do RequestForComment.where(exercise_id: exercise_id, user_id: user_id, user_type: user_type).find_each do |rfc| rfc.full_score_reached = true diff --git a/app/models/user_exercise_intervention.rb b/app/models/user_exercise_intervention.rb index e246ae80..ff5e7749 100644 --- a/app/models/user_exercise_intervention.rb +++ b/app/models/user_exercise_intervention.rb @@ -4,8 +4,4 @@ class UserExerciseIntervention < ApplicationRecord belongs_to :user, polymorphic: true belongs_to :intervention belongs_to :exercise - - validates :user, presence: true - validates :exercise, presence: true - validates :intervention, presence: true end diff --git a/app/models/user_proxy_exercise_exercise.rb b/app/models/user_proxy_exercise_exercise.rb index 971d7e72..05a57c24 100644 --- a/app/models/user_proxy_exercise_exercise.rb +++ b/app/models/user_proxy_exercise_exercise.rb @@ -5,10 +5,5 @@ class UserProxyExerciseExercise < ApplicationRecord belongs_to :exercise belongs_to :proxy_exercise - validates :user_id, presence: true - validates :user_type, presence: true - validates :exercise_id, presence: true - validates :proxy_exercise_id, presence: true - validates :user_id, uniqueness: {scope: %i[proxy_exercise_id user_type]} end diff --git a/app/policies/execution_environment_policy.rb b/app/policies/execution_environment_policy.rb index a83b1f29..2e4be0e0 100644 --- a/app/policies/execution_environment_policy.rb +++ b/app/policies/execution_environment_policy.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class ExecutionEnvironmentPolicy < AdminOnlyPolicy - %i[execute_command? shell? statistics? show?].each do |action| + %i[execute_command? shell? statistics? show? sync_to_runner_management?].each do |action| define_method(action) { admin? || author? } end diff --git a/app/services/proforma_service/convert_task_to_exercise.rb b/app/services/proforma_service/convert_task_to_exercise.rb index 206bda18..f4ac2e63 100644 --- a/app/services/proforma_service/convert_task_to_exercise.rb +++ b/app/services/proforma_service/convert_task_to_exercise.rb @@ -40,9 +40,9 @@ module ProformaService end def task_files - @task_files ||= @task.all_files.reject {|file| file.id == 'ms-placeholder-file' }.map do |task_file| + @task_files ||= @task.all_files.reject {|file| file.id == 'ms-placeholder-file' }.to_h do |task_file| [task_file.id, codeocean_file_from_task_file(task_file)] - end.to_h + end end def codeocean_file_from_task_file(file) diff --git a/app/views/admin/dashboard/show.html.slim b/app/views/admin/dashboard/show.html.slim index 9bf07936..4925478f 100644 --- a/app/views/admin/dashboard/show.html.slim +++ b/app/views/admin/dashboard/show.html.slim @@ -10,33 +10,38 @@ h1 = t('breadcrumbs.dashboard.show') h2 Version div.mb-4 - = "CodeOcean Release:" + = application_name + =< t("admin.dashboard.show.release") + | : pre = Sentry.configuration.release - if Runner.management_active? div.mb-4 = Runner.strategy_class.name.demodulize - =< "Release:" - pre = Runner.strategy_class.release + =< t("admin.dashboard.show.release") + | : + pre = Admin::DashboardHelper.runner_management_release h2 Docker - if Runner.management_active? - h3 = t('.current') + h3 = t('admin.dashboard.show.current') .table-responsive table.table thead tr th = t('activerecord.models.execution_environment.one') th = t('activerecord.attributes.execution_environment.pool_size') - th = t('.quantity') + th = t('admin.dashboard.show.idleRunners') + th = t('admin.dashboard.show.usedRunners') tbody - ExecutionEnvironment.order(:name).each do |execution_environment| tr data-id=execution_environment.id td.name = link_to_if(policy(execution_environment).show?, execution_environment, execution_environment) - td.pool-size - td.quantity = progress_bar(0) - h3 = t('.history') + td.prewarming-pool-size + td.idle-runners = progress_bar(0) + td.used-runners + h3 = t('admin.dashboard.show.history') #graph - else - p = t('.inactive') + p = t('admin.dashboard.show.inactive') diff --git a/app/views/code_ocean/files/_form.html.slim b/app/views/code_ocean/files/_form.html.slim index a00912c0..bfdf2257 100644 --- a/app/views/code_ocean/files/_form.html.slim +++ b/app/views/code_ocean/files/_form.html.slim @@ -4,13 +4,17 @@ = f.text_field(:name, class: 'form-control', required: true) .form-group = f.label(:path, t('activerecord.attributes.file.path')) - = f.select(:path, @paths, {}, class: 'form-control') + |   + a.toggle-input data={text_initial: t('shared.new'), text_toggled: t('shared.back')} href='#' = t('shared.new') + .original-input = f.select(:path, @paths, {}, class: 'form-control') + = f.text_field(:path, class: 'alternative-input form-control', disabled: true) .form-group = f.label(:file_type_id, t('activerecord.attributes.file.file_type_id')) = f.collection_select(:file_type_id, FileType.where(binary: false).order(:name), :id, :name, {selected: @exercise.execution_environment.file_type.try(:id)}, class: 'form-control') - .form-group - = f.label(:file_template_id, t('activerecord.attributes.file.file_template_id')) - = f.collection_select(:file_template_id, FileTemplate.all.order(:name), :id, :name, {:include_blank => true}, class: 'form-control') + - if FileTemplate.any? + .form-group + = f.label(:file_template_id, t('activerecord.attributes.file.file_template_id')) + = f.collection_select(:file_template_id, FileTemplate.all.order(:name), :id, :name, {:include_blank => true}, class: 'form-control') = f.hidden_field(:context_id) .d-none#noTemplateLabel data-text=t('file_template.no_template_label') .actions = render('shared/submit_button', f: f, object: CodeOcean::File.new) diff --git a/app/views/code_ocean/files/show.json.jbuilder b/app/views/code_ocean/files/show.json.jbuilder index 94cef071..06f5996e 100644 --- a/app/views/code_ocean/files/show.json.jbuilder +++ b/app/views/code_ocean/files/show.json.jbuilder @@ -1,3 +1,3 @@ # frozen_string_literal: true -json.extract! @file, :id, :name_with_extension +json.extract! @file, :id, :filepath diff --git a/app/views/execution_environments/show.html.slim b/app/views/execution_environments/show.html.slim index e1b15ec6..fbc58f0e 100644 --- a/app/views/execution_environments/show.html.slim +++ b/app/views/execution_environments/show.html.slim @@ -1,6 +1,12 @@ -h1 - = @execution_environment +h1.d-inline-block = @execution_environment +.btn-group.float-right = render('shared/edit_button', object: @execution_environment) + button.btn.btn-secondary.float-right.dropdown-toggle data-toggle='dropdown' type='button' + ul.dropdown-menu.dropdown-menu-right role='menu' + li = link_to(t('execution_environments.index.synchronize.button'), sync_to_runner_management_execution_environment_path(@execution_environment), method: :post, class: 'dropdown-item text-dark') if policy(@execution_environment).sync_to_runner_management? + li = link_to(t('execution_environments.index.shell'), shell_execution_environment_path(@execution_environment), class: 'dropdown-item text-dark') if policy(@execution_environment).shell? + li = link_to(t('shared.statistics'), statistics_execution_environment_path(@execution_environment), 'data-turbolinks' => "false", class: 'dropdown-item text-dark') if policy(@execution_environment).statistics? + li = link_to(t('shared.destroy'), @execution_environment, data: {confirm: t('shared.confirm_destroy')}, method: :delete, class: 'dropdown-item text-dark') if policy(@execution_environment).destroy? = row(label: 'execution_environment.name', value: @execution_environment.name) = row(label: 'execution_environment.user', value: link_to_if(policy(@execution_environment.author).show?, @execution_environment.author, @execution_environment.author)) diff --git a/app/views/exercises/_editor_frame.html.slim b/app/views/exercises/_editor_frame.html.slim index 34cb938a..c63ccf3b 100644 --- a/app/views/exercises/_editor_frame.html.slim +++ b/app/views/exercises/_editor_frame.html.slim @@ -1,4 +1,4 @@ -div class=(defined?(own_solution) ? "own-frame" : "frame") data-executable=file.file_type.executable? data-filename=file.name_with_extension data-renderable=file.file_type.renderable? data-role=file.role data-binary=file.file_type.binary? data-context-type=file.context_type data-read-only=file.read_only +div class=(defined?(own_solution) ? "own-frame" : "frame") data-executable=file.file_type.executable? data-filename=file.filepath data-renderable=file.file_type.renderable? data-role=file.role data-binary=file.file_type.binary? data-context-type=file.context_type data-read-only=file.read_only - if file.file_type.binary? .binary-file data-file-id=file.ancestor_id - if file.file_type.renderable? diff --git a/app/views/exercises/_file_form.html.slim b/app/views/exercises/_file_form.html.slim index 06bc75b2..2ede87cb 100644 --- a/app/views/exercises/_file_form.html.slim +++ b/app/views/exercises/_file_form.html.slim @@ -7,10 +7,7 @@ li.card.mt-2 a class=['file-heading', collapsed_class] data-toggle="collapse" href="#collapse#{f.index}" aria-expanded="#{aria_expanded}" div.clearfix role="button" i class="fa" aria-hidden="true" - - if f.object.name.present? && f.object.file_type.present? - span = f.object.name_with_extension - - else - span = f.object.name + span = f.object.filepath .card-collapse.collapse class=('in' if f.object.name.nil?) id="collapse#{f.index}" role="tabpanel" .card-body - if policy(f.object).destroy? && id.present? diff --git a/app/views/exercises/external_users/statistics.html.slim b/app/views/exercises/external_users/statistics.html.slim index e894ac00..dc603ab3 100644 --- a/app/views/exercises/external_users/statistics.html.slim +++ b/app/views/exercises/external_users/statistics.html.slim @@ -65,9 +65,9 @@ h1 td.align-middle -this.testruns.includes(:file).order("files.name").each do |run| - if run.passed - .unit-test-result.positive-result title=[run.file&.name_with_extension, run.output].join("\n").strip + .unit-test-result.positive-result title=[run.file&.filepath, run.output].join("\n").strip - else - .unit-test-result.unknown-result title=[run.file&.name_with_extension, run.output].join("\n").strip + .unit-test-result.unknown-result title=[run.file&.filepath, run.output].join("\n").strip td = @working_times_until[index] if index > 0 if policy(@exercise).detailed_statistics? - elsif this.is_a? UserExerciseIntervention td = this.created_at.strftime("%F %T") diff --git a/app/views/exercises/show.html.slim b/app/views/exercises/show.html.slim index d582d66e..517a6980 100644 --- a/app/views/exercises/show.html.slim +++ b/app/views/exercises/show.html.slim @@ -49,7 +49,7 @@ ul.list-unstyled#files a.file-heading.collapsed data-toggle="collapse" data-parent="#files" href=".collapse#{file.id}" div.clearfix role="button" i class="fa" aria-hidden="true" - span = file.name_with_extension + span = file.filepath .card-collapse.collapse class="collapse#{file.id}" role="tabpanel" .card-body - if policy(file).destroy? diff --git a/app/views/request_for_comments/show.html.slim b/app/views/request_for_comments/show.html.slim index b06cee5b..8ab242f9 100644 --- a/app/views/request_for_comments/show.html.slim +++ b/app/views/request_for_comments/show.html.slim @@ -254,7 +254,7 @@ javascript: function deleteComment(commentId, editor, file_id, callback) { var jqxhr = $.ajax({ type: 'DELETE', - url: Routes.comments_path(commentId) + url: Routes.comment_path(commentId) }); jqxhr.done(function () { setAnnotations(editor, file_id); @@ -266,7 +266,7 @@ javascript: function updateComment(commentId, text, editor, file_id, callback) { var jqxhr = $.ajax({ type: 'PATCH', - url: Routes.comments_path(commentId), + url: Routes.comment_path(commentId), data: { comment: { text: text diff --git a/app/views/shared/_file.html.slim b/app/views/shared/_file.html.slim index b8122113..e8863f5c 100644 --- a/app/views/shared/_file.html.slim +++ b/app/views/shared/_file.html.slim @@ -7,4 +7,4 @@ - if file.teacher_defined_assessment? = row(label: 'file.feedback_message', value: render_markdown(file.feedback_message), class: 'm-0') = row(label: 'file.weight', value: file.weight) -= row(label: 'file.content', value: file.native_file? ? link_to_if(policy(file).show?, file.native_file.file.filename, file.native_file.url) : code_tag(file.content)) += row(label: 'file.content', value: file.native_file? ? link_to_if(policy(file).show?, file.native_file.file.filename, file.native_file.url) : code_tag(file.content, file.file_type.programming_language)) diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb index 65c72e14..e9559609 100644 --- a/config/initializers/sentry.rb +++ b/config/initializers/sentry.rb @@ -7,5 +7,33 @@ Sentry.init do |config| # Set tracesSampleRate to 1.0 to capture 100% # of transactions for performance monitoring. # We recommend adjusting this value in production - config.traces_sample_rate = 0.01 + config.traces_sampler = lambda do |sampling_context| + # if this is the continuation of a trace, just use that decision (rate controlled by the caller) + unless sampling_context[:parent_sampled].nil? + next sampling_context[:parent_sampled] + end + + # transaction_context is the transaction object in hash form + # keep in mind that sampling happens right after the transaction is initialized + # for example, at the beginning of the request + transaction_context = sampling_context[:transaction_context] + + # transaction_context helps you sample transactions with more sophistication + # for example, you can provide different sample rates based on the operation or name + op = transaction_context[:op] + transaction_name = transaction_context[:name] + + case op + when /request/ + # for Rails applications, transaction_name would be the request's path (env["PATH_INFO"]) instead of "Controller#action" + case transaction_name + when '/', '/ping' + 0.00 # ignore health check + else + 0.05 + end + else + 0.0 # ignore all other transactions + end + end end diff --git a/config/locales/de.yml b/config/locales/de.yml index bbbd11a2..f0b472ff 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -193,7 +193,7 @@ de: external_user: one: Externer Nutzer other: Externe Nutzer - file: + code_ocean/file: one: Datei other: Dateien file_template: @@ -241,10 +241,12 @@ de: admin: dashboard: show: + release: Release current: Aktuelle Verfügbarkeit - history: Verfügbarkeitsverlauf + history: Nutzungsverlauf inactive: Es ist kein Runner Management aktiv. - quantity: Verfügbare Container + idleRunners: Freie Runner + usedRunners: Reservierte Runner application: not_authorized: Sie Sind nicht berechtigt, diese Aktion auszuführen. welcome: @@ -301,6 +303,10 @@ de: not_synced_to_runner_management: Die Ausführungsumgebung wurde erstellt, aber aufgrund eines Fehlers nicht zum Runnermanagement synchronisiert. index: shell: Shell + synchronize: + button: Synchronisieren + success: Die Ausführungsumgebung wurde erfolgreich synchronisiert. + failure: "Beim Synchronisieren der Ausführungsumgebung ist folgender Fehler aufgetreten: %{error}" synchronize_all: button: Alle synchronisieren success: Alle Ausführungsumgebungen wurden erfolgreich synchronisiert. diff --git a/config/locales/en.yml b/config/locales/en.yml index a40632a5..6ec2ae50 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -193,7 +193,7 @@ en: external_user: one: External User other: External Users - file: + code_ocean/file: one: File other: Files file_template: @@ -241,10 +241,12 @@ en: admin: dashboard: show: + release: Release current: Current Availability - history: Availability History + history: Usage History inactive: No runner management is currently enabled. - quantity: Available Containers + idleRunners: Idle Runners + usedRunners: Reserved Runners application: not_authorized: You are not authorized to perform this action. welcome: @@ -301,9 +303,13 @@ en: not_synced_to_runner_management: The execution environment was created but not synced to the runner management due to an error. index: shell: Shell + synchronize: + button: Synchronize + success: The execution environment was synchronized successfully. + failure: "The execution environment could not be synchronised due to the following error: %{error}" synchronize_all: button: Synchronize all - success: All execution environemnts were synchronized successfully. + success: All execution environments were synchronized successfully. failure: At least one execution environment could not be synchronised due to an error. shell: command: Command diff --git a/config/routes.rb b/config/routes.rb index 4d2c77ff..19e70cc4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -FILENAME_REGEXP = /[\w.]+/.freeze unless Kernel.const_defined?(:FILENAME_REGEXP) +FILENAME_REGEXP = %r{[\w./]+}.freeze unless Kernel.const_defined?(:FILENAME_REGEXP) Rails.application.routes.draw do resources :community_solutions, only: %i[index edit update] @@ -66,6 +66,7 @@ Rails.application.routes.draw do get :shell post 'shell', as: :execute_command, action: :execute_command get :statistics + post :sync_to_runner_management end post :sync_all_to_runner_management, on: :collection diff --git a/db/migrate/20181129093207_drop_errors.rb b/db/migrate/20181129093207_drop_errors.rb index 59418c38..90973d62 100644 --- a/db/migrate/20181129093207_drop_errors.rb +++ b/db/migrate/20181129093207_drop_errors.rb @@ -9,7 +9,6 @@ class DropErrors < ActiveRecord::Migration[5.2] scope :for_execution_environment, ->(execution_environment) { where(execution_environment_id: execution_environment.id) } scope :grouped_by_message, -> { select('MAX(created_at) AS created_at, MAX(id) AS id, message, COUNT(id) AS count').group(:message).order('count DESC') } - validates :execution_environment_id, presence: true validates :message, presence: true def self.nested_resource? diff --git a/lib/active_model/validations/boolean_presence_validator.rb b/lib/active_model/validations/boolean_presence_validator.rb index fa959e6e..7a2e606f 100644 --- a/lib/active_model/validations/boolean_presence_validator.rb +++ b/lib/active_model/validations/boolean_presence_validator.rb @@ -8,7 +8,7 @@ module ActiveModel def validate(record) [attributes].flatten.each do |attribute| value = record.send(:read_attribute_for_validation, attribute) - record.errors.add(attribute, nil, options) unless BOOLEAN_VALUES.include?(value) + record.errors.add(attribute, nil, **options) unless BOOLEAN_VALUES.include?(value) end end end diff --git a/lib/assessor.rb b/lib/assessor.rb index 7d4bf600..b7f68e16 100644 --- a/lib/assessor.rb +++ b/lib/assessor.rb @@ -12,7 +12,7 @@ class Assessor def calculate_score(test_outcome) score = 0.0 - if test_outcome[:passed].to_d != 0.0.to_d && test_outcome[:count].to_d != 0.0.to_d + if test_outcome[:passed].to_d != BigDecimal('0.0') && test_outcome[:count].to_d != BigDecimal('0.0') score = (test_outcome[:passed].to_f / test_outcome[:count]) # prevent negative scores score = [0.0, score].max diff --git a/lib/code_ocean/config.rb b/lib/code_ocean/config.rb index e8623254..c8055a54 100644 --- a/lib/code_ocean/config.rb +++ b/lib/code_ocean/config.rb @@ -9,7 +9,9 @@ module CodeOcean def read(options = {}) path = Rails.root.join('config', "#{@filename}.yml#{options[:erb] ? '.erb' : ''}") if ::File.exist?(path) - content = options[:erb] ? YAML.safe_load(ERB.new(::File.new(path, 'r').read).result, aliases: true, permitted_classes: [Range]) : YAML.load_file(path) + yaml_content = ::File.new(path, 'r').read || '' + yaml_content = ERB.new(yaml_content).result if options[:erb] + content = YAML.safe_load(yaml_content, aliases: true, permitted_classes: [Range, Symbol]) content[Rails.env].with_indifferent_access else raise Error.new("Configuration file not found: #{path}") diff --git a/lib/cpp_catch2_adapter.rb b/lib/cpp_catch2_adapter.rb index 02dc9ea0..232ca7d7 100644 --- a/lib/cpp_catch2_adapter.rb +++ b/lib/cpp_catch2_adapter.rb @@ -17,7 +17,7 @@ class CppCatch2Adapter < TestingFrameworkAdapter count = output[:stdout].scan(COUNT_REGEXP).try(:last).try(:first).try(:to_i) || 0 failed = output[:stdout].scan(FAILURES_REGEXP).try(:last).try(:first).try(:to_i) || 0 error_matches = output[:stdout].scan(ASSERTION_ERROR_REGEXP) || [] - {count: count, failed: failed, error_messages: error_matches.flatten.reject(&:blank?)} + {count: count, failed: failed, error_messages: error_matches.flatten.compact_blank} end end end diff --git a/lib/docker_client.rb b/lib/docker_client.rb index af8667f3..8355e03e 100644 --- a/lib/docker_client.rb +++ b/lib/docker_client.rb @@ -315,7 +315,7 @@ container_execution_time: nil} @tubesock&.send_data JSON.dump({'cmd' => 'timeout'}) if @socket begin - @socket.send('#timeout') + @socket.send('#timeout') # rubocop:disable Performance/StringIdentifierArgument # sleep one more second to ensure that the message reaches the submissions_controller. sleep(1) @socket.close @@ -434,9 +434,9 @@ container_execution_time: nil} end def self.mapped_ports(execution_environment) - execution_environment.exposed_ports.map do |port| + execution_environment.exposed_ports.to_h do |port| ["#{port}/tcp", [{'HostPort' => PortPool.available_port.to_s}]] - end.to_h + end end def self.pull(docker_image) diff --git a/lib/file_tree.rb b/lib/file_tree.rb index dd1fe2ac..6b0d8dcd 100644 --- a/lib/file_tree.rb +++ b/lib/file_tree.rb @@ -29,7 +29,7 @@ class FileTree # Our tree needs a root node, but we won't display it. @root = Tree::TreeNode.new('ROOT') - files.uniq(&:name_with_extension).each do |file| + files.uniq(&:filepath).each do |file| parent = @root (file.path || '').split('/').each do |segment| node = parent.children.detect {|child| child.name == segment } || parent.add(Tree::TreeNode.new(segment)) diff --git a/lib/junit5_adapter.rb b/lib/junit5_adapter.rb index d482a867..0d615ae6 100644 --- a/lib/junit5_adapter.rb +++ b/lib/junit5_adapter.rb @@ -16,7 +16,7 @@ class Junit5Adapter < TestingFrameworkAdapter {count: count, passed: count} else error_matches = output[:stdout].scan(ASSERTION_ERROR_REGEXP) || [] - {count: count, failed: failed, error_messages: error_matches.flatten.reject(&:blank?)} + {count: count, failed: failed, error_messages: error_matches.flatten.compact_blank} end end end diff --git a/lib/junit_adapter.rb b/lib/junit_adapter.rb index 705f85b2..0ca905ae 100644 --- a/lib/junit_adapter.rb +++ b/lib/junit_adapter.rb @@ -17,7 +17,7 @@ class JunitAdapter < TestingFrameworkAdapter count = output[:stdout].scan(COUNT_REGEXP).try(:last).try(:first).try(:to_i) || 0 failed = output[:stdout].scan(FAILURES_REGEXP).try(:last).try(:first).try(:to_i) || 0 error_matches = output[:stdout].scan(ASSERTION_ERROR_REGEXP) || [] - {count: count, failed: failed, error_messages: error_matches.flatten.reject(&:blank?)} + {count: count, failed: failed, error_messages: error_matches.flatten.compact_blank} end end end diff --git a/lib/py_lint_adapter.rb b/lib/py_lint_adapter.rb index b9dc9235..ed62676b 100644 --- a/lib/py_lint_adapter.rb +++ b/lib/py_lint_adapter.rb @@ -43,8 +43,8 @@ class PyLintAdapter < TestingFrameworkAdapter { count: count, failed: failed, - error_messages: concatenated_errors.flatten.reject(&:blank?), - detailed_linter_results: assertion_error_matches.flatten.reject(&:blank?), + error_messages: concatenated_errors.flatten.compact_blank, + detailed_linter_results: assertion_error_matches.flatten.compact_blank, } end diff --git a/lib/py_unit_adapter.rb b/lib/py_unit_adapter.rb index 70217caa..fbb79f59 100644 --- a/lib/py_unit_adapter.rb +++ b/lib/py_unit_adapter.rb @@ -32,6 +32,6 @@ class PyUnitAdapter < TestingFrameworkAdapter Sentry.capture_message({stderr: output[:stderr], regex: ASSERTION_ERROR_REGEXP}.to_json) assertion_error_matches = [] end - {count: count, failed: failed + errors, error_messages: assertion_error_matches.flatten.reject(&:blank?)} + {count: count, failed: failed + errors, error_messages: assertion_error_matches.flatten.compact_blank} end end diff --git a/lib/r_script_adapter.rb b/lib/r_script_adapter.rb index 6fdb04c6..773ae1be 100644 --- a/lib/r_script_adapter.rb +++ b/lib/r_script_adapter.rb @@ -14,6 +14,6 @@ class RScriptAdapter < TestingFrameworkAdapter passed = captures.second failed = count - passed assertion_error_matches = output[:stdout].scan(ASSERTION_ERROR_REGEXP) || [] - {count: count, failed: failed, error_messages: assertion_error_matches.flatten.reject(&:blank?)} + {count: count, failed: failed, error_messages: assertion_error_matches.flatten.compact_blank} end end diff --git a/lib/runner/strategy/docker_container_pool.rb b/lib/runner/strategy/docker_container_pool.rb index 3c2f5d36..dca17ad8 100644 --- a/lib/runner/strategy/docker_container_pool.rb +++ b/lib/runner/strategy/docker_container_pool.rb @@ -97,7 +97,7 @@ class Runner::Strategy::DockerContainerPool < Runner::Strategy FileUtils.cp(file.native_file.path, local_file_path) else begin - File.open(local_file_path, 'w') {|f| f.write(file.content) } + File.write(local_file_path, file.content) rescue IOError => e raise Runner::Error::WorkspaceError.new("Could not create file #{file.filepath}: #{e.inspect}") end @@ -166,7 +166,7 @@ class Runner::Strategy::DockerContainerPool < Runner::Strategy url = "#{config[:url]}/docker_container_pool/quantities" response = Faraday.get(url) pool_size = JSON.parse(response.body) - pool_size.transform_keys(&:to_i) + pool_size.deep_symbolize_keys rescue Faraday::Error => e raise Runner::Error::FaradayError.new("Request to DockerContainerPool failed: #{e.inspect}") rescue JSON::ParserError => e @@ -259,7 +259,7 @@ class Runner::Strategy::DockerContainerPool < Runner::Strategy # TODO: Super dirty hack to redirect test output to stderr # This is only required for Python and the unittest module but must not be used with PyLint @stream = 'stderr' - when /\*\*\*\*\*\*\*\*\*\*\*\*\* Module/ + when /\*\*\*\*\*\*\*\*\*\*\*\*\* Module/, / Your code has been rated at/ # Identification of PyLint output, change stream back to stdout and return event @stream = 'stdout' {'type' => @stream, 'data' => event_data} diff --git a/lib/runner/strategy/poseidon.rb b/lib/runner/strategy/poseidon.rb index c4df9c16..b0bb6607 100644 --- a/lib/runner/strategy/poseidon.rb +++ b/lib/runner/strategy/poseidon.rb @@ -152,11 +152,44 @@ class Runner::Strategy::Poseidon < Runner::Strategy end def self.release - nil + url = "#{config[:url]}/version" + Rails.logger.debug { "#{Time.zone.now.getutc.inspect}: Getting release from #{url}" } + response = http_connection.get url + case response.status + when 200 + JSON.parse(response.body) + when 404 + 'N/A' + else + handle_error response + end + rescue Faraday::Error => e + raise Runner::Error::FaradayError.new("Request to Poseidon failed: #{e.inspect}") + rescue JSON::ParserError => e + # Poseidon should not send invalid json + raise Runner::Error::UnexpectedResponse.new("Error parsing response from Poseidon: #{e.message}") + ensure + Rails.logger.debug { "#{Time.zone.now.getutc.inspect}: Finished getting release information" } end def self.pool_size - {} + url = "#{config[:url]}/statistics/execution-environments" + Rails.logger.debug { "#{Time.zone.now.getutc.inspect}: Getting statistics from #{url}" } + response = http_connection.get url + case response.status + when 200 + response_body = parse response + response_body + else + handle_error response + end + rescue Faraday::Error => e + raise Runner::Error::FaradayError.new("Request to Poseidon failed: #{e.inspect}") + rescue JSON::ParserError => e + # Poseidon should not send invalid json + raise Runner::Error::UnexpectedResponse.new("Error parsing response from Poseidon: #{e.message}") + ensure + Rails.logger.debug { "#{Time.zone.now.getutc.inspect}: Finished getting statistics" } end def self.websocket_header diff --git a/package.json b/package.json index 9a35f006..cb51ff19 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "bootstrap": "^4.6.1", "bootswatch": "^4.6.0", "chosen-js": "^1.8.7", - "d3": "^7.1.1", + "d3": "^7.3.0", "d3-tip": "^0.9.1", - "highlight.js": "^11.3.1", + "highlight.js": "^11.4.0", "jquery": "^3.6.0", "jquery-ui": "^1.13.0", "jquery-ujs": "^1.2.3", @@ -17,7 +17,7 @@ "popper.js": "^1.16.1", "rails-erb-loader": "^5.5.2", "sortablejs": "^1.14.0", - "underscore": "^1.13.1", + "underscore": "^1.13.2", "vis": "^4.21.0", "webpack-merge": "^5.8.0" }, diff --git a/provision/provision.vagrant.sh b/provision/provision.vagrant.sh index 031f7460..ef8d9d14 100644 --- a/provision/provision.vagrant.sh +++ b/provision/provision.vagrant.sh @@ -2,9 +2,9 @@ ######## VERSION INFORMATION ######## -postgres_version=13 +postgres_version=14 node_version=14 -ruby_version=2.7.2 +ruby_version=2.7.5 ########## INSTALL SCRIPT ########### @@ -24,7 +24,7 @@ sudo apt -qq -y upgrade # PostgreSQL curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list -sudo apt -qq update && sudo apt -qq install -y postgresql-client postgresql +sudo apt -qq update && sudo apt -qq install -y postgresql-client-$postgres_version postgresql-$postgres_version sudo sed -i "/# TYPE/q" /etc/postgresql/$postgres_version/main/pg_hba.conf sudo tee -a /etc/postgresql/$postgres_version/main/pg_hba.conf < FactoryBot.build(:file).attributes} } + let(:files_attributes) { {'0' => build(:file).attributes} } it 'creates the file' do expect { perform_request.call }.to change(CodeOcean::File, :count) @@ -84,11 +84,11 @@ describe ExercisesController do end context 'when uploading a file' do - let(:files_attributes) { {'0' => FactoryBot.build(:file, file_type: file_type).attributes.merge(content: uploaded_file)} } + let(:files_attributes) { {'0' => build(:file, file_type: file_type).attributes.merge(content: uploaded_file)} } context 'when uploading a binary file' do let(:file_path) { Rails.root.join('db/seeds/audio_video/devstories.mp4') } - let(:file_type) { FactoryBot.create(:dot_mp4) } + let(:file_type) { create(:dot_mp4) } let(:uploaded_file) { Rack::Test::UploadedFile.new(file_path, 'video/mp4', true) } it 'creates the file' do @@ -103,7 +103,7 @@ describe ExercisesController do context 'when uploading a non-binary file' do let(:file_path) { Rails.root.join('db/seeds/fibonacci/exercise.rb') } - let(:file_type) { FactoryBot.create(:dot_rb) } + let(:file_type) { create(:dot_rb) } let(:uploaded_file) { Rack::Test::UploadedFile.new(file_path, 'text/x-ruby', false) } it 'creates the file' do @@ -133,7 +133,7 @@ describe ExercisesController do expect_assigns(exercise: :exercise) it 'destroys the exercise' do - exercise = FactoryBot.create(:dummy) + exercise = create(:dummy) expect { delete :destroy, params: {id: exercise.id} }.to change(Exercise, :count).by(-1) end @@ -152,14 +152,14 @@ describe ExercisesController do let(:perform_request) { proc { get :implement, params: {id: exercise.id} } } context 'with an exercise with visible files' do - let(:exercise) { FactoryBot.create(:fibonacci) } + let(:exercise) { create(:fibonacci) } before { perform_request.call } expect_assigns(exercise: :exercise) context 'with an existing submission' do - let!(:submission) { FactoryBot.create(:submission, exercise_id: exercise.id, user_id: user.id, user_type: user.class.name) } + let!(:submission) { create(:submission, exercise_id: exercise.id, user_id: user.id, user_type: user.class.name) } it "populates the editors with the submission's files' content" do perform_request.call @@ -190,7 +190,7 @@ describe ExercisesController do let(:scope) { Pundit.policy_scope!(user, Exercise) } before do - FactoryBot.create_pair(:dummy) + create_pair(:dummy) get :index end @@ -239,7 +239,7 @@ describe ExercisesController do describe 'POST #submit' do let(:output) { {} } let(:perform_request) { post :submit, format: :json, params: {id: exercise.id, submission: {cause: 'submit', exercise_id: exercise.id}} } - let(:user) { FactoryBot.create(:external_user) } + let(:user) { create(:external_user) } let(:scoring_response) do [{ status: :ok, @@ -260,8 +260,8 @@ describe ExercisesController do end before do - FactoryBot.create(:lti_parameter, external_user: user, exercise: exercise) - submission = FactoryBot.build(:submission, exercise: exercise, user: user) + create(:lti_parameter, external_user: user, exercise: exercise) + submission = build(:submission, exercise: exercise, user: user) allow(submission).to receive(:normalized_score).and_return(1) allow(submission).to receive(:calculate_score).and_return(scoring_response) allow(Submission).to receive(:create).and_return(submission) @@ -328,7 +328,7 @@ describe ExercisesController do describe 'PUT #update' do context 'with a valid exercise' do - let(:exercise_attributes) { FactoryBot.build(:dummy).attributes } + let(:exercise_attributes) { build(:dummy).attributes } before { put :update, params: {exercise: exercise_attributes, id: exercise.id} } @@ -352,7 +352,7 @@ describe ExercisesController do render_views let(:post_request) { post :export_external_check, params: {id: exercise.id} } - let!(:codeharbor_link) { FactoryBot.create(:codeharbor_link, user: user) } + let!(:codeharbor_link) { create(:codeharbor_link, user: user) } let(:external_check_hash) { {message: message, task_found: true, update_right: update_right, error: error} } let(:message) { 'message' } let(:update_right) { true } @@ -405,7 +405,7 @@ describe ExercisesController do describe '#export_external_confirm' do render_views - let!(:codeharbor_link) { FactoryBot.create(:codeharbor_link, user: user) } + let!(:codeharbor_link) { create(:codeharbor_link, user: user) } let(:post_request) { post :export_external_confirm, params: {id: exercise.id, codeharbor_link: codeharbor_link.id} } let(:error) { nil } let(:zip) { 'zip' } @@ -440,8 +440,8 @@ describe ExercisesController do end describe '#import_uuid_check' do - let(:exercise) { FactoryBot.create(:dummy, uuid: SecureRandom.uuid) } - let!(:codeharbor_link) { FactoryBot.create(:codeharbor_link, user: user) } + let(:exercise) { create(:dummy, uuid: SecureRandom.uuid) } + let!(:codeharbor_link) { create(:codeharbor_link, user: user) } let(:uuid) { exercise.reload.uuid } let(:post_request) { post :import_uuid_check, params: {uuid: uuid} } let(:headers) { {'Authorization' => "Bearer #{codeharbor_link.api_key}"} } @@ -466,7 +466,7 @@ describe ExercisesController do end context 'when the user cannot update the exercise' do - let(:codeharbor_link) { FactoryBot.create(:codeharbor_link, api_key: 'anotherkey') } + let(:codeharbor_link) { create(:codeharbor_link, api_key: 'anotherkey') } it 'renders correct response' do post_request @@ -490,8 +490,8 @@ describe ExercisesController do end describe 'POST #import_exercise' do - let(:codeharbor_link) { FactoryBot.create(:codeharbor_link, user: user) } - let!(:imported_exercise) { FactoryBot.create(:fibonacci) } + let(:codeharbor_link) { create(:codeharbor_link, user: user) } + let!(:imported_exercise) { create(:fibonacci) } let(:post_request) { post :import_exercise, body: zip_file_content } let(:zip_file_content) { 'zipped task xml' } let(:headers) { {'Authorization' => "Bearer #{codeharbor_link.api_key}"} } diff --git a/spec/controllers/external_users_controller_spec.rb b/spec/controllers/external_users_controller_spec.rb index 40286549..d39acb26 100644 --- a/spec/controllers/external_users_controller_spec.rb +++ b/spec/controllers/external_users_controller_spec.rb @@ -3,8 +3,8 @@ require 'rails_helper' describe ExternalUsersController do - let(:user) { FactoryBot.build(:admin) } - let!(:users) { FactoryBot.create_pair(:external_user) } + let(:user) { build(:admin) } + let!(:users) { create_pair(:external_user) } before { allow(controller).to receive(:current_user).and_return(user) } diff --git a/spec/controllers/file_types_controller_spec.rb b/spec/controllers/file_types_controller_spec.rb index 5035ceb8..3f13df2d 100644 --- a/spec/controllers/file_types_controller_spec.rb +++ b/spec/controllers/file_types_controller_spec.rb @@ -3,14 +3,14 @@ require 'rails_helper' describe FileTypesController do - let(:file_type) { FactoryBot.create(:dot_rb) } - let(:user) { FactoryBot.create(:admin) } + let(:file_type) { create(:dot_rb) } + let(:user) { create(:admin) } before { allow(controller).to receive(:current_user).and_return(user) } describe 'POST #create' do context 'with a valid file type' do - let(:perform_request) { proc { post :create, params: {file_type: FactoryBot.attributes_for(:dot_rb)} } } + let(:perform_request) { proc { post :create, params: {file_type: attributes_for(:dot_rb)} } } before { perform_request.call } @@ -40,7 +40,7 @@ describe FileTypesController do expect_assigns(file_type: FileType) it 'destroys the file type' do - file_type = FactoryBot.create(:dot_rb) + file_type = create(:dot_rb) expect { delete :destroy, params: {id: file_type.id} }.to change(FileType, :count).by(-1) end @@ -58,7 +58,7 @@ describe FileTypesController do describe 'GET #index' do before do - FactoryBot.create_pair(:dot_rb) + create_pair(:dot_rb) get :index end @@ -86,7 +86,7 @@ describe FileTypesController do describe 'PUT #update' do context 'with a valid file type' do - before { put :update, params: {file_type: FactoryBot.attributes_for(:dot_rb), id: file_type.id} } + before { put :update, params: {file_type: attributes_for(:dot_rb), id: file_type.id} } expect_assigns(editor_modes: Array) expect_assigns(file_type: FileType) diff --git a/spec/controllers/internal_users_controller_spec.rb b/spec/controllers/internal_users_controller_spec.rb index c6a1cb9a..7ff2fb7b 100644 --- a/spec/controllers/internal_users_controller_spec.rb +++ b/spec/controllers/internal_users_controller_spec.rb @@ -3,11 +3,11 @@ require 'rails_helper' describe InternalUsersController do - let(:user) { FactoryBot.build(:admin) } - let!(:users) { FactoryBot.create_pair(:teacher) } + let(:user) { build(:admin) } + let!(:users) { create_pair(:teacher) } describe 'GET #activate' do - let(:user) { InternalUser.create(FactoryBot.attributes_for(:teacher)) } + let(:user) { InternalUser.create(attributes_for(:teacher)) } before do user.send(:setup_activation) @@ -39,7 +39,7 @@ describe InternalUsersController do end describe 'PUT #activate' do - let(:user) { InternalUser.create(FactoryBot.build(:teacher).attributes) } + let(:user) { InternalUser.create(build(:teacher).attributes) } let(:password) { SecureRandom.hex } before do @@ -108,7 +108,7 @@ describe InternalUsersController do before { allow(controller).to receive(:current_user).and_return(user) } context 'with a valid internal user' do - let(:perform_request) { proc { post :create, params: {internal_user: FactoryBot.build(:teacher).attributes} } } + let(:perform_request) { proc { post :create, params: {internal_user: build(:teacher).attributes} } } before { perform_request.call } @@ -316,7 +316,7 @@ describe InternalUsersController do before { allow(controller).to receive(:current_user).and_return(user) } context 'with a valid internal user' do - before { put :update, params: {internal_user: FactoryBot.attributes_for(:teacher), id: users.first.id} } + before { put :update, params: {internal_user: attributes_for(:teacher), id: users.first.id} } expect_assigns(user: InternalUser) expect_redirect { user } diff --git a/spec/controllers/request_for_comments_controller_spec.rb b/spec/controllers/request_for_comments_controller_spec.rb index 2be03f34..1950ff24 100644 --- a/spec/controllers/request_for_comments_controller_spec.rb +++ b/spec/controllers/request_for_comments_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe RequestForCommentsController do - let(:user) { FactoryBot.create(:admin) } + let(:user) { create(:admin) } before { allow(controller).to receive(:current_user).and_return(user) } @@ -16,13 +16,13 @@ describe RequestForCommentsController do end it 'shows only rfc`s belonging to selected study group' do - my_study_group = FactoryBot.create(:study_group) - rfc_within_my_study_group = FactoryBot.create(:rfc, user: user) + my_study_group = create(:study_group) + rfc_within_my_study_group = create(:rfc, user: user) user.update(study_groups: [my_study_group]) rfc_within_my_study_group.submission.update(study_group: my_study_group) - another_study_group = FactoryBot.create(:study_group) - rfc_other_study_group = FactoryBot.create(:rfc) + another_study_group = create(:study_group) + rfc_other_study_group = create(:rfc) rfc_other_study_group.user.update(study_groups: [another_study_group]) rfc_other_study_group.submission.update(study_group: another_study_group) @@ -48,7 +48,7 @@ describe RequestForCommentsController do describe 'GET #rfcs_for_exercise' do before do - exercise = FactoryBot.create(:even_odd) + exercise = create(:even_odd) get :rfcs_for_exercise, params: {exercise_id: exercise.id} end diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index 7388f7ef..4b7b54c0 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -3,12 +3,12 @@ require 'rails_helper' describe SessionsController do - let(:consumer) { FactoryBot.create(:consumer) } + let(:consumer) { create(:consumer) } describe 'POST #create' do - let(:password) { FactoryBot.attributes_for(:teacher)[:password] } + let(:password) { attributes_for(:teacher)[:password] } let(:user) { InternalUser.create(user_attributes.merge(password: password)) } - let(:user_attributes) { FactoryBot.build(:teacher).attributes } + let(:user_attributes) { build(:teacher).attributes } context 'with valid credentials' do before do @@ -29,8 +29,8 @@ describe SessionsController do end describe 'POST #create_through_lti' do - let(:exercise) { FactoryBot.create(:dummy) } - let(:exercise2) { FactoryBot.create(:dummy) } + let(:exercise) { create(:dummy) } + let(:exercise2) { create(:dummy) } let(:nonce) { SecureRandom.hex } context 'without OAuth parameters' do @@ -74,7 +74,7 @@ describe SessionsController do context 'with valid launch parameters' do let(:locale) { :de } let(:perform_request) { post :create_through_lti, params: {custom_locale: locale, custom_token: exercise.token, oauth_consumer_key: consumer.oauth_key, oauth_nonce: nonce, oauth_signature: SecureRandom.hex, user_id: user.external_id} } - let(:user) { FactoryBot.create(:external_user, consumer_id: consumer.id) } + let(:user) { create(:external_user, consumer_id: consumer.id) } before { allow_any_instance_of(IMS::LTI::ToolProvider).to receive(:valid_request?).and_return(true) } @@ -139,14 +139,14 @@ describe SessionsController do end it 'redirects to recommended exercise if requested token of proxy exercise' do - FactoryBot.create(:proxy_exercise, exercises: [exercise]) + create(:proxy_exercise, exercises: [exercise]) post :create_through_lti, params: {custom_locale: locale, custom_token: ProxyExercise.first.token, oauth_consumer_key: consumer.oauth_key, oauth_nonce: nonce, oauth_signature: SecureRandom.hex, user_id: user.external_id} expect(controller).to redirect_to(implement_exercise_path(exercise.id)) end it 'recommends only exercises who are 1 degree more complicated than what user has seen' do # dummy user has no exercises finished, therefore his highest difficulty is 0 - FactoryBot.create(:proxy_exercise, exercises: [exercise, exercise2]) + create(:proxy_exercise, exercises: [exercise, exercise2]) exercise.expected_difficulty = 3 exercise.save exercise2.expected_difficulty = 1 @@ -202,7 +202,7 @@ describe SessionsController do describe 'GET #destroy_through_lti' do let(:perform_request) { proc { get :destroy_through_lti, params: {consumer_id: consumer.id, submission_id: submission.id} } } - let(:submission) { FactoryBot.create(:submission, exercise: FactoryBot.create(:dummy)) } + let(:submission) { create(:submission, exercise: create(:dummy)) } before do # Todo replace session with lti_parameter @@ -238,7 +238,7 @@ describe SessionsController do before do allow(controller).to receive(:set_sentry_context).and_return(nil) - allow(controller).to receive(:current_user).and_return(FactoryBot.build(:teacher)) + allow(controller).to receive(:current_user).and_return(build(:teacher)) get :new end diff --git a/spec/controllers/statistics_controller_spec.rb b/spec/controllers/statistics_controller_spec.rb index 8ddd30c2..9a0cbcb6 100644 --- a/spec/controllers/statistics_controller_spec.rb +++ b/spec/controllers/statistics_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe StatisticsController do - let(:user) { FactoryBot.create(:admin) } + let(:user) { create(:admin) } before { allow(controller).to receive(:current_user).and_return(user) } diff --git a/spec/controllers/submissions_controller_spec.rb b/spec/controllers/submissions_controller_spec.rb index b92f92d8..cb764d86 100644 --- a/spec/controllers/submissions_controller_spec.rb +++ b/spec/controllers/submissions_controller_spec.rb @@ -3,8 +3,8 @@ require 'rails_helper' describe SubmissionsController do - let(:submission) { FactoryBot.create(:submission) } - let(:user) { FactoryBot.create(:admin) } + let(:submission) { create(:submission) } + let(:user) { create(:admin) } before { allow(controller).to receive(:current_user).and_return(user) } @@ -14,8 +14,8 @@ describe SubmissionsController do end context 'with a valid submission' do - let(:exercise) { FactoryBot.create(:hello_world) } - let(:perform_request) { proc { post :create, format: :json, params: {submission: FactoryBot.attributes_for(:submission, exercise_id: exercise.id)} } } + let(:exercise) { create(:hello_world) } + let(:perform_request) { proc { post :create, format: :json, params: {submission: attributes_for(:submission, exercise_id: exercise.id)} } } before { perform_request.call } @@ -46,7 +46,7 @@ describe SubmissionsController do end context 'with a valid binary filename' do - let(:submission) { FactoryBot.create(:submission, exercise: FactoryBot.create(:sql_select)) } + let(:submission) { create(:submission, exercise: create(:sql_select)) } before { get :download_file, params: {filename: file.name_with_extension, id: submission.id} } @@ -65,7 +65,7 @@ describe SubmissionsController do end context 'with a valid filename' do - let(:submission) { FactoryBot.create(:submission, exercise: FactoryBot.create(:audio_video)) } + let(:submission) { create(:submission, exercise: create(:audio_video)) } before { get :download_file, params: {filename: file.name_with_extension, id: submission.id} } @@ -99,7 +99,7 @@ describe SubmissionsController do describe 'GET #index' do before do - FactoryBot.create_pair(:submission) + create_pair(:submission) get :index end @@ -118,7 +118,7 @@ describe SubmissionsController do end context 'with a valid filename' do - let(:submission) { FactoryBot.create(:submission, exercise: FactoryBot.create(:audio_video)) } + let(:submission) { create(:submission, exercise: create(:audio_video)) } before { get :render_file, params: {filename: file.name_with_extension, id: submission.id} } diff --git a/spec/db/seeds_spec.rb b/spec/db/seeds_spec.rb index 07ab8e4f..71cb7274 100644 --- a/spec/db/seeds_spec.rb +++ b/spec/db/seeds_spec.rb @@ -17,6 +17,7 @@ describe 'seeds' do ActiveRecord::Base.establish_connection(:test) } allow_any_instance_of(ExecutionEnvironment).to receive(:working_docker_image?).and_return true + allow_any_instance_of(ExecutionEnvironment).to receive(:sync_runner_environment).and_return true end describe 'execute db:seed', cleaning_strategy: :truncation do diff --git a/spec/features/authentication_spec.rb b/spec/features/authentication_spec.rb index 39704038..a5cf7a59 100644 --- a/spec/features/authentication_spec.rb +++ b/spec/features/authentication_spec.rb @@ -3,8 +3,8 @@ require 'rails_helper' describe 'Authentication' do - let(:user) { FactoryBot.create(:admin) } - let(:password) { FactoryBot.attributes_for(:admin)[:password] } + let(:user) { create(:admin) } + let(:password) { attributes_for(:admin)[:password] } context 'when signed out' do before { visit(root_path) } diff --git a/spec/features/authorization_spec.rb b/spec/features/authorization_spec.rb index cc8fcb9d..2e91f203 100644 --- a/spec/features/authorization_spec.rb +++ b/spec/features/authorization_spec.rb @@ -6,7 +6,7 @@ describe 'Authorization' do before { allow(Runner.strategy_class).to receive(:available_images).and_return([]) } context 'when being an admin' do - let(:user) { FactoryBot.create(:admin) } + let(:user) { create(:admin) } before { allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) } @@ -16,7 +16,7 @@ describe 'Authorization' do end context 'with being an external user' do - let(:user) { FactoryBot.create(:external_user) } + let(:user) { create(:external_user) } before { allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) } @@ -26,7 +26,7 @@ describe 'Authorization' do end context 'with being a teacher' do - let(:user) { FactoryBot.create(:teacher) } + let(:user) { create(:teacher) } before { allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) } diff --git a/spec/features/editor_spec.rb b/spec/features/editor_spec.rb index 06919ea7..5892354b 100644 --- a/spec/features/editor_spec.rb +++ b/spec/features/editor_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe 'Editor', js: true do - let(:exercise) { FactoryBot.create(:audio_video, description: Forgery(:lorem_ipsum).sentence) } + let(:exercise) { create(:audio_video, description: Forgery(:lorem_ipsum).sentence) } let(:scoring_response) do [{ status: :ok, @@ -22,12 +22,12 @@ describe 'Editor', js: true do weight: 2.0, }] end - let(:user) { FactoryBot.create(:teacher) } + let(:user) { create(:teacher) } before do visit(sign_in_path) fill_in('email', with: user.email) - fill_in('password', with: FactoryBot.attributes_for(:teacher)[:password]) + fill_in('password', with: attributes_for(:teacher)[:password]) click_button(I18n.t('sessions.new.link')) allow_any_instance_of(LtiHelper).to receive(:lti_outcome_service?).and_return(true) visit(implement_exercise_path(exercise)) @@ -94,7 +94,7 @@ describe 'Editor', js: true do end it 'contains a button for submitting the exercise' do - submission = FactoryBot.build(:submission, user: user, exercise: exercise) + submission = build(:submission, user: user, exercise: exercise) allow(submission).to receive(:calculate_score).and_return(scoring_response) allow(Submission).to receive(:find).and_return(submission) click_button(I18n.t('exercises.editor.score')) diff --git a/spec/features/prometheus/controller_spec.rb b/spec/features/prometheus/controller_spec.rb index 156e227c..96966ab1 100644 --- a/spec/features/prometheus/controller_spec.rb +++ b/spec/features/prometheus/controller_spec.rb @@ -26,7 +26,7 @@ describe Prometheus::Controller do describe 'instance count' do it 'initializes the metrics with the current database entries' do - FactoryBot.create_list(:proxy_exercise, 3) + create_list(:proxy_exercise, 3) described_class.register_metrics stub_metrics described_class.initialize_instance_count @@ -35,25 +35,25 @@ describe Prometheus::Controller do it 'gets notified when an object is created' do allow(described_class).to receive(:create_notification) - proxy_exercise = FactoryBot.create(:proxy_exercise) + proxy_exercise = create(:proxy_exercise) expect(described_class).to have_received(:create_notification).with(proxy_exercise).once end it 'gets notified when an object is destroyed' do allow(described_class).to receive(:destroy_notification) - proxy_exercise = FactoryBot.create(:proxy_exercise).destroy + proxy_exercise = create(:proxy_exercise).destroy expect(described_class).to have_received(:destroy_notification).with(proxy_exercise).once end it 'increments gauge when creating a new instance' do - FactoryBot.create(:proxy_exercise) + create(:proxy_exercise) expect(described_class.instance_variable_get(:@instance_count)).to( have_received(:increment).with(class: ProxyExercise.name).once ) end it 'decrements gauge when deleting an object' do - FactoryBot.create(:proxy_exercise).destroy + create(:proxy_exercise).destroy expect(described_class.instance_variable_get(:@instance_count)).to( have_received(:decrement).with(class: ProxyExercise.name).once ) @@ -63,7 +63,7 @@ describe Prometheus::Controller do describe 'rfc count' do context 'when initializing an rfc' do it 'updates rfc count when creating an ongoing rfc' do - FactoryBot.create(:rfc) + create(:rfc) expect(described_class.instance_variable_get(:@rfc_count)).to( have_received(:increment).with(state: RequestForComment::ONGOING).once ) @@ -71,7 +71,7 @@ describe Prometheus::Controller do end context 'when changing the state of an rfc' do - let(:rfc) { FactoryBot.create(:rfc) } + let(:rfc) { create(:rfc) } it 'updates rfc count when soft-solving an rfc' do rfc.full_score_reached = true @@ -90,12 +90,12 @@ describe Prometheus::Controller do context 'when commenting an rfc' do it 'updates comment metric when commenting an rfc' do - FactoryBot.create(:rfc_with_comment) + create(:rfc_with_comment) expect(described_class.instance_variable_get(:@rfc_commented_count)).to have_received(:increment).once end it 'does not update comment metric when commenting an rfc that already has a comment' do - rfc = FactoryBot.create(:rfc_with_comment) + rfc = create(:rfc_with_comment) expect(described_class.instance_variable_get(:@rfc_commented_count)).to have_received(:increment).once Comment.create(file: rfc.file, user: rfc.user, text: "comment a for rfc #{rfc.question}") diff --git a/spec/features/request_for_comments_filter_spec.rb b/spec/features/request_for_comments_filter_spec.rb index 9f264171..17eadacb 100644 --- a/spec/features/request_for_comments_filter_spec.rb +++ b/spec/features/request_for_comments_filter_spec.rb @@ -3,21 +3,21 @@ require 'rails_helper' describe 'Request_for_Comments' do - let(:exercise) { FactoryBot.create(:audio_video, description: Forgery(:lorem_ipsum).sentence) } - let(:user) { FactoryBot.create(:teacher) } + let(:exercise) { create(:audio_video, description: Forgery(:lorem_ipsum).sentence) } + let(:user) { create(:teacher) } before do visit(sign_in_path) fill_in('email', with: user.email) - fill_in('password', with: FactoryBot.attributes_for(:teacher)[:password]) + fill_in('password', with: attributes_for(:teacher)[:password]) click_button(I18n.t('sessions.new.link')) end it 'does not contain rfcs for unpublished exercises' do - unpublished_rfc = FactoryBot.create(:rfc) + unpublished_rfc = create(:rfc) unpublished_rfc.exercise.update(title: 'Unpublished Exercise') unpublished_rfc.exercise.update(unpublished: true) - rfc = FactoryBot.create(:rfc) + rfc = create(:rfc) rfc.exercise.update(title: 'Normal Exercise') rfc.exercise.update(unpublished: false) diff --git a/spec/helpers/admin/dashboard_helper_spec.rb b/spec/helpers/admin/dashboard_helper_spec.rb index 22307561..64307b83 100644 --- a/spec/helpers/admin/dashboard_helper_spec.rb +++ b/spec/helpers/admin/dashboard_helper_spec.rb @@ -11,10 +11,10 @@ describe Admin::DashboardHelper do describe '#docker_data' do before do - FactoryBot.create(:ruby) + create(:ruby) dcp = instance_double 'docker_container_pool' allow(Runner).to receive(:strategy_class).and_return dcp - allow(dcp).to receive(:pool_size).and_return([]) + allow(dcp).to receive(:pool_size).and_return({}) end it 'contains an entry for every execution environment' do @@ -22,11 +22,15 @@ describe Admin::DashboardHelper do end it 'contains the pool size for every execution environment' do - expect(docker_data.first.symbolize_keys).to include(:pool_size) + expect(docker_data.first.symbolize_keys).to include(:prewarmingPoolSize) end - it 'contains the number of available containers for every execution environment' do - expect(docker_data.first).to include(:quantity) + it 'contains the number of idle runners for every execution environment' do + expect(docker_data.first).to include(:idleRunners) + end + + it 'contains the number of used runners for every execution environment' do + expect(docker_data.first).to include(:usedRunners) end end end diff --git a/spec/helpers/exercise_helper_spec.rb b/spec/helpers/exercise_helper_spec.rb index 9fd8feea..b1710866 100644 --- a/spec/helpers/exercise_helper_spec.rb +++ b/spec/helpers/exercise_helper_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe ExerciseHelper do describe '#embedding_parameters' do - let(:exercise) { FactoryBot.build(:dummy) } + let(:exercise) { build(:dummy) } it 'contains the locale' do expect(embedding_parameters(exercise)).to start_with("locale=#{I18n.locale}") diff --git a/spec/lib/assessor_spec.rb b/spec/lib/assessor_spec.rb index 457a6cba..1b83245e 100644 --- a/spec/lib/assessor_spec.rb +++ b/spec/lib/assessor_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe Assessor do - let(:assessor) { described_class.new(execution_environment: FactoryBot.build(:ruby)) } + let(:assessor) { described_class.new(execution_environment: build(:ruby)) } describe '#assess' do let(:assess) { assessor.assess(stdout: stdout) } @@ -55,7 +55,7 @@ describe Assessor do context 'with an execution environment without a testing framework adapter' do it 'raises an error' do - expect { described_class.new(execution_environment: FactoryBot.build(:ruby, testing_framework: nil)) }.to raise_error(Assessor::Error) + expect { described_class.new(execution_environment: build(:ruby, testing_framework: nil)) }.to raise_error(Assessor::Error) end end end diff --git a/spec/lib/docker_client_spec.rb b/spec/lib/docker_client_spec.rb index 54746d51..9d502d17 100644 --- a/spec/lib/docker_client_spec.rb +++ b/spec/lib/docker_client_spec.rb @@ -7,14 +7,14 @@ WORKSPACE_PATH = Rails.root.join('tmp', 'files', Rails.env, 'code_ocean_test') describe DockerClient do let(:command) { 'whoami' } - let(:docker_client) { described_class.new(execution_environment: FactoryBot.build(:java), user: FactoryBot.build(:admin)) } - let(:execution_environment) { FactoryBot.build(:java) } + let(:docker_client) { described_class.new(execution_environment: build(:java), user: build(:admin)) } + let(:execution_environment) { build(:java) } let(:image) { double } - let(:submission) { FactoryBot.create(:submission) } + let(:submission) { create(:submission) } let(:workspace_path) { WORKSPACE_PATH } before do - docker_image = Docker::Image.new(Docker::Connection.new('http://example.org', {}), 'id' => SecureRandom.hex, 'RepoTags' => [FactoryBot.attributes_for(:java)[:docker_image]]) + docker_image = Docker::Image.new(Docker::Connection.new('http://example.org', {}), 'id' => SecureRandom.hex, 'RepoTags' => [attributes_for(:java)[:docker_image]]) allow(described_class).to receive(:find_image_by_tag).and_return(docker_image) described_class.initialize_environment allow(described_class).to receive(:container_creation_options).and_wrap_original do |original_method, *args, &block| @@ -177,7 +177,7 @@ describe DockerClient do describe '#create_workspace_file' do let(:container) { Docker::Container.send(:new, Docker::Connection.new('http://example.org', {}), 'id' => SecureRandom.hex) } - let(:file) { FactoryBot.build(:file, content: 'puts 42') } + let(:file) { build(:file, content: 'puts 42') } let(:file_path) { File.join(workspace_path, file.name_with_extension) } after { File.delete(file_path) } diff --git a/spec/lib/file_tree_spec.rb b/spec/lib/file_tree_spec.rb index fe14d4fa..8b053e74 100644 --- a/spec/lib/file_tree_spec.rb +++ b/spec/lib/file_tree_spec.rb @@ -10,7 +10,7 @@ describe FileTree do context 'with a media file' do context 'with an audio file' do - let(:file) { FactoryBot.build(:file, file_type: FactoryBot.build(:dot_mp3)) } + let(:file) { build(:file, file_type: build(:dot_mp3)) } it 'is an audio file icon' do expect(file_icon).to include('fa-file-audio-o') @@ -18,7 +18,7 @@ describe FileTree do end context 'with an image file' do - let(:file) { FactoryBot.build(:file, file_type: FactoryBot.build(:dot_jpg)) } + let(:file) { build(:file, file_type: build(:dot_jpg)) } it 'is an image file icon' do expect(file_icon).to include('fa-file-image-o') @@ -26,7 +26,7 @@ describe FileTree do end context 'with a video file' do - let(:file) { FactoryBot.build(:file, file_type: FactoryBot.build(:dot_mp4)) } + let(:file) { build(:file, file_type: build(:dot_mp4)) } it 'is a video file icon' do expect(file_icon).to include('fa-file-video-o') @@ -36,7 +36,7 @@ describe FileTree do context 'with other files' do context 'with a read-only file' do - let(:file) { FactoryBot.build(:file, read_only: true) } + let(:file) { build(:file, read_only: true) } it 'is a lock icon' do expect(file_icon).to include('fa-lock') @@ -44,7 +44,7 @@ describe FileTree do end context 'with an executable file' do - let(:file) { FactoryBot.build(:file, file_type: FactoryBot.build(:dot_py)) } + let(:file) { build(:file, file_type: build(:dot_py)) } it 'is a code file icon' do expect(file_icon).to include('fa-file-code-o') @@ -52,7 +52,7 @@ describe FileTree do end context 'with a renderable file' do - let(:file) { FactoryBot.build(:file, file_type: FactoryBot.build(:dot_svg)) } + let(:file) { build(:file, file_type: build(:dot_svg)) } it 'is a text file icon' do expect(file_icon).to include('fa-file-text-o') @@ -60,7 +60,7 @@ describe FileTree do end context 'with all other files' do - let(:file) { FactoryBot.build(:file, file_type: FactoryBot.build(:dot_md)) } + let(:file) { build(:file, file_type: build(:dot_md)) } it 'is a generic file icon' do expect(file_icon).to include('fa-file-o') @@ -77,7 +77,7 @@ describe FileTree do describe '#initialize' do let(:file_tree) { described_class.new(files) } - let(:files) { FactoryBot.build_list(:file, 10, context: nil, path: 'foo/bar/baz') } + let(:files) { build_list(:file, 10, context: nil, path: 'foo/bar/baz') } it 'creates a root node' do # Instead of checking #initialize on the parent, we validate #set_as_root! @@ -95,7 +95,7 @@ describe FileTree do end describe '#map_to_js_tree' do - let(:file) { FactoryBot.build(:file) } + let(:file) { build(:file) } let(:js_tree) { file_tree.send(:map_to_js_tree, node) } let!(:leaf) { root.add(Tree::TreeNode.new('', file)) } let(:root) { Tree::TreeNode.new('', file) } @@ -186,7 +186,7 @@ describe FileTree do end context 'with files' do - let(:files) { FactoryBot.build_list(:file, 10, context: nil, path: 'foo/bar/baz') } + let(:files) { build_list(:file, 10, context: nil, path: 'foo/bar/baz') } let(:file_tree) { described_class.new(files) } let(:js_tree) { file_tree.to_js_tree } diff --git a/spec/lib/runner/strategy/docker_container_pool_spec.rb b/spec/lib/runner/strategy/docker_container_pool_spec.rb index 6cec57dd..d785867d 100644 --- a/spec/lib/runner/strategy/docker_container_pool_spec.rb +++ b/spec/lib/runner/strategy/docker_container_pool_spec.rb @@ -4,8 +4,8 @@ require 'rails_helper' require 'pathname' describe Runner::Strategy::DockerContainerPool do - let(:runner_id) { FactoryBot.attributes_for(:runner)[:runner_id] } - let(:execution_environment) { FactoryBot.create :ruby } + let(:runner_id) { attributes_for(:runner)[:runner_id] } + let(:execution_environment) { create :ruby } let(:container_pool) { described_class.new(runner_id, execution_environment) } let(:docker_container_pool_url) { 'http://localhost:1234' } let(:config) { {url: docker_container_pool_url, unused_runner_expiration_time: 180} } @@ -112,22 +112,20 @@ describe Runner::Strategy::DockerContainerPool do context 'when receiving a normal file' do let(:file_content) { 'print("Hello World!")' } - let(:files) { [FactoryBot.build(:file, content: file_content)] } + let(:files) { [build(:file, content: file_content)] } it 'writes the file to disk' do - file = instance_double(File) - allow(File).to receive(:open).and_yield(file) - expect(file).to receive(:write).with(file_content) + expect(File).to receive(:write).with(local_path.join(files.first.filepath), file_content) container_pool.copy_files(files) end it 'creates the file inside the workspace' do - expect(File).to receive(:open).with(local_path.join(files.first.filepath), 'w') + expect(File).to receive(:write).with(local_path.join(files.first.filepath), files.first.content) container_pool.copy_files(files) end it 'raises an error in case of an IOError' do - allow(File).to receive(:open).and_raise(IOError) + allow(File).to receive(:write).and_raise(IOError) expect { container_pool.copy_files(files) }.to raise_error(Runner::Error::WorkspaceError, /#{files.first.filepath}/) end @@ -137,10 +135,10 @@ describe Runner::Strategy::DockerContainerPool do context 'when the file is inside a directory' do let(:directory) { 'temp/dir' } - let(:files) { [FactoryBot.build(:file, path: directory)] } + let(:files) { [build(:file, path: directory)] } before do - allow(File).to receive(:open) + allow(File).to receive(:write) allow(FileUtils).to receive(:mkdir_p).with(local_path) allow(FileUtils).to receive(:mkdir_p).with(local_path.join(directory)) end @@ -159,7 +157,7 @@ describe Runner::Strategy::DockerContainerPool do end context 'when receiving a binary file' do - let(:files) { [FactoryBot.build(:file, :image)] } + let(:files) { [build(:file, :image)] } it 'copies the file inside the workspace' do expect(FileUtils).to receive(:cp).with(files.first.native_file.path, local_path.join(files.first.filepath)) @@ -168,11 +166,11 @@ describe Runner::Strategy::DockerContainerPool do end context 'when receiving multiple files' do - let(:files) { FactoryBot.build_list(:file, 3) } + let(:files) { build_list(:file, 3) } it 'creates all files' do files.each do |file| - expect(File).to receive(:open).with(local_path.join(file.filepath), 'w') + expect(File).to receive(:write).with(local_path.join(file.filepath), file.content) end container_pool.copy_files(files) end diff --git a/spec/lib/runner/strategy/poseidon_spec.rb b/spec/lib/runner/strategy/poseidon_spec.rb index f514e0ff..92c1da28 100644 --- a/spec/lib/runner/strategy/poseidon_spec.rb +++ b/spec/lib/runner/strategy/poseidon_spec.rb @@ -3,8 +3,8 @@ require 'rails_helper' describe Runner::Strategy::Poseidon do - let(:runner_id) { FactoryBot.attributes_for(:runner)[:runner_id] } - let(:execution_environment) { FactoryBot.create :ruby } + let(:runner_id) { attributes_for(:runner)[:runner_id] } + let(:execution_environment) { create :ruby } let(:poseidon) { described_class.new(runner_id, execution_environment) } let(:error_message) { 'test error message' } let(:response_body) { nil } @@ -128,7 +128,7 @@ describe Runner::Strategy::Poseidon do describe '::sync_environment' do let(:action) { -> { described_class.sync_environment(execution_environment) } } - let(:execution_environment) { FactoryBot.create(:ruby) } + let(:execution_environment) { create(:ruby) } it 'makes the correct request to Poseidon' do faraday_connection = instance_double 'Faraday::Connection' @@ -321,7 +321,7 @@ describe Runner::Strategy::Poseidon do describe '#copy_files' do let(:file_content) { 'print("Hello World!")' } - let(:file) { FactoryBot.build(:file, content: file_content) } + let(:file) { build(:file, content: file_content) } let(:action) { -> { poseidon.copy_files([file]) } } let(:encoded_file_content) { Base64.strict_encode64(file.content) } let!(:copy_files_stub) do diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 5054abd8..b9b14bab 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe UserMailer do - let(:user) { InternalUser.create(FactoryBot.attributes_for(:teacher)) } + let(:user) { InternalUser.create(attributes_for(:teacher)) } describe '#activation_needed_email' do let(:mail) { described_class.activation_needed_email(user) } diff --git a/spec/models/code_ocean/file_spec.rb b/spec/models/code_ocean/file_spec.rb index baef520d..a123a31d 100644 --- a/spec/models/code_ocean/file_spec.rb +++ b/spec/models/code_ocean/file_spec.rb @@ -6,7 +6,7 @@ describe CodeOcean::File do let(:file) { described_class.create.tap {|file| file.update(content: nil, hidden: nil, read_only: nil) } } it 'validates the presence of a file type' do - expect(file.errors[:file_type_id]).to be_present + expect(file.errors[:file_type]).to be_present end it 'validates the presence of the hidden flag' do diff --git a/spec/models/codeharbor_link_spec.rb b/spec/models/codeharbor_link_spec.rb index f999164e..1e9bcb95 100644 --- a/spec/models/codeharbor_link_spec.rb +++ b/spec/models/codeharbor_link_spec.rb @@ -11,7 +11,7 @@ describe CodeharborLink do describe '#to_s' do subject { codeharbor_link.to_s } - let(:codeharbor_link) { FactoryBot.create(:codeharbor_link) } + let(:codeharbor_link) { create(:codeharbor_link) } it { is_expected.to eql codeharbor_link.id.to_s } end diff --git a/spec/models/consumer_spec.rb b/spec/models/consumer_spec.rb index 8ffb7b2d..bdda9fb1 100644 --- a/spec/models/consumer_spec.rb +++ b/spec/models/consumer_spec.rb @@ -14,7 +14,7 @@ describe Consumer do end it 'validates the uniqueness of the OAuth key' do - consumer.update(oauth_key: FactoryBot.create(:consumer).oauth_key) + consumer.update(oauth_key: create(:consumer).oauth_key) expect(consumer.errors[:oauth_key]).to be_present end diff --git a/spec/models/execution_environment_spec.rb b/spec/models/execution_environment_spec.rb index 4a6e2ff3..05ef6666 100644 --- a/spec/models/execution_environment_spec.rb +++ b/spec/models/execution_environment_spec.rb @@ -8,7 +8,7 @@ describe ExecutionEnvironment do it 'validates that the Docker image works' do allow(execution_environment).to receive(:validate_docker_image?).and_return(true) allow(execution_environment).to receive(:working_docker_image?).and_return(true) - execution_environment.update(FactoryBot.build(:ruby).attributes) + execution_environment.update(build(:ruby).attributes) expect(execution_environment).to have_received(:working_docker_image?) end @@ -81,8 +81,7 @@ describe ExecutionEnvironment do end it 'validates the presence of a user' do - expect(execution_environment.errors[:user_id]).to be_present - expect(execution_environment.errors[:user_type]).to be_present + expect(execution_environment.errors[:user]).to be_present end it 'validates the format of the exposed ports' do @@ -95,7 +94,7 @@ describe ExecutionEnvironment do describe '#valid_test_setup?' do context 'with a test command and a testing framework' do - before { execution_environment.update(test_command: FactoryBot.attributes_for(:ruby)[:test_command], testing_framework: FactoryBot.attributes_for(:ruby)[:testing_framework]) } + before { execution_environment.update(test_command: attributes_for(:ruby)[:test_command], testing_framework: attributes_for(:ruby)[:testing_framework]) } it 'is valid' do expect(execution_environment.errors[:test_command]).to be_blank @@ -103,7 +102,7 @@ describe ExecutionEnvironment do end context 'with a test command but no testing framework' do - before { execution_environment.update(test_command: FactoryBot.attributes_for(:ruby)[:test_command], testing_framework: nil) } + before { execution_environment.update(test_command: attributes_for(:ruby)[:test_command], testing_framework: nil) } it 'is invalid' do expect(execution_environment.errors[:test_command]).to be_present @@ -111,7 +110,7 @@ describe ExecutionEnvironment do end context 'with no test command but a testing framework' do - before { execution_environment.update(test_command: nil, testing_framework: FactoryBot.attributes_for(:ruby)[:testing_framework]) } + before { execution_environment.update(test_command: nil, testing_framework: attributes_for(:ruby)[:testing_framework]) } it 'is invalid' do expect(execution_environment.errors[:test_command]).to be_present @@ -144,7 +143,7 @@ describe ExecutionEnvironment do end it 'is true otherwise' do - execution_environment.docker_image = FactoryBot.attributes_for(:ruby)[:docker_image] + execution_environment.docker_image = attributes_for(:ruby)[:docker_image] execution_environment.pool_size = 1 allow(Rails.env).to receive(:test?).and_return(false) expect(execution_environment.send(:validate_docker_image?)).to be true @@ -152,7 +151,7 @@ describe ExecutionEnvironment do end describe '#working_docker_image?' do - let(:execution_environment) { FactoryBot.create(:ruby) } + let(:execution_environment) { create(:ruby) } let(:working_docker_image?) { execution_environment.send(:working_docker_image?) } let(:runner) { instance_double 'runner' } diff --git a/spec/models/exercise_spec.rb b/spec/models/exercise_spec.rb index 86596907..57bd66c9 100644 --- a/spec/models/exercise_spec.rb +++ b/spec/models/exercise_spec.rb @@ -4,15 +4,15 @@ require 'rails_helper' describe Exercise do let(:exercise) { described_class.create.tap {|exercise| exercise.update(public: nil, token: nil) } } - let(:users) { FactoryBot.create_list(:external_user, 10) } + let(:users) { create_list(:external_user, 10) } def create_submissions - FactoryBot.create_list(:submission, 10, cause: 'submit', exercise: exercise, score: Forgery(:basic).number, user: users.sample) + create_list(:submission, 10, cause: 'submit', exercise: exercise, score: Forgery(:basic).number, user: users.sample) end it 'validates the number of main files' do - exercise = FactoryBot.create(:dummy) - exercise.files += FactoryBot.create_pair(:file) + exercise = create(:dummy) + exercise.files += create_pair(:file) expect(exercise).to receive(:valid_main_file?).and_call_original exercise.save expect(exercise.errors[:files]).to be_present @@ -37,36 +37,35 @@ describe Exercise do end it 'validates the presence of a user' do - expect(exercise.errors[:user_id]).to be_present - expect(exercise.errors[:user_type]).to be_present + expect(exercise.errors[:user]).to be_present end context 'when exercise is unpublished' do - subject { FactoryBot.build(:dummy, unpublished: true) } + subject { build(:dummy, unpublished: true) } it { is_expected.not_to validate_presence_of(:execution_environment) } end context 'when exercise is not unpublished' do - subject { FactoryBot.build(:dummy, unpublished: false) } + subject { build(:dummy, unpublished: false) } it { is_expected.to validate_presence_of(:execution_environment) } end context 'with uuid' do - subject { FactoryBot.build(:dummy, uuid: SecureRandom.uuid) } + subject { build(:dummy, uuid: SecureRandom.uuid) } it { is_expected.to validate_uniqueness_of(:uuid).case_insensitive } end context 'without uuid' do - subject { FactoryBot.build(:dummy, uuid: nil) } + subject { build(:dummy, uuid: nil) } it { is_expected.not_to validate_uniqueness_of(:uuid) } end describe '#average_percentage' do - let(:exercise) { FactoryBot.create(:fibonacci) } + let(:exercise) { create(:fibonacci) } context 'without submissions' do it 'returns nil' do @@ -85,7 +84,7 @@ describe Exercise do end describe '#average_score' do - let(:exercise) { FactoryBot.create(:fibonacci) } + let(:exercise) { create(:fibonacci) } context 'without submissions' do it 'returns nil' do @@ -104,7 +103,7 @@ describe Exercise do end describe '#duplicate' do - let(:exercise) { FactoryBot.create(:fibonacci) } + let(:exercise) { create(:fibonacci) } after { exercise.duplicate } diff --git a/spec/models/external_user_spec.rb b/spec/models/external_user_spec.rb index ee7ca64b..a99f00a7 100644 --- a/spec/models/external_user_spec.rb +++ b/spec/models/external_user_spec.rb @@ -6,7 +6,7 @@ describe ExternalUser do let(:user) { described_class.create } it 'validates the presence of a consumer' do - expect(user.errors[:consumer_id]).to be_present + expect(user.errors[:consumer]).to be_present end it 'validates the presence of an external ID' do @@ -15,7 +15,7 @@ describe ExternalUser do describe '#admin?' do it 'is false' do - expect(FactoryBot.build(:external_user).admin?).to be false + expect(build(:external_user).admin?).to be false end end @@ -33,7 +33,7 @@ describe ExternalUser do describe '#teacher?' do it 'is false' do - expect(FactoryBot.build(:external_user).teacher?).to be false + expect(build(:external_user).teacher?).to be false end end end diff --git a/spec/models/file_type_spec.rb b/spec/models/file_type_spec.rb index 4fb00c1f..0fc9c043 100644 --- a/spec/models/file_type_spec.rb +++ b/spec/models/file_type_spec.rb @@ -52,7 +52,6 @@ describe FileType do end it 'validates the presence of a user' do - expect(file_type.errors[:user_id]).to be_present - expect(file_type.errors[:user_type]).to be_present + expect(file_type.errors[:user]).to be_present end end diff --git a/spec/models/internal_user_spec.rb b/spec/models/internal_user_spec.rb index a9c131be..82c525a2 100644 --- a/spec/models/internal_user_spec.rb +++ b/spec/models/internal_user_spec.rb @@ -11,12 +11,12 @@ describe InternalUser do end it 'validates the uniqueness of the email address' do - user.update(email: FactoryBot.create(:admin).email) + user.update(email: create(:admin).email) expect(user.errors[:email]).to be_present end context 'when not activated' do - let(:user) { FactoryBot.create(:teacher) } + let(:user) { create(:teacher) } before do user.send(:setup_activation) @@ -35,7 +35,7 @@ describe InternalUser do end context 'with a pending password reset' do - let(:user) { FactoryBot.create(:teacher) } + let(:user) { create(:teacher) } before { user.deliver_reset_password_instructions! } @@ -51,7 +51,7 @@ describe InternalUser do end context 'when complete' do - let(:user) { FactoryBot.create(:teacher, activation_state: 'active') } + let(:user) { create(:teacher, activation_state: 'active') } it 'does not validate the confirmation of the password' do user.update(password: password, password_confirmation: '') @@ -74,8 +74,8 @@ describe InternalUser do describe '#admin?' do it 'is only true for admins' do - expect(FactoryBot.build(:admin).admin?).to be true - expect(FactoryBot.build(:teacher).admin?).to be false + expect(build(:admin).admin?).to be true + expect(build(:teacher).admin?).to be false end end @@ -93,8 +93,8 @@ describe InternalUser do describe '#teacher?' do it 'is only true for teachers' do - expect(FactoryBot.build(:admin).teacher?).to be false - expect(FactoryBot.build(:teacher).teacher?).to be true + expect(build(:admin).teacher?).to be false + expect(build(:teacher).teacher?).to be true end end end diff --git a/spec/models/request_for_comment_spec.rb b/spec/models/request_for_comment_spec.rb index f4038841..8cd7b55a 100644 --- a/spec/models/request_for_comment_spec.rb +++ b/spec/models/request_for_comment_spec.rb @@ -3,10 +3,10 @@ require 'rails_helper' describe RequestForComment do - let!(:rfc) { FactoryBot.create(:rfc) } + let!(:rfc) { create(:rfc) } describe 'scope with_comments' do - let!(:rfc2) { FactoryBot.create(:rfc_with_comment) } + let!(:rfc2) { create(:rfc_with_comment) } it 'includes all RfCs with comments' do expect(described_class.with_comments).to include(rfc2) diff --git a/spec/models/runner_spec.rb b/spec/models/runner_spec.rb index 8c156555..5f23e775 100644 --- a/spec/models/runner_spec.rb +++ b/spec/models/runner_spec.rb @@ -3,12 +3,12 @@ require 'rails_helper' describe Runner do - let(:runner_id) { FactoryBot.attributes_for(:runner)[:runner_id] } + let(:runner_id) { attributes_for(:runner)[:runner_id] } let(:strategy_class) { described_class.strategy_class } let(:strategy) { instance_double(strategy_class) } describe 'attribute validation' do - let(:runner) { FactoryBot.create :runner } + let(:runner) { create :runner } it 'validates the presence of the runner id' do described_class.skip_callback(:validation, :before, :request_id) @@ -162,8 +162,8 @@ describe Runner do end describe 'creation' do - let(:user) { FactoryBot.create :external_user } - let(:execution_environment) { FactoryBot.create :ruby } + let(:user) { create :external_user } + let(:execution_environment) { create :ruby } let(:create_action) { -> { described_class.create(user: user, execution_environment: execution_environment) } } it 'requests a runner id from the runner management' do @@ -187,12 +187,12 @@ describe Runner do it 'does not call the runner management again while a runner id is set' do expect(strategy_class).to receive(:request_from_management).and_return(runner_id).once runner = create_action.call - runner.update(user: FactoryBot.create(:external_user)) + runner.update(user: create(:external_user)) end end describe '#request_new_id' do - let(:runner) { FactoryBot.create :runner } + let(:runner) { create :runner } context 'when the environment is available in the runner management' do it 'requests the runner management' do @@ -240,8 +240,8 @@ describe Runner do end describe '::for' do - let(:user) { FactoryBot.create :external_user } - let(:exercise) { FactoryBot.create :fibonacci } + let(:user) { create :external_user } + let(:exercise) { create :fibonacci } context 'when the runner could not be saved' do before { allow(strategy_class).to receive(:request_from_management).and_return(nil) } @@ -252,7 +252,7 @@ describe Runner do end context 'when a runner already exists' do - let!(:existing_runner) { FactoryBot.create(:runner, user: user, execution_environment: exercise.execution_environment) } + let!(:existing_runner) { create(:runner, user: user, execution_environment: exercise.execution_environment) } it 'returns the existing runner' do new_runner = described_class.for(user, exercise.execution_environment) diff --git a/spec/models/submission_spec.rb b/spec/models/submission_spec.rb index 60a86923..9b6a6ab5 100644 --- a/spec/models/submission_spec.rb +++ b/spec/models/submission_spec.rb @@ -3,23 +3,22 @@ require 'rails_helper' describe Submission do - let(:submission) { FactoryBot.create(:submission, exercise: FactoryBot.create(:dummy)) } + let(:submission) { create(:submission, exercise: create(:dummy)) } it 'validates the presence of a cause' do expect(described_class.create.errors[:cause]).to be_present end it 'validates the presence of an exercise' do - expect(described_class.create.errors[:exercise_id]).to be_present + expect(described_class.create.errors[:exercise]).to be_present end it 'validates the presence of a user' do - expect(described_class.create.errors[:user_id]).to be_present - expect(described_class.create.errors[:user_type]).to be_present + expect(described_class.create.errors[:user]).to be_present end describe '#main_file' do - let(:submission) { FactoryBot.create(:submission) } + let(:submission) { create(:submission) } it "returns the submission's main file" do expect(submission.main_file).to be_a(CodeOcean::File) @@ -29,7 +28,7 @@ describe Submission do describe '#normalized_score' do context 'with a score' do - let(:submission) { FactoryBot.create(:submission) } + let(:submission) { create(:submission) } before { submission.score = submission.exercise.maximum_score / 2 } @@ -49,7 +48,7 @@ describe Submission do describe '#percentage' do context 'with a score' do - let(:submission) { FactoryBot.create(:submission) } + let(:submission) { create(:submission) } before { submission.score = submission.exercise.maximum_score / 2 } @@ -69,11 +68,11 @@ describe Submission do describe '#siblings' do let(:siblings) { described_class.find_by(user: user).siblings } - let(:user) { FactoryBot.create(:external_user) } + let(:user) { create(:external_user) } before do 10.times.each_with_index do |_, index| - FactoryBot.create(:submission, exercise: submission.exercise, user: (index.even? ? user : FactoryBot.create(:external_user))) + create(:submission, exercise: submission.exercise, user: (index.even? ? user : create(:external_user))) end end @@ -92,9 +91,9 @@ describe Submission do describe '#redirect_to_feedback?' do context 'with no exercise feedback' do - let(:exercise) { FactoryBot.create(:dummy) } - let(:user) { FactoryBot.build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) % 10) } - let(:submission) { FactoryBot.build(:submission, exercise: exercise, user: user) } + let(:exercise) { create(:dummy) } + let(:user) { build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) % 10) } + let(:submission) { build(:submission, exercise: exercise, user: user) } it 'sends 10% of users to feedback page' do expect(submission.send(:redirect_to_feedback?)).to be_truthy @@ -102,16 +101,16 @@ describe Submission do it 'does not redirect other users' do 9.times do |i| - submission = FactoryBot.build(:submission, exercise: exercise, user: FactoryBot.build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) - i - 1)) + submission = build(:submission, exercise: exercise, user: build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) - i - 1)) expect(submission.send(:redirect_to_feedback?)).to be_falsey end end end context 'with little exercise feedback' do - let(:exercise) { FactoryBot.create(:dummy_with_user_feedbacks) } - let(:user) { FactoryBot.build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) % 10) } - let(:submission) { FactoryBot.build(:submission, exercise: exercise, user: user) } + let(:exercise) { create(:dummy_with_user_feedbacks) } + let(:user) { build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) % 10) } + let(:submission) { build(:submission, exercise: exercise, user: user) } it 'sends 10% of users to feedback page' do expect(submission.send(:redirect_to_feedback?)).to be_truthy @@ -119,15 +118,15 @@ describe Submission do it 'does not redirect other users' do 9.times do |i| - submission = FactoryBot.build(:submission, exercise: exercise, user: FactoryBot.build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) - i - 1)) + submission = build(:submission, exercise: exercise, user: build(:external_user, id: (11 - (exercise.created_at.to_i % 10)) - i - 1)) expect(submission.send(:redirect_to_feedback?)).to be_falsey end end end context 'with enough exercise feedback' do - let(:exercise) { FactoryBot.create(:dummy_with_user_feedbacks, user_feedbacks_count: 42) } - let(:user) { FactoryBot.create(:external_user) } + let(:exercise) { create(:dummy_with_user_feedbacks, user_feedbacks_count: 42) } + let(:user) { create(:external_user) } before do allow_any_instance_of(described_class).to receive(:redirect_to_feedback?).and_return(false) @@ -135,7 +134,7 @@ describe Submission do it 'sends nobody to feedback page' do 30.times do |_i| - submission = FactoryBot.create(:submission, exercise: exercise, user: FactoryBot.create(:external_user)) + submission = create(:submission, exercise: exercise, user: create(:external_user)) expect(submission.send(:redirect_to_feedback?)).to be_falsey end end @@ -143,7 +142,7 @@ describe Submission do end describe '#calculate_score' do - let(:runner) { FactoryBot.create :runner } + let(:runner) { create :runner } before do allow(Runner).to receive(:for).and_return(runner) diff --git a/spec/policies/admin/dashboard_policy_spec.rb b/spec/policies/admin/dashboard_policy_spec.rb index 4646d90b..b40e2694 100644 --- a/spec/policies/admin/dashboard_policy_spec.rb +++ b/spec/policies/admin/dashboard_policy_spec.rb @@ -7,15 +7,15 @@ describe Admin::DashboardPolicy do permissions :show? do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), :dashboard) + expect(policy).to permit(build(:admin), :dashboard) end it 'does not grant access to teachers' do - expect(policy).not_to permit(FactoryBot.build(:teacher), :dashboard) + expect(policy).not_to permit(build(:teacher), :dashboard) end it 'does not grant access to external users' do - expect(policy).not_to permit(FactoryBot.build(:external_user), :dashboard) + expect(policy).not_to permit(build(:external_user), :dashboard) end end end diff --git a/spec/policies/code_ocean/file_policy_spec.rb b/spec/policies/code_ocean/file_policy_spec.rb index f32b9b89..233089cf 100644 --- a/spec/policies/code_ocean/file_policy_spec.rb +++ b/spec/policies/code_ocean/file_policy_spec.rb @@ -5,15 +5,15 @@ require 'rails_helper' describe CodeOcean::FilePolicy do subject(:policy) { described_class } - let(:exercise) { FactoryBot.create(:fibonacci) } - let(:submission) { FactoryBot.create(:submission) } + let(:exercise) { create(:fibonacci) } + let(:submission) { create(:submission) } permissions :create? do context 'when being part of an exercise' do let(:file) { exercise.files.first } it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), file) + expect(policy).to permit(build(:admin), file) end it 'grants access to authors' do @@ -22,7 +22,7 @@ describe CodeOcean::FilePolicy do it 'does not grant access to all other users' do %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), file) + expect(policy).not_to permit(build(factory_name), file) end end end @@ -52,7 +52,7 @@ describe CodeOcean::FilePolicy do it 'does not grant access to all other users' do %i[admin external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), file) + expect(policy).not_to permit(build(factory_name), file) end end end @@ -63,7 +63,7 @@ describe CodeOcean::FilePolicy do let(:file) { exercise.files.first } it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), file) + expect(policy).to permit(build(:admin), file) end it 'grants access to authors' do @@ -72,7 +72,7 @@ describe CodeOcean::FilePolicy do it 'does not grant access to all other users' do %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), file) + expect(policy).not_to permit(build(factory_name), file) end end end @@ -82,7 +82,7 @@ describe CodeOcean::FilePolicy do it 'does not grant access to anyone' do %i[admin external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), file) + expect(policy).not_to permit(build(factory_name), file) end end end diff --git a/spec/policies/codeharbor_link_policy_spec.rb b/spec/policies/codeharbor_link_policy_spec.rb index 90646f9c..550700c1 100644 --- a/spec/policies/codeharbor_link_policy_spec.rb +++ b/spec/policies/codeharbor_link_policy_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe CodeharborLinkPolicy do subject(:policy) { described_class } - let(:codeharbor_link) { FactoryBot.create(:codeharbor_link) } + let(:codeharbor_link) { create(:codeharbor_link) } context 'when CodeHarbor link is enabled' do let(:codeocean_config) { instance_double(CodeOcean::Config) } @@ -20,7 +20,7 @@ describe CodeharborLinkPolicy do permissions(action) do it 'does not grant access any user' do %i[external_user teacher admin].each do |factory_name| - expect(policy).not_to permit(FactoryBot.create(factory_name), codeharbor_link) + expect(policy).not_to permit(create(factory_name), codeharbor_link) end end end @@ -30,12 +30,12 @@ describe CodeharborLinkPolicy do permissions(action) do it 'grants access to teachers' do %i[teacher admin].each do |factory_name| - expect(policy).to permit(FactoryBot.create(factory_name), codeharbor_link) + expect(policy).to permit(create(factory_name), codeharbor_link) end end it 'does not grant access to all other users' do - expect(policy).not_to permit(FactoryBot.create(:external_user), codeharbor_link) + expect(policy).not_to permit(create(:external_user), codeharbor_link) end end end @@ -48,7 +48,7 @@ describe CodeharborLinkPolicy do it 'does not grant access to arbitrary users' do %i[external_user admin teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.create(factory_name), codeharbor_link) + expect(policy).not_to permit(create(factory_name), codeharbor_link) end end end @@ -57,7 +57,7 @@ describe CodeharborLinkPolicy do permissions(:enabled?) do it 'reflects the config option' do %i[external_user admin teacher].each do |factory_name| - expect(policy).to permit(FactoryBot.create(factory_name), codeharbor_link) + expect(policy).to permit(create(factory_name), codeharbor_link) end end end @@ -75,7 +75,7 @@ describe CodeharborLinkPolicy do permissions(:enabled?) do it 'reflects the config option' do %i[external_user admin teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.create(factory_name), codeharbor_link) + expect(policy).not_to permit(create(factory_name), codeharbor_link) end end end diff --git a/spec/policies/consumer_policy_spec.rb b/spec/policies/consumer_policy_spec.rb index bd9071a6..4f4164fb 100644 --- a/spec/policies/consumer_policy_spec.rb +++ b/spec/policies/consumer_policy_spec.rb @@ -8,9 +8,9 @@ describe ConsumerPolicy do %i[create? destroy? edit? index? new? show? update?].each do |action| permissions(action) do it 'grants access to admins only' do - expect(policy).to permit(FactoryBot.build(:admin), Consumer.new) + expect(policy).to permit(build(:admin), Consumer.new) %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), Consumer.new) + expect(policy).not_to permit(build(factory_name), Consumer.new) end end end diff --git a/spec/policies/execution_environment_policy_spec.rb b/spec/policies/execution_environment_policy_spec.rb index 588f76db..651e9555 100644 --- a/spec/policies/execution_environment_policy_spec.rb +++ b/spec/policies/execution_environment_policy_spec.rb @@ -5,20 +5,20 @@ require 'rails_helper' describe ExecutionEnvironmentPolicy do subject(:policy) { described_class } - let(:execution_environment) { FactoryBot.build(:ruby) } + let(:execution_environment) { build(:ruby) } [:index?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), execution_environment) + expect(policy).to permit(build(:admin), execution_environment) end it 'grants access to teachers' do - expect(policy).to permit(FactoryBot.build(:teacher), execution_environment) + expect(policy).to permit(build(:teacher), execution_environment) end it 'does not grant access to external users' do - expect(policy).not_to permit(FactoryBot.build(:external_user), execution_environment) + expect(policy).not_to permit(build(:external_user), execution_environment) end end end @@ -26,7 +26,7 @@ describe ExecutionEnvironmentPolicy do %i[execute_command? shell? statistics? show?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), execution_environment) + expect(policy).to permit(build(:admin), execution_environment) end it 'grants access to authors' do @@ -35,7 +35,7 @@ describe ExecutionEnvironmentPolicy do it 'does not grant access to all other users' do %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), execution_environment) + expect(policy).not_to permit(build(factory_name), execution_environment) end end end @@ -44,7 +44,7 @@ describe ExecutionEnvironmentPolicy do %i[destroy? edit? update? new? create?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), execution_environment) + expect(policy).to permit(build(:admin), execution_environment) end it 'does not grant access to authors' do @@ -53,7 +53,7 @@ describe ExecutionEnvironmentPolicy do it 'does not grant access to all other users' do %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), execution_environment) + expect(policy).not_to permit(build(factory_name), execution_environment) end end end @@ -61,7 +61,7 @@ describe ExecutionEnvironmentPolicy do permissions(:sync_all_to_runner_management?) do it 'grants access to the admin' do - expect(policy).to permit(FactoryBot.build(:admin)) + expect(policy).to permit(build(:admin)) end shared_examples 'it does not grant access' do |user| @@ -71,7 +71,7 @@ describe ExecutionEnvironmentPolicy do end %i[teacher external_user].each do |user| - include_examples 'it does not grant access', FactoryBot.build(user) + include_examples 'it does not grant access', FactoryBot.build(user) # rubocop:disable RSpec/FactoryBot/SyntaxMethods end end end diff --git a/spec/policies/exercise_policy_spec.rb b/spec/policies/exercise_policy_spec.rb index 3047d573..8fad12a6 100644 --- a/spec/policies/exercise_policy_spec.rb +++ b/spec/policies/exercise_policy_spec.rb @@ -5,13 +5,13 @@ require 'rails_helper' describe ExercisePolicy do subject(:policy) { described_class } - let(:exercise) { FactoryBot.build(:dummy, public: true) } + let(:exercise) { build(:dummy, public: true) } permissions :batch_update? do it 'grants access to admins only' do - expect(policy).to permit(FactoryBot.build(:admin), exercise) + expect(policy).to permit(build(:admin), exercise) %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), exercise) + expect(policy).not_to permit(build(factory_name), exercise) end end end @@ -19,15 +19,15 @@ describe ExercisePolicy do %i[create? index? new? statistics? feedback? rfcs_for_exercise?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), exercise) + expect(policy).to permit(build(:admin), exercise) end it 'grants access to teachers' do - expect(policy).to permit(FactoryBot.build(:teacher), exercise) + expect(policy).to permit(build(:teacher), exercise) end it 'does not grant access to external users' do - expect(policy).not_to permit(FactoryBot.build(:external_user), exercise) + expect(policy).not_to permit(build(:external_user), exercise) end end end @@ -35,7 +35,7 @@ describe ExercisePolicy do %i[clone? destroy? edit? update?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), exercise) + expect(policy).to permit(build(:admin), exercise) end it 'grants access to authors' do @@ -44,7 +44,7 @@ describe ExercisePolicy do it 'does not grant access to all other users' do %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), exercise) + expect(policy).not_to permit(build(factory_name), exercise) end end end @@ -60,7 +60,7 @@ describe ExercisePolicy do end context 'when user has codeharbor_link' do - before { user.codeharbor_link = FactoryBot.build(:codeharbor_link) } + before { user.codeharbor_link = build(:codeharbor_link) } it 'grants access' do expect(policy).to permit(user, exercise) @@ -69,14 +69,14 @@ describe ExercisePolicy do end context 'when user is admin' do - let(:user) { FactoryBot.build(:admin) } + let(:user) { build(:admin) } it 'does not grant access' do expect(policy).not_to permit(user, exercise) end context 'when user has codeharbor_link' do - before { user.codeharbor_link = FactoryBot.build(:codeharbor_link) } + before { user.codeharbor_link = build(:codeharbor_link) } it 'grants access' do expect(policy).to permit(user, exercise) @@ -86,14 +86,14 @@ describe ExercisePolicy do %i[external_user teacher].each do |factory_name| context "when user is #{factory_name}" do - let(:user) { FactoryBot.build(factory_name) } + let(:user) { build(factory_name) } it 'does not grant access' do expect(policy).not_to permit(user, exercise) end context 'when user has codeharbor_link' do - before { user.codeharbor_link = FactoryBot.build(:codeharbor_link) } + before { user.codeharbor_link = build(:codeharbor_link) } it 'does not grant access' do expect(policy).not_to permit(user, exercise) @@ -107,7 +107,7 @@ describe ExercisePolicy do [:show?].each do |action| permissions(action) do it 'not grants access to external users' do - expect(policy).not_to permit(FactoryBot.build(:external_user), exercise) + expect(policy).not_to permit(build(:external_user), exercise) end end end @@ -116,7 +116,7 @@ describe ExercisePolicy do permissions(action) do it 'grants access to anyone' do %i[admin external_user teacher].each do |factory_name| - expect(policy).to permit(FactoryBot.build(factory_name), Exercise.new) + expect(policy).to permit(build(factory_name), Exercise.new) end end end @@ -124,14 +124,14 @@ describe ExercisePolicy do describe ExercisePolicy::Scope do describe '#resolve' do - let(:admin) { FactoryBot.create(:admin) } - let(:external_user) { FactoryBot.create(:external_user) } - let(:teacher) { FactoryBot.create(:teacher) } + let(:admin) { create(:admin) } + let(:external_user) { create(:external_user) } + let(:teacher) { create(:teacher) } before do [admin, teacher].each do |user| [true, false].each do |public| - FactoryBot.create(:dummy, public: public, user_id: user.id, user_type: InternalUser.name) + create(:dummy, public: public, user_id: user.id, user_type: InternalUser.name) end end end diff --git a/spec/policies/external_user_policy_spec.rb b/spec/policies/external_user_policy_spec.rb index 82c1452b..5494b6fc 100644 --- a/spec/policies/external_user_policy_spec.rb +++ b/spec/policies/external_user_policy_spec.rb @@ -8,9 +8,9 @@ describe ExternalUserPolicy do %i[create? destroy? edit? new? show? update?].each do |action| permissions(action) do it 'grants access to admins only' do - expect(policy).to permit(FactoryBot.build(:admin), ExternalUser.new) + expect(policy).to permit(build(:admin), ExternalUser.new) %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), ExternalUser.new) + expect(policy).not_to permit(build(factory_name), ExternalUser.new) end end end @@ -19,10 +19,10 @@ describe ExternalUserPolicy do [:index?].each do |action| permissions(action) do it 'grants access to admins and teachers only' do - expect(policy).to permit(FactoryBot.build(:admin), ExternalUser.new) - expect(policy).to permit(FactoryBot.build(:teacher), ExternalUser.new) + expect(policy).to permit(build(:admin), ExternalUser.new) + expect(policy).to permit(build(:teacher), ExternalUser.new) [:external_user].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), ExternalUser.new) + expect(policy).not_to permit(build(factory_name), ExternalUser.new) end end end diff --git a/spec/policies/file_type_policy_spec.rb b/spec/policies/file_type_policy_spec.rb index 2b75f82b..5c6ce645 100644 --- a/spec/policies/file_type_policy_spec.rb +++ b/spec/policies/file_type_policy_spec.rb @@ -5,12 +5,12 @@ require 'rails_helper' describe FileTypePolicy do subject(:policy) { described_class } - let(:file_type) { FactoryBot.build(:dot_rb) } + let(:file_type) { build(:dot_rb) } %i[destroy? edit? update? new? create? index? show?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), file_type) + expect(policy).to permit(build(:admin), file_type) end it 'grants access to authors' do @@ -19,7 +19,7 @@ describe FileTypePolicy do it 'does not grant access to all other users' do %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), file_type) + expect(policy).not_to permit(build(factory_name), file_type) end end end diff --git a/spec/policies/internal_user_policy_spec.rb b/spec/policies/internal_user_policy_spec.rb index fbbf3a0b..1e900eb0 100644 --- a/spec/policies/internal_user_policy_spec.rb +++ b/spec/policies/internal_user_policy_spec.rb @@ -8,9 +8,9 @@ describe InternalUserPolicy do %i[create? edit? index? new? show? update?].each do |action| permissions(action) do it 'grants access to admins only' do - expect(policy).to permit(FactoryBot.build(:admin), InternalUser.new) + expect(policy).to permit(build(:admin), InternalUser.new) %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), InternalUser.new) + expect(policy).not_to permit(build(factory_name), InternalUser.new) end end end @@ -20,16 +20,16 @@ describe InternalUserPolicy do context 'with an admin user' do it 'grants access to no one' do %i[admin external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), FactoryBot.build(:admin)) + expect(policy).not_to permit(build(factory_name), build(:admin)) end end end context 'with a non-admin user' do it 'grants access to admins only' do - expect(policy).to permit(FactoryBot.build(:admin), InternalUser.new) + expect(policy).to permit(build(:admin), InternalUser.new) %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), FactoryBot.build(:teacher)) + expect(policy).not_to permit(build(factory_name), build(:teacher)) end end end diff --git a/spec/policies/submission_policy_spec.rb b/spec/policies/submission_policy_spec.rb index 7d2aa4d6..71bdc3e0 100644 --- a/spec/policies/submission_policy_spec.rb +++ b/spec/policies/submission_policy_spec.rb @@ -8,7 +8,7 @@ describe SubmissionPolicy do permissions :create? do it 'grants access to anyone' do %i[admin external_user teacher].each do |factory_name| - expect(policy).to permit(FactoryBot.build(factory_name), Submission.new) + expect(policy).to permit(build(factory_name), Submission.new) end end end @@ -16,21 +16,21 @@ describe SubmissionPolicy do %i[download_file? render_file? run? score? show? statistics? stop? test?].each do |action| permissions(action) do it 'grants access to admins' do - expect(policy).to permit(FactoryBot.build(:admin), Submission.new) + expect(policy).to permit(build(:admin), Submission.new) end it 'grants access to authors' do - user = FactoryBot.create(:external_user) - expect(policy).to permit(user, FactoryBot.build(:submission, exercise: Exercise.new, user_id: user.id, user_type: user.class.name)) + user = create(:external_user) + expect(policy).to permit(user, build(:submission, exercise: Exercise.new, user_id: user.id, user_type: user.class.name)) end end end permissions :index? do it 'grants access to admins only' do - expect(policy).to permit(FactoryBot.build(:admin), Submission.new) + expect(policy).to permit(build(:admin), Submission.new) %i[external_user teacher].each do |factory_name| - expect(policy).not_to permit(FactoryBot.build(factory_name), Submission.new) + expect(policy).not_to permit(build(factory_name), Submission.new) end end end diff --git a/spec/services/exercise_service/check_external_spec.rb b/spec/services/exercise_service/check_external_spec.rb index a4b0997c..3dffeae4 100644 --- a/spec/services/exercise_service/check_external_spec.rb +++ b/spec/services/exercise_service/check_external_spec.rb @@ -7,7 +7,7 @@ describe ExerciseService::CheckExternal do subject(:export_service) { described_class.new(uuid: uuid, codeharbor_link: codeharbor_link) } let(:uuid) { SecureRandom.uuid } - let(:codeharbor_link) { FactoryBot.build(:codeharbor_link) } + let(:codeharbor_link) { build(:codeharbor_link) } it 'assigns uuid' do expect(export_service.instance_variable_get(:@uuid)).to be uuid @@ -22,7 +22,7 @@ describe ExerciseService::CheckExternal do subject(:check_external_service) { described_class.call(uuid: uuid, codeharbor_link: codeharbor_link) } let(:uuid) { SecureRandom.uuid } - let(:codeharbor_link) { FactoryBot.build(:codeharbor_link) } + let(:codeharbor_link) { build(:codeharbor_link) } let(:response) { {}.to_json } before { stub_request(:post, codeharbor_link.check_uuid_url).to_return(body: response) } diff --git a/spec/services/exercise_service/push_external_spec.rb b/spec/services/exercise_service/push_external_spec.rb index 20c07a0a..2a52075f 100644 --- a/spec/services/exercise_service/push_external_spec.rb +++ b/spec/services/exercise_service/push_external_spec.rb @@ -6,8 +6,8 @@ RSpec.describe ExerciseService::PushExternal do describe '.new' do subject(:push_external) { described_class.new(zip: zip, codeharbor_link: codeharbor_link) } - let(:zip) { ProformaService::ExportTask.call(exercise: FactoryBot.build(:dummy)) } - let(:codeharbor_link) { FactoryBot.build(:codeharbor_link) } + let(:zip) { ProformaService::ExportTask.call(exercise: build(:dummy)) } + let(:codeharbor_link) { build(:codeharbor_link) } it 'assigns zip' do expect(push_external.instance_variable_get(:@zip)).to be zip @@ -21,8 +21,8 @@ RSpec.describe ExerciseService::PushExternal do describe '#execute' do subject(:push_external) { described_class.call(zip: zip, codeharbor_link: codeharbor_link) } - let(:zip) { ProformaService::ExportTask.call(exercise: FactoryBot.build(:dummy)) } - let(:codeharbor_link) { FactoryBot.build(:codeharbor_link) } + let(:zip) { ProformaService::ExportTask.call(exercise: build(:dummy)) } + let(:codeharbor_link) { build(:codeharbor_link) } let(:status) { 200 } let(:response) { '' } diff --git a/spec/services/proforma_service/convert_exercise_to_task_spec.rb b/spec/services/proforma_service/convert_exercise_to_task_spec.rb index 87d90b90..0fffcf59 100644 --- a/spec/services/proforma_service/convert_exercise_to_task_spec.rb +++ b/spec/services/proforma_service/convert_exercise_to_task_spec.rb @@ -6,7 +6,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do describe '.new' do subject(:convert_to_task) { described_class.new(exercise: exercise) } - let(:exercise) { FactoryBot.build(:dummy) } + let(:exercise) { build(:dummy) } it 'assigns exercise' do expect(convert_to_task.instance_variable_get(:@exercise)).to be exercise @@ -18,7 +18,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do let(:convert_to_task) { described_class.new(exercise: exercise) } let(:exercise) do - FactoryBot.create(:dummy, + create(:dummy, instructions: 'instruction', uuid: SecureRandom.uuid, files: files + tests) @@ -51,7 +51,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do context 'when exercise has a mainfile' do let(:files) { [file] } - let(:file) { FactoryBot.build(:file) } + let(:file) { build(:file) } it 'creates a task-file with the correct attributes' do expect(task.files.first).to have_attributes( @@ -69,7 +69,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do context 'when exercise has a regular file' do let(:files) { [file] } - let(:file) { FactoryBot.build(:file, role: 'regular_file', hidden: hidden, read_only: read_only) } + let(:file) { build(:file, role: 'regular_file', hidden: hidden, read_only: read_only) } let(:hidden) { true } let(:read_only) { true } @@ -103,7 +103,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do end context 'when file has an attachment' do - let(:file) { FactoryBot.build(:file, :image, role: 'regular_file') } + let(:file) { build(:file, :image, role: 'regular_file') } it 'creates a task-file with the correct attributes' do expect(task.files.first).to have_attributes( @@ -117,7 +117,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do context 'when exercise has a file with role reference implementation' do let(:files) { [file] } - let(:file) { FactoryBot.build(:file, role: 'reference_implementation') } + let(:file) { build(:file, role: 'reference_implementation') } it 'creates a task with one model-solution' do expect(task.model_solutions).to have(1).item @@ -145,7 +145,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do end context 'when exercise has multiple files with role reference implementation' do - let(:files) { FactoryBot.build_list(:file, 2, role: 'reference_implementation') } + let(:files) { build_list(:file, 2, role: 'reference_implementation') } it 'creates a task with two model-solutions' do expect(task.model_solutions).to have(2).items @@ -154,7 +154,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do context 'when exercise has a test' do let(:tests) { [test_file] } - let(:test_file) { FactoryBot.build(:test_file) } + let(:test_file) { build(:test_file) } # let(:file) { FactoryBot.build(:codeharbor_test_file) } it 'creates a task with one test' do @@ -188,7 +188,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do end context 'when exercise_file is not hidden' do - let(:test_file) { FactoryBot.create(:test_file, hidden: false) } + let(:test_file) { create(:test_file, hidden: false) } it 'creates the test file with the correct attribute' do expect(task.tests.first.files.first).to have_attributes(visible: 'yes') @@ -197,7 +197,7 @@ RSpec.describe ProformaService::ConvertExerciseToTask do end context 'when exercise has multiple tests' do - let(:tests) { FactoryBot.build_list(:test_file, 2) } + let(:tests) { build_list(:test_file, 2) } it 'creates a task with two tests' do expect(task.tests).to have(2).items diff --git a/spec/services/proforma_service/convert_task_to_exercise_spec.rb b/spec/services/proforma_service/convert_task_to_exercise_spec.rb index cca0b967..29c5f431 100644 --- a/spec/services/proforma_service/convert_task_to_exercise_spec.rb +++ b/spec/services/proforma_service/convert_task_to_exercise_spec.rb @@ -9,8 +9,8 @@ describe ProformaService::ConvertTaskToExercise do subject(:convert_to_exercise_service) { described_class.new(task: task, user: user, exercise: exercise) } let(:task) { Proforma::Task.new } - let(:user) { FactoryBot.build(:teacher) } - let(:exercise) { FactoryBot.build(:dummy) } + let(:user) { build(:teacher) } + let(:exercise) { build(:dummy) } it 'assigns task' do expect(convert_to_exercise_service.instance_variable_get(:@task)).to be task @@ -28,7 +28,7 @@ describe ProformaService::ConvertTaskToExercise do describe '#execute' do subject(:convert_to_exercise_service) { described_class.call(task: task, user: user, exercise: exercise) } - before { FactoryBot.create(:dot_txt) } + before { create(:dot_txt) } let(:task) do Proforma::Task.new( @@ -48,7 +48,7 @@ describe ProformaService::ConvertTaskToExercise do tests: tests ) end - let(:user) { FactoryBot.create(:teacher) } + let(:user) { create(:teacher) } let(:files) { [] } let(:tests) { [] } let(:model_solutions) { [] } @@ -308,7 +308,7 @@ describe ProformaService::ConvertTaskToExercise do context 'when exercise is set' do let(:exercise) do - FactoryBot.create( + create( :files, title: 'exercise-title', description: 'exercise-description', diff --git a/spec/services/proforma_service/export_task_spec.rb b/spec/services/proforma_service/export_task_spec.rb index 1d010a2f..b433b16b 100644 --- a/spec/services/proforma_service/export_task_spec.rb +++ b/spec/services/proforma_service/export_task_spec.rb @@ -6,7 +6,7 @@ describe ProformaService::ExportTask do describe '.new' do subject(:export_task) { described_class.new(exercise: exercise) } - let(:exercise) { FactoryBot.build(:dummy) } + let(:exercise) { build(:dummy) } it 'assigns exercise' do expect(export_task.instance_variable_get(:@exercise)).to be exercise @@ -25,7 +25,7 @@ describe ProformaService::ExportTask do subject(:export_task) { described_class.call(exercise: exercise) } let(:task) { Proforma::Task.new } - let(:exercise) { FactoryBot.build(:dummy) } + let(:exercise) { build(:dummy) } let(:exporter) { instance_double('Proforma::Exporter', perform: 'zip') } before do diff --git a/spec/services/proforma_service/import_spec.rb b/spec/services/proforma_service/import_spec.rb index a38212b3..1f27d731 100644 --- a/spec/services/proforma_service/import_spec.rb +++ b/spec/services/proforma_service/import_spec.rb @@ -7,7 +7,7 @@ describe ProformaService::Import do subject(:import_service) { described_class.new(zip: zip, user: user) } let(:zip) { Tempfile.new('proforma_test_zip_file') } - let(:user) { FactoryBot.build(:teacher) } + let(:user) { build(:teacher) } it 'assigns zip' do expect(import_service.instance_variable_get(:@zip)).to be zip @@ -21,11 +21,11 @@ describe ProformaService::Import do describe '#execute' do subject(:import_service) { described_class.call(zip: zip_file, user: import_user) } - let(:user) { FactoryBot.create(:teacher) } + let(:user) { create(:teacher) } let(:import_user) { user } let(:zip_file) { Tempfile.new('proforma_test_zip_file', encoding: 'ascii-8bit') } let(:exercise) do - FactoryBot.create(:dummy, + create(:dummy, instructions: 'instruction', execution_environment: execution_environment, files: files + tests, @@ -34,7 +34,7 @@ describe ProformaService::Import do end let(:uuid) { nil } - let(:execution_environment) { FactoryBot.build(:java) } + let(:execution_environment) { build(:java) } let(:files) { [] } let(:tests) { [] } let(:exporter) { ProformaService::ExportTask.call(exercise: exercise.reload).string } @@ -78,12 +78,12 @@ describe ProformaService::Import do context 'when exercise has a mainfile' do let(:files) { [file] } - let(:file) { FactoryBot.build(:file) } + let(:file) { build(:file) } it { is_expected.to be_an_equal_exercise_as exercise } context 'when the mainfile is very large' do - let(:file) { FactoryBot.build(:file, content: 'test' * (10**5)) } + let(:file) { build(:file, content: 'test' * (10**5)) } it { is_expected.to be_an_equal_exercise_as exercise } end @@ -91,12 +91,12 @@ describe ProformaService::Import do context 'when exercise has a regular file' do let(:files) { [file] } - let(:file) { FactoryBot.build(:file, role: 'regular_file') } + let(:file) { build(:file, role: 'regular_file') } it { is_expected.to be_an_equal_exercise_as exercise } context 'when file has an attachment' do - let(:file) { FactoryBot.build(:file, :image, role: 'regular_file') } + let(:file) { build(:file, :image, role: 'regular_file') } it { is_expected.to be_an_equal_exercise_as exercise } end @@ -104,26 +104,26 @@ describe ProformaService::Import do context 'when exercise has a file with role reference implementation' do let(:files) { [file] } - let(:file) { FactoryBot.build(:file, role: 'reference_implementation', read_only: true) } + let(:file) { build(:file, role: 'reference_implementation', read_only: true) } it { is_expected.to be_an_equal_exercise_as exercise } end context 'when exercise has multiple files with role reference implementation' do - let(:files) { FactoryBot.build_list(:file, 2, role: 'reference_implementation', read_only: true) } + let(:files) { build_list(:file, 2, role: 'reference_implementation', read_only: true) } it { is_expected.to be_an_equal_exercise_as exercise } end context 'when exercise has a test' do let(:tests) { [test] } - let(:test) { FactoryBot.build(:test_file) } + let(:test) { build(:test_file) } it { is_expected.to be_an_equal_exercise_as exercise } end context 'when exercise has multiple tests' do - let(:tests) { FactoryBot.build_list(:test_file, 2) } + let(:tests) { build_list(:test_file, 2) } it { is_expected.to be_an_equal_exercise_as exercise } end @@ -153,7 +153,7 @@ describe ProformaService::Import do end context 'when another user imports the exercise' do - let(:import_user) { FactoryBot.create(:teacher) } + let(:import_user) { create(:teacher) } it 'raises a proforma error' do expect { imported_exercise.save! }.to raise_error Proforma::ExerciseNotOwned diff --git a/spec/support/factory_bot.rb b/spec/support/factory_bot.rb index 891db349..f7642003 100644 --- a/spec/support/factory_bot.rb +++ b/spec/support/factory_bot.rb @@ -4,3 +4,7 @@ require 'factory_bot' # Use "old" FactoryBot default to allow auto-creating associations for #build FactoryBot.use_parent_strategy = false + +RSpec.configure do |config| + config.include FactoryBot::Syntax::Methods +end diff --git a/spec/uploaders/file_uploader_spec.rb b/spec/uploaders/file_uploader_spec.rb index 4638bfff..3bca7f14 100644 --- a/spec/uploaders/file_uploader_spec.rb +++ b/spec/uploaders/file_uploader_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe FileUploader do let(:file_path) { Rails.root.join('db/seeds/fibonacci/exercise.rb') } - let(:uploader) { described_class.new(FactoryBot.create(:file)) } + let(:uploader) { described_class.new(create(:file)) } before { uploader.store!(File.open(file_path, 'r')) } diff --git a/spec/views/execution_environments/shell.html.slim_spec.rb b/spec/views/execution_environments/shell.html.slim_spec.rb index 30cec4ef..43afee27 100644 --- a/spec/views/execution_environments/shell.html.slim_spec.rb +++ b/spec/views/execution_environments/shell.html.slim_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe 'execution_environments/shell.html.slim' do - let(:execution_environment) { FactoryBot.create(:ruby) } + let(:execution_environment) { create(:ruby) } before do assign(:execution_environment, execution_environment) diff --git a/spec/views/exercises/implement.html.slim_spec.rb b/spec/views/exercises/implement.html.slim_spec.rb index 66d7a035..74d4da3d 100644 --- a/spec/views/exercises/implement.html.slim_spec.rb +++ b/spec/views/exercises/implement.html.slim_spec.rb @@ -3,12 +3,12 @@ require 'rails_helper' describe 'exercises/implement.html.slim' do - let(:exercise) { FactoryBot.create(:fibonacci) } + let(:exercise) { create(:fibonacci) } let(:files) { exercise.files.visible } let(:non_binary_files) { files.reject {|file| file.file_type.binary? } } before do - assign(:current_user, FactoryBot.create(:admin)) + assign(:current_user, create(:admin)) assign(:exercise, exercise) assign(:files, files) assign(:paths, []) diff --git a/yarn.lock b/yarn.lock index 567018f8..9349c050 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,32 +2,32 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/highlight" "^7.16.0" + "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa" - integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== "@babel/core@^7.15.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -35,64 +35,65 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== +"@babel/generator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb" + integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" - integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" - integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz#01d615762e796c17952c29e3ede9d6de07d235a8" - integrity sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" - integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" + integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" - integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10" - integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ== +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -103,101 +104,109 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" - integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: - "@babel/types" "^7.16.0" + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== dependencies: - "@babel/types" "^7.16.0" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz#d5aa3b086e13a5fe05238ff40c3a5a0c2dab3ead" - integrity sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew== +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-wrap-function" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-simple-access@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" - integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== +"@babel/helper-remap-async-to-generator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz#5ce2416990d55eb6e099128338848ae8ffa58a9a" + integrity sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg== dependencies: - "@babel/types" "^7.16.0" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" @@ -206,199 +215,199 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.16.7" -"@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helper-wrap-function@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" - integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== +"@babel/helper-wrap-function@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz#8ddf9eaa770ed43de4bc3687f3f3b0d6d5ecf014" + integrity sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw== dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helpers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.0.tgz#875519c979c232f41adfbd43a3b0398c2e388183" - integrity sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ== +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== +"@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== dependencies: - "@babel/helper-validator-identifier" "^7.15.7" + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.0": - version "7.16.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac" - integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw== +"@babel/parser@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" + integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0": - version "7.16.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" - integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" - integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" -"@babel/plugin-proposal-async-generator-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz#11425d47a60364352f668ad5fbc1d6596b2c5caf" - integrity sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw== +"@babel/plugin-proposal-async-generator-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz#739adc1212a9e4892de440cd7dfffb06172df78d" + integrity sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" - integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== +"@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-static-block@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" - integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" - integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" - integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" - integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" - integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" - integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" - integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" - integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== +"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.7" -"@babel/plugin-proposal-optional-catch-binding@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" - integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" - integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" - integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== +"@babel/plugin-proposal-private-methods@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0" + integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-private-property-in-object@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" - integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" - integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -498,292 +507,294 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" - integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-async-to-generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" - integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== +"@babel/plugin-transform-async-to-generator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz#646e1262ac341b587ff5449844d4492dbb10ac4b" + integrity sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg== dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.0" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.7" -"@babel/plugin-transform-block-scoped-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" - integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" - integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-classes@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" - integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" - integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" - integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== +"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" - integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-duplicate-keys@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" - integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-exponentiation-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" - integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-for-of@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" - integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" - integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" - integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-member-expression-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" - integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" - integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" - integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== +"@babel/plugin-transform-modules-commonjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz#fd119e6a433c527d368425b45df361e1e95d3c1a" + integrity sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w== dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" - integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.15.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" - integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" - integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz#749d90d94e73cf62c60a0cc8d6b94d29305a81f2" + integrity sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" -"@babel/plugin-transform-new-target@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" - integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-object-super@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" - integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-transform-parameters@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz#1b50765fc421c229819dc4c7cdb8911660b3c2d7" - integrity sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ== +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-property-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" - integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.14.5", "@babel/plugin-transform-regenerator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" - integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== +"@babel/plugin-transform-regenerator@^7.14.5", "@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" - integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.15.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz#3fe0da36c2f0834bef7c4d3e7f2b2db0ee0c8909" - integrity sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.7.tgz#1da184cb83a2287a01956c10c60e66dd503c18aa" + integrity sha512-2FoHiSAWkdq4L06uaDN3rS43i6x28desUVxq+zAFuE6kbWYQeiLPJI5IC7Sg9xKYVcrBKSQkVUfH6aeQYbl9QA== dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.3" - babel-plugin-polyfill-corejs3 "^0.3.0" - babel-plugin-polyfill-regenerator "^0.2.3" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" - integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" - integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" -"@babel/plugin-transform-sticky-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" - integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-template-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" - integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-typeof-symbol@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" - integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-escapes@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" - integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" - integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/preset-env@^7.15.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.0.tgz#97228393d217560d6a1c6c56f0adb9d12bca67f5" - integrity sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.7.tgz#c491088856d0b3177822a2bf06cb74d76327aa56" + integrity sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ== dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-async-generator-functions" "^7.16.0" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-class-static-block" "^7.16.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.0" - "@babel/plugin-proposal-export-namespace-from" "^7.16.0" - "@babel/plugin-proposal-json-strings" "^7.16.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-object-rest-spread" "^7.16.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-proposal-private-property-in-object" "^7.16.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.7" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.7" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -798,44 +809,44 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.0" - "@babel/plugin-transform-async-to-generator" "^7.16.0" - "@babel/plugin-transform-block-scoped-functions" "^7.16.0" - "@babel/plugin-transform-block-scoping" "^7.16.0" - "@babel/plugin-transform-classes" "^7.16.0" - "@babel/plugin-transform-computed-properties" "^7.16.0" - "@babel/plugin-transform-destructuring" "^7.16.0" - "@babel/plugin-transform-dotall-regex" "^7.16.0" - "@babel/plugin-transform-duplicate-keys" "^7.16.0" - "@babel/plugin-transform-exponentiation-operator" "^7.16.0" - "@babel/plugin-transform-for-of" "^7.16.0" - "@babel/plugin-transform-function-name" "^7.16.0" - "@babel/plugin-transform-literals" "^7.16.0" - "@babel/plugin-transform-member-expression-literals" "^7.16.0" - "@babel/plugin-transform-modules-amd" "^7.16.0" - "@babel/plugin-transform-modules-commonjs" "^7.16.0" - "@babel/plugin-transform-modules-systemjs" "^7.16.0" - "@babel/plugin-transform-modules-umd" "^7.16.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" - "@babel/plugin-transform-new-target" "^7.16.0" - "@babel/plugin-transform-object-super" "^7.16.0" - "@babel/plugin-transform-parameters" "^7.16.0" - "@babel/plugin-transform-property-literals" "^7.16.0" - "@babel/plugin-transform-regenerator" "^7.16.0" - "@babel/plugin-transform-reserved-words" "^7.16.0" - "@babel/plugin-transform-shorthand-properties" "^7.16.0" - "@babel/plugin-transform-spread" "^7.16.0" - "@babel/plugin-transform-sticky-regex" "^7.16.0" - "@babel/plugin-transform-template-literals" "^7.16.0" - "@babel/plugin-transform-typeof-symbol" "^7.16.0" - "@babel/plugin-transform-unicode-escapes" "^7.16.0" - "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.7" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.7" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.7" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.0" - babel-plugin-polyfill-corejs2 "^0.2.3" - babel-plugin-polyfill-corejs3 "^0.3.0" - babel-plugin-polyfill-regenerator "^0.2.3" - core-js-compat "^3.19.0" + "@babel/types" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -850,42 +861,43 @@ esutils "^2.0.2" "@babel/runtime@^7.15.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b" - integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b" - integrity sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76" + integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ== dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.16.0", "@babel/types@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159" + integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg== dependencies: - "@babel/helper-validator-identifier" "^7.15.7" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@csstools/convert-colors@^1.4.0": @@ -904,9 +916,9 @@ integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== "@npmcli/fs@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" - integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.0.tgz#bec1d1b89c170d40e1b73ad6c943b0b75e7d2951" + integrity sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA== dependencies: "@gar/promisify" "^1.0.1" semver "^7.3.5" @@ -964,55 +976,55 @@ webpack-sources "^1.4.3" "@sentry/browser@^6.11.0": - version "6.14.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.14.1.tgz#4d255caf9de6e07f12b6d9b350fe391439dd932e" - integrity sha512-xOrKt6jT6rGhJDVwUtHtD/lLrCOEDNYCtLAh8SoJH7jE0JRSI7WK0UDPQ56M8z3II11lEw3F0TOXoK1rZ9BdrQ== + version "6.16.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.16.1.tgz#4270ab0fbd1de425e339b3e7a364feb09f470a87" + integrity sha512-F2I5RL7RTLQF9CccMrqt73GRdK3FdqaChED3RulGQX5lH6U3exHGFxwyZxSrY4x6FedfBFYlfXWWCJXpLnFkow== dependencies: - "@sentry/core" "6.14.1" - "@sentry/types" "6.14.1" - "@sentry/utils" "6.14.1" + "@sentry/core" "6.16.1" + "@sentry/types" "6.16.1" + "@sentry/utils" "6.16.1" tslib "^1.9.3" -"@sentry/core@6.14.1": - version "6.14.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.14.1.tgz#cbb6eae808279ae2147dd5da22ce6ab5a1cd69d1" - integrity sha512-x2MOax+adphal0ytBsvQukwN5mcxZzb5zsPZ1YWzewQk3BY+2T/DFo50iVpaWdUXsJL2FtoZVVgtpTmf+/3JPw== +"@sentry/core@6.16.1": + version "6.16.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.16.1.tgz#d9f7a75f641acaddf21b6aafa7a32e142f68f17c" + integrity sha512-UFI0264CPUc5cR1zJH+S2UPOANpm6dLJOnsvnIGTjsrwzR0h8Hdl6rC2R/GPq+WNbnipo9hkiIwDlqbqvIU5vw== dependencies: - "@sentry/hub" "6.14.1" - "@sentry/minimal" "6.14.1" - "@sentry/types" "6.14.1" - "@sentry/utils" "6.14.1" + "@sentry/hub" "6.16.1" + "@sentry/minimal" "6.16.1" + "@sentry/types" "6.16.1" + "@sentry/utils" "6.16.1" tslib "^1.9.3" -"@sentry/hub@6.14.1": - version "6.14.1" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.14.1.tgz#6a82cae35de834bd92bbcd3912a1e3029a5369de" - integrity sha512-IqANj5qKG1N+nqBsuYIwAZsXDMmO/Sc4H2zZ2MP7QvRyp0ptpJmu1oTE0r0fohIcGgIWbnIphJjw990Lp507eA== +"@sentry/hub@6.16.1": + version "6.16.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.16.1.tgz#526e19db51f4412da8634734044c605b936a7b80" + integrity sha512-4PGtg6AfpqMkreTpL7ymDeQ/U1uXv03bKUuFdtsSTn/FRf9TLS4JB0KuTZCxfp1IRgAA+iFg6B784dDkT8R9eg== dependencies: - "@sentry/types" "6.14.1" - "@sentry/utils" "6.14.1" + "@sentry/types" "6.16.1" + "@sentry/utils" "6.16.1" tslib "^1.9.3" -"@sentry/minimal@6.14.1": - version "6.14.1" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.14.1.tgz#6fbce5b873fb096411dbb9a01ff6706ed684f2e8" - integrity sha512-rxS0YUggCSuA7EzS1ai5jU8XArk4FBHZ02gmSoSSLtwFXmeQIa9XBKY0OEFmG2LMQYNOpvcGsezDO51EB6/X9w== +"@sentry/minimal@6.16.1": + version "6.16.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.16.1.tgz#6a9506a92623d2ff1fc17d60989688323326772e" + integrity sha512-dq+mI1EQIvUM+zJtGCVgH3/B3Sbx4hKlGf2Usovm9KoqWYA+QpfVBholYDe/H2RXgO7LFEefDLvOdHDkqeJoyA== dependencies: - "@sentry/hub" "6.14.1" - "@sentry/types" "6.14.1" + "@sentry/hub" "6.16.1" + "@sentry/types" "6.16.1" tslib "^1.9.3" -"@sentry/types@6.14.1": - version "6.14.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.14.1.tgz#0d562a7aa91253b7843723344b4ba03a010e6376" - integrity sha512-RIk3ZwQKZnASrYWfV5i4wbzVveHz8xLFAS2ySIMqh+hICKnB0N4/r8a1Of/84j7pj+iAbf5vPS85639eIf+9qg== +"@sentry/types@6.16.1": + version "6.16.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.16.1.tgz#4917607115b30315757c2cf84f80bac5100b8ac0" + integrity sha512-Wh354g30UsJ5kYJbercektGX4ZMc9MHU++1NjeN2bTMnbofEcpUDWIiKeulZEY65IC1iU+1zRQQgtYO+/hgCUQ== -"@sentry/utils@6.14.1": - version "6.14.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.14.1.tgz#cb746858665314c07cfe9b0f307b410e377032ad" - integrity sha512-GVvf0z18L4DN0a6vIBdHSlrK/Dj8QFhuiiJ8NtccSoY8xiKXQNz9FKN5d52NUNqm59aopAxcVAcs57yQSdxrZQ== +"@sentry/utils@6.16.1": + version "6.16.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.16.1.tgz#1b9e14c2831b6e8b816f7021b9876133bf2be008" + integrity sha512-7ngq/i4R8JZitJo9Sl8PDnjSbDehOxgr1vsoMmerIsyRZ651C/8B+jVkMhaAPgSdyJ0AlE3O7DKKTP1FXFw9qw== dependencies: - "@sentry/types" "6.14.1" + "@sentry/types" "6.16.1" tslib "^1.9.3" "@types/glob@^7.1.1": @@ -1034,9 +1046,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "16.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" - integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== + version "17.0.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.7.tgz#4a53d8332bb65a45470a2f9e2611f1ced637a5cb" + integrity sha512-1QUk+WAUD4t8iR+Oj+UgI8oJa6yyxaB8a8pHaC8uqM6RrS1qbL7bf3Pwl5rHv0psm2CuDErgho6v5N+G+5fwtQ== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1254,10 +1266,10 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= +ansi-html-community@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" @@ -1430,29 +1442,29 @@ babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" -babel-plugin-polyfill-corejs2@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f" - integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA== +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.4" + "@babel/helper-define-polyfill-provider" "^0.3.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz#fa7ca3d1ee9ddc6193600ffb632c9785d54918af" - integrity sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg== +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.4" + "@babel/helper-define-polyfill-provider" "^0.3.0" core-js-compat "^3.18.0" -babel-plugin-polyfill-regenerator@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d" - integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g== +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.4" + "@babel/helper-define-polyfill-provider" "^0.3.0" balanced-match@^1.0.0: version "1.0.2" @@ -1519,21 +1531,21 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: - bytes "3.1.0" + bytes "3.1.1" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" - http-errors "1.7.2" + http-errors "1.8.1" iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" bonjour@^3.5.0: version "3.5.0" @@ -1659,13 +1671,13 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.6, browserslist@^4.6.4: - version "4.17.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" - integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.4: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: - caniuse-lite "^1.0.30001274" - electron-to-chromium "^1.3.886" + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" escalade "^3.1.1" node-releases "^2.0.1" picocolors "^1.0.0" @@ -1704,10 +1716,10 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== cacache@^12.0.2: version "12.0.4" @@ -1816,10 +1828,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001274: - version "1.0.30001278" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz#51cafc858df77d966b17f59b5839250b24417fff" - integrity sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001286: + version "1.0.30001295" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001295.tgz#68a60f8f0664f342b2835c5d8898b4faea7b3d51" + integrity sha512-lSP16vcyC0FEy0R4ECc9duSPoKoZy+YkpGkue9G4D81OfPnliopaZrU10+qtPdT8PbGXad/PNx43TIQrOmJZSQ== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -1965,9 +1977,9 @@ color-name@^1.0.0: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" - integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -2061,12 +2073,12 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" @@ -2085,10 +2097,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== copy-concurrently@^1.0.0: version "1.0.5" @@ -2107,18 +2119,18 @@ 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.18.0, core-js-compat@^3.19.0: - version "3.19.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476" - integrity sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g== +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.20.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b" + integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg== dependencies: - browserslist "^4.17.6" + browserslist "^4.19.1" semver "7.0.0" core-js@^3.16.2: - version "3.19.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641" - integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg== + version "3.20.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" + integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== core-util-is@~1.0.0: version "1.0.3" @@ -2488,9 +2500,9 @@ d3-force@3: d3-timer "1 - 3" "d3-format@1 - 3", d3-format@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.0.1.tgz#e41b81b2ab79277141ec1404aa5d05001da64084" - integrity sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== d3-geo@3: version "3.0.1" @@ -2500,9 +2512,9 @@ d3-geo@3: d3-array "2.5.0 - 3" d3-hierarchy@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz#0365342d54972e38ca05e9143e0ab1c60846b3b5" - integrity sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz#9cbb0ffd2375137a351e6cfeed344a06d4ff4597" + integrity sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA== "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: version "3.0.1" @@ -2568,9 +2580,9 @@ d3-shape@3: d3-path "1 - 3" "d3-time-format@2 - 4", d3-time-format@4: - version "4.0.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.0.0.tgz#930ded86a9de761702344760d8a25753467f28b7" - integrity sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A== + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: d3-time "1 - 3" @@ -2616,10 +2628,10 @@ d3-zoom@3: d3-selection "2 - 3" d3-transition "2 - 3" -d3@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.1.1.tgz#77b9a0c9893b13643b8e52316ec65dca3a6a115e" - integrity sha512-8zkLMwSvUAnfN9pcJDfkuxU0Nvg4RLUD0A4BZN1KxJPtlnCGzMx3xM5cRl4m8fym/Vy8rlq52tl90UF3m91OnA== +d3@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.3.0.tgz#f3d5a22c1f658952a6491cf50132f5267ed7a40a" + integrity sha512-MDRLJCMK232OJQRqGljQ/gCxtB8k3/sLKFjftMjzPB3nKVUODpdW9Rb3vcq7U8Ka5YKoZkAmp++Ur6I+6iNWIw== dependencies: d3-array "3" d3-axis "3" @@ -2667,9 +2679,9 @@ debug@^3.1.1, debug@^3.2.6: ms "^2.1.1" debug@^4.1.0, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" @@ -2862,10 +2874,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.886: - version "1.3.890" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.890.tgz#e7143b659f73dc4d0512d1ae4baeb0fb9e7bc835" - integrity sha512-VWlVXSkv0cA/OOehrEyqjUTHwV8YXCPTfPvbtoeU2aHR21vI4Ejh5aC4AxUwOmbLbBgb6Gd3URZahoCxtBqCYQ== +electron-to-chromium@^1.4.17: + version "1.4.31" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz#8d5ccc3f8253cd142b07afaa84f200fd33a7f2a6" + integrity sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ== elliptic@^6.5.3: version "6.5.4" @@ -3084,16 +3096,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + version "4.17.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: accepts "~1.3.7" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.19.1" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.4.1" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.2" @@ -3107,13 +3119,13 @@ express@^4.17.1: on-finished "~2.3.0" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.9.6" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" statuses "~1.5.0" type-is "~1.6.18" utils-merge "1.0.1" @@ -3257,9 +3269,9 @@ findup-sync@^3.0.0: resolve-dir "^1.0.1" flatted@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== flatten@^1.0.2: version "1.0.3" @@ -3275,9 +3287,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.14.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" - integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + version "1.14.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd" + integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== for-in@^1.0.2: version "1.0.2" @@ -3569,10 +3581,10 @@ hex-color-regex@^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== -highlight.js@^11.3.1: - version "11.3.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.3.1.tgz#813078ef3aa519c61700f84fe9047231c5dc3291" - integrity sha512-PUhCRnPjLtiLHZAQ5A/Dt5F8cWZeMyj9KRsACsWT+OD6OP0x6dp5OmT5jdx0JgEyPxPZZIPQpRN2TciUT7occw== +highlight.js@^11.4.0: + version "11.4.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.4.0.tgz#34ceadd49e1596ee5aba3d99346cdfd4845ee05a" + integrity sha512-nawlpCBCSASs7EdvZOYOYVkJpGmAOKMYZgZtUqSRqodZE0GRVcFKwo1RcpeOemqh9hyttTdd5wDBwHkuSyUfnA== hmac-drbg@^1.0.1: version "1.0.1" @@ -3620,16 +3632,16 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" + inherits "2.0.4" + setprototypeof "1.2.0" statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" @@ -3641,21 +3653,10 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-parser-js@>=0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" - integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== http-proxy-middleware@0.19.1: version "0.19.1" @@ -3712,6 +3713,11 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -4021,9 +4027,9 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: is-extglob "^2.1.1" is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.6" @@ -4118,11 +4124,11 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: has-symbols "^1.0.2" is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" @@ -4294,9 +4300,9 @@ last-call-webpack-plugin@^3.0.0: webpack-sources "^1.1.0" lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loader-runner@^2.4.0: version "2.4.0" @@ -4372,9 +4378,9 @@ lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.5: integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loglevel@^1.6.8: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== lru-cache@^5.1.1: version "5.1.1" @@ -4499,17 +4505,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": - version "1.50.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" - integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.33" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" - integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.50.0" + mime-db "1.51.0" mime@1.6.0: version "1.6.0" @@ -4575,9 +4581,9 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" - integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== + version "3.1.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" @@ -4647,17 +4653,12 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 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== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4817,9 +4818,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-is@^1.0.1: version "1.1.5" @@ -5131,9 +5132,9 @@ picocolors@^1.0.0: integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.0.0, pify@^2.3.0: version "2.3.0" @@ -5785,9 +5786,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + version "6.0.8" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" + integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5816,9 +5817,9 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" @@ -5864,7 +5865,7 @@ propagating-hammerjs@^1.4.6: dependencies: hammerjs "^2.0.8" -proxy-addr@~2.0.5: +proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== @@ -5934,10 +5935,10 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== query-string@^4.1.0: version "4.3.4" @@ -5990,13 +5991,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.1" + http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" @@ -6241,7 +6242,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.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, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.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, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6270,11 +6271,13 @@ sass-loader@10.1.1: semver "^7.3.2" sass@^1.38.0: - version "1.43.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.43.4.tgz#68c7d6a1b004bef49af0d9caf750e9b252105d1f" - integrity sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg== + version "1.45.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.45.2.tgz#130b428c1692201cfa181139835d6fc378a33323" + integrity sha512-cKfs+F9AMPAFlbbTXNsbGvg3y58nV0mXA3E94jqaySKcC8Kq3/8983zVKQ0TLMUrHw7hF9Tnd3Bz9z5Xgtrl9g== dependencies: chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" sax@~1.2.4: version "1.2.4" @@ -6342,10 +6345,10 @@ semver@^7.3.2, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" depd "~1.1.2" @@ -6354,9 +6357,9 @@ send@0.17.1: escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "1.8.1" mime "1.6.0" - ms "2.1.1" + ms "2.1.3" on-finished "~2.3.0" range-parser "~1.2.1" statuses "~1.5.0" @@ -6388,15 +6391,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.17.2" set-blocking@^2.0.0: version "2.0.0" @@ -6423,10 +6426,10 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" @@ -6465,9 +6468,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== simple-swizzle@^0.2.2: version "0.2.2" @@ -6519,12 +6522,12 @@ sockjs-client@^1.5.0: url-parse "^1.5.3" sockjs@^0.3.21: - version "0.3.21" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" - integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" - uuid "^3.4.0" + uuid "^8.3.2" websocket-driver "^0.7.4" sort-keys@^1.0.0: @@ -6544,6 +6547,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +"source-map-js@>=0.6.2 <2.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -6556,9 +6564,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@~0.5.12, source-map-support@~0.5.20: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6859,9 +6867,9 @@ terser@^4.1.2: source-map-support "~0.5.12" terser@^5.3.4: - version "5.9.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" - integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -6934,10 +6942,10 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== ts-pnp@^1.1.6: version "1.2.0" @@ -6954,7 +6962,7 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -6977,10 +6985,10 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -underscore@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== +underscore@^1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881" + integrity sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -7075,9 +7083,9 @@ urix@^0.1.0: integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-parse@^1.4.3, url-parse@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== + version "1.5.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" + integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -7129,11 +7137,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -7232,11 +7245,11 @@ webpack-dev-middleware@^3.7.2: webpack-log "^2.0.0" webpack-dev-server@^3.11.2: - version "3.11.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" - integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== + version "3.11.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3" + integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA== dependencies: - ansi-html "0.0.7" + ansi-html-community "0.0.8" bonjour "^3.5.0" chokidar "^2.1.8" compression "^1.7.4"