diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2cb709952..695276f757 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,9 +39,6 @@ jobs: with: node-version: 16.x cache: yarn - - name: Install JS dependencies - run: | - yarn install - name: Run tests env: CI: true @@ -51,8 +48,6 @@ jobs: git config --global user.name "Dodona" sudo sysctl fs.inotify.max_user_watches=524288 sudo sysctl -p - bin/rake css:build - yarn build:js bundle exec rails test - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 @@ -114,9 +109,6 @@ jobs: cache: yarn - name: Setup chromium-chromedriver uses: nanasess/setup-chromedriver@master - - name: Install JS dependencies - run: | - yarn install - name: Show installed chrome version run: | google-chrome --version diff --git a/Gemfile b/Gemfile index 21d4a8ddad..b954d901dd 100644 --- a/Gemfile +++ b/Gemfile @@ -124,7 +124,7 @@ gem 'rubyzip', '~> 2.3.2' gem 'dalli', '~> 3.2.6' # Generate 'random' values like usernames, emails, ... -gem 'faker', '~> 3.2.1' +gem 'faker', '~> 3.2.2' # Profiling gem 'flamegraph', '~> 0.9.5' @@ -132,7 +132,7 @@ gem 'memory_profiler', '~> 1.0.1' gem 'rack-mini-profiler', '~> 3.1.1' gem 'stackprof', '~> 0.2.25' -gem 'ddtrace', '~> 1.15.0' +gem 'ddtrace', '~> 1.16.0' # Make sure filesystem changes only happen at the end of a transaction gem 'after_commit_everywhere', '~> 1.3.1' @@ -154,7 +154,7 @@ group :development, :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '~> 3.39.2' - gem 'selenium-webdriver', '~> 4.14.0' + gem 'selenium-webdriver', '~> 4.15.0' end group :test do @@ -193,4 +193,4 @@ gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] gem 'docker-api', '~> 2.2.0' # Used for syncing deadlines with an external calendar -gem 'icalendar', '~> 2.9' +gem 'icalendar', '~> 2.10' diff --git a/Gemfile.lock b/Gemfile.lock index b56ff94bca..965a04ba2f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -142,11 +142,11 @@ GEM railties (>= 6.0.0) daemons (1.4.1) dalli (3.2.6) - datadog-ci (0.2.0) + datadog-ci (0.3.0) msgpack date (3.3.3) - ddtrace (1.15.0) - datadog-ci (~> 0.2.0) + ddtrace (1.16.0) + datadog-ci (~> 0.3.0) debase-ruby_core_source (= 3.2.2) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -187,7 +187,7 @@ GEM factory_bot_rails (6.2.0) factory_bot (~> 6.2.0) railties (>= 5.0.0) - faker (3.2.1) + faker (3.2.2) i18n (>= 1.8.11, < 2) faraday (2.7.4) faraday-net_http (>= 2.0, < 3.1) @@ -217,7 +217,7 @@ GEM i18n-js (4.2.3) glob (>= 0.4.0) i18n - icalendar (2.9.0) + icalendar (2.10.0) ice_cube (~> 0.16) ice_cube (0.16.4) image_processing (1.12.2) @@ -467,7 +467,7 @@ GEM ffi (~> 1.12) ruby2_keywords (0.0.5) rubyzip (2.3.2) - selenium-webdriver (4.14.0) + selenium-webdriver (4.15.0) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) @@ -572,7 +572,7 @@ DEPENDENCIES counter_culture (~> 3.5) cssbundling-rails (~> 1.3.3) dalli (~> 3.2.6) - ddtrace (~> 1.15.0) + ddtrace (~> 1.16.0) delayed_job_active_record (~> 4.1.8) delayed_job_web (~> 1.4.4) devise (~> 4.9.3) @@ -581,13 +581,13 @@ DEPENDENCIES ed25519 exception_notification (~> 4.5.0) factory_bot_rails (~> 6.2.0) - faker (~> 3.2.1) + faker (~> 3.2.2) flamegraph (~> 0.9.5) has_scope (~> 0.8.2) hcaptcha (~> 7.1.0) httparty (~> 0.21.0) i18n-js (~> 4.2.3) - icalendar (~> 2.9) + icalendar (~> 2.10) image_processing (~> 1.12.2) jbuilder (~> 2.11.5) jsbundling-rails (~> 1.2.1) @@ -625,7 +625,7 @@ DEPENDENCIES rubocop-rails (~> 2.22.1) ruby-saml (~> 1.16.0) rubyzip (~> 2.3.2) - selenium-webdriver (~> 4.14.0) + selenium-webdriver (~> 4.15.0) simplecov (~> 0.22.0) simplecov-cobertura (~> 2.1.0) slack-notifier (~> 2.4.0) diff --git a/app/assets/javascripts/editor.ts b/app/assets/javascripts/editor.ts index 9919d78e41..f416a59454 100644 --- a/app/assets/javascripts/editor.ts +++ b/app/assets/javascripts/editor.ts @@ -1,5 +1,5 @@ import { closeBrackets, closeBracketsKeymap, autocompletion } from "@codemirror/autocomplete"; -import { defaultKeymap, history, historyKeymap } from "@codemirror/commands"; +import { defaultKeymap, history, historyKeymap, indentWithTab } from "@codemirror/commands"; import { bracketMatching, foldGutter, @@ -132,6 +132,7 @@ const editorSetup = (() => [ ...defaultKeymap, ...historyKeymap, ...foldKeymap, + indentWithTab ]), syntaxHighlighting(rougeStyle, { fallback: true diff --git a/app/controllers/lti_controller.rb b/app/controllers/lti_controller.rb index e7b3fb9daf..32460f37b1 100644 --- a/app/controllers/lti_controller.rb +++ b/app/controllers/lti_controller.rb @@ -36,14 +36,19 @@ def do_redirect end def content_selection + return head :unauthorized unless current_user&.a_course_admin? + @supported = @lti_message.accept_types.include?(LTI::Messages::Types::DeepLinkingResponse::LtiResourceLink::TYPE) - @grouped_courses = policy_scope(Course.all).group_by(&:year) + @grouped_courses = current_user.administrating_courses.group_by(&:year) @multiple = @lti_message.accept_multiple end def series_and_activities # Eager load the activities @course = Course.includes(series: [:activities]).find_by(id: params[:id]) + + return head :unauthorized unless current_user&.admin_of?(@course) + @series = policy_scope(@course.series) @multiple = ActiveModel::Type::Boolean.new.cast(params[:multiple]) end diff --git a/app/javascript/packs/application_pack.js b/app/javascript/packs/application_pack.js index 06411ace4c..ea4a6abe87 100644 --- a/app/javascript/packs/application_pack.js +++ b/app/javascript/packs/application_pack.js @@ -37,10 +37,8 @@ import { userState } from "state/Users"; // Initialize clipboard.js initClipboard(); -// Don't show drawer if we don't want a drawer. -if (!window.dodona.hideDrawer) { - ready.then(() => new Drawer()); -} +// Init drawer +ready.then(() => new Drawer()); ready.then(initTooltips); diff --git a/app/jobs/remove_activities_job.rb b/app/jobs/remove_activities_job.rb new file mode 100644 index 0000000000..7026602af7 --- /dev/null +++ b/app/jobs/remove_activities_job.rb @@ -0,0 +1,46 @@ +class RemoveActivitiesJob < ApplicationJob + # permanently remove activities that match all of the following criteria: + # - status is 'removed' + # - updated_at is more than 1 month ago + # - not part of an evaluation + # - one of the following is true: + # - draft is true (never published) + # - series_memberships is empty and less then 25 submissions and latest submission is more than 1 month ago + # + # Destroy is called on each activity individually to ensure that callbacks are run + # This means the activity will be removed from any series, evaluations it is a member of + # and any submissions will be removed + queue_as :cleaning + + def perform + ContentPage.where(status: 'removed').where('updated_at < ?', 1.month.ago).find_each do |activity| + if activity.draft? || activity.series_memberships.empty? + # destroy series memberships first explicitly, as they are dependent: :restrict_with_error + activity.series_memberships.destroy_all + + activity.destroy + end + end + + Exercise.where(status: 'removed').where('updated_at < ?', 1.month.ago).find_each do |activity| + unless activity.draft? + next if activity.series_memberships.present? + next if activity.submissions.count >= 25 + next if activity.submissions.present? && activity.submissions.reorder(:created_at).last.created_at > 1.month.ago + end + + next if EvaluationExercise.exists?(exercise_id: activity.id) + + # destroy submissions first explicitly, as they are dependent: :restrict_with_error + activity.submissions.destroy_all + + # destroy series memberships first explicitly, as they are dependent: :restrict_with_error + activity.series_memberships.destroy_all + + activity.destroy + end + + # rerun this job in 1 month + RemoveActivitiesJob.set(wait: 1.month).perform_later + end +end diff --git a/app/models/activity.rb b/app/models/activity.rb index 97b92ec465..402404707b 100644 --- a/app/models/activity.rb +++ b/app/models/activity.rb @@ -500,7 +500,7 @@ def deep_merge_configs(parent_conf, child_conf) def lowercase_labels(hash) return unless hash - hash['labels'] = hash['labels'].map(&:downcase).uniq if hash.key? 'labels' + hash['labels'] = hash['labels'].map(&:to_s).map(&:downcase).uniq if hash.key? 'labels' hash end diff --git a/package.json b/package.json index 2fafc65a8b..b9df8c4761 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "babel-plugin-macros": "^3.1.0", "bootstrap": "5.3.2", "clipboard": "^2.0.11", - "core-js": "^3.33.1", + "core-js": "^3.33.2", "d3": "^7.8.5", "dayjs": "^1.11.10", "dragula": "^3.7.3", @@ -49,25 +49,25 @@ "webpack-cli": "^5.1.4", "@codemirror/autocomplete": "^6.10.2", "@codemirror/commands": "^6.3.0", - "@codemirror/view": "^6.21.4", + "@codemirror/view": "^6.22.0", "@codemirror/state": "^6.3.1", "@codemirror/language": "^6.9.2", "@codemirror/language-data": "^6.3.1", "@lezer/common": "^1.0.4", "@lezer/highlight": "^1.1.6", - "@lezer/lr": "^1.3.13", + "@lezer/lr": "^1.3.14", "codemirror-lang-r": "^0.1.0-2", "codemirror-lang-prolog": "^0.1.0", "@replit/codemirror-lang-csharp": "^6.2.0" }, "devDependencies": { - "@open-wc/testing-helpers": "^2.3.0", + "@open-wc/testing-helpers": "^2.3.2", "@testing-library/dom": "^9.3.3", "@testing-library/user-event": "^14.5.1", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "babel-plugin-istanbul": "^6.1.1", - "eslint": "^8.52.0", + "eslint": "^8.53.0", "eslint-config-google": "^0.14.0", "eslint-plugin-jest": "^27.6.0", "eslint-plugin-lit": "^1.10.1", @@ -78,7 +78,7 @@ "nyc": "^15.1.0", "stylelint": "^15.11.0", "stylelint-config-standard": "^34.0.0", - "stylelint-config-standard-scss": "^11.0.0", + "stylelint-config-standard-scss": "^11.1.0", "ts-jest": "^26.5.6", "webpack-bundle-analyzer": "^4.9.1" } diff --git a/test/controllers/lti_controller_test.rb b/test/controllers/lti_controller_test.rb index 9cda2d1bc3..057ea44152 100644 --- a/test/controllers/lti_controller_test.rb +++ b/test/controllers/lti_controller_test.rb @@ -18,10 +18,14 @@ def setup end test 'content selection shows courses' do + user = create :staff courses = create_list :course, 2 + user.administrating_courses << courses payload = lti_payload('nonce', 'target', 'LtiDeepLinkingRequest') id_token = encode_jwt(payload) + sign_in user + get content_selection_path, params: { id_token: id_token, provider_id: @provider.id @@ -33,6 +37,41 @@ def setup end end + test 'content selection should not show courses that are not administrated by the user' do + user = create :staff + courses = create_list :course, 2 + payload = lti_payload('nonce', 'target', 'LtiDeepLinkingRequest') + id_token = encode_jwt(payload) + + sign_in user + + get content_selection_path, params: { + id_token: id_token, + provider_id: @provider.id + } + + assert_response :ok + courses.each do |course| + assert_select 'option', { text: course.name, count: 0 } + end + end + + test 'content selection should return unauthorized if the user is not administrating any courses' do + user = create :student + create_list :course, 2 + payload = lti_payload('nonce', 'target', 'LtiDeepLinkingRequest') + id_token = encode_jwt(payload) + + sign_in user + + get content_selection_path, params: { + id_token: id_token, + provider_id: @provider.id + } + + assert_response :unauthorized + end + test 'content selection payload is correct' do series = create :series, exercise_count: 1 payload = lti_payload('nonce', 'target', 'LtiDeepLinkingRequest') diff --git a/test/jobs/remove_activities_job_test.rb b/test/jobs/remove_activities_job_test.rb new file mode 100644 index 0000000000..a64036e1f2 --- /dev/null +++ b/test/jobs/remove_activities_job_test.rb @@ -0,0 +1,114 @@ +require 'test_helper' + +class RemoveActivitiesJobTest < ActiveJob::TestCase + test 'should remove "removed" draft activities' do + c = create :content_page + create :activity_read_state, activity: c + c.update status: :removed, draft: true, updated_at: 2.months.ago + e = create :exercise + create :submission, exercise: e + e.update status: :removed, draft: true, updated_at: 2.months.ago + s = create :series + s.activities << c + s.activities << e + + assert_difference 'ContentPage.count', -1 do + assert_difference 'Exercise.count', -1 do + RemoveActivitiesJob.perform_now + end + end + end + + test 'should remove "removed" activities with no series memberships and no submissions' do + create :content_page, status: :removed, draft: false, updated_at: 2.months.ago + create :exercise, status: :removed, draft: false, updated_at: 2.months.ago + + assert_difference 'ContentPage.count', -1 do + assert_difference 'Exercise.count', -1 do + RemoveActivitiesJob.perform_now + end + end + end + + test 'should not remove "removed" activities with series memberships' do + c = create :content_page, status: :removed, draft: false, updated_at: 2.months.ago + e = create :exercise, status: :removed, draft: false, updated_at: 2.months.ago + s = create :series + s.activities << c + s.activities << e + + assert_no_difference 'ContentPage.count' do + assert_no_difference 'Exercise.count' do + RemoveActivitiesJob.perform_now + end + end + end + + test 'should not remove "removed" activities with more than 25 submissions' do + e = create :exercise, status: :removed, draft: false, updated_at: 2.months.ago + create_list :submission, 26, exercise: e + + assert_no_difference 'Exercise.count' do + RemoveActivitiesJob.perform_now + end + end + + test 'should remove "removed" activities with less than 25 submissions and last submission more than 1 month ago' do + e = create :exercise, status: :removed, draft: false, updated_at: 2.months.ago + create_list :submission, 21, exercise: e, created_at: 2.months.ago + + assert_difference 'Submission.count', -21 do + assert_difference 'Exercise.count', -1 do + RemoveActivitiesJob.perform_now + end + end + end + + test 'should not remove "removed" activities with less than 25 submissions and last submission less than 1 month ago' do + e = create :exercise, status: :removed, draft: false, updated_at: 2.months.ago + create_list :submission, 5, exercise: e, created_at: 2.months.ago + create_list :submission, 3, exercise: e, created_at: 2.weeks.ago + + assert_no_difference 'Submission.count' do + assert_no_difference 'Exercise.count' do + RemoveActivitiesJob.perform_now + end + end + end + + test 'should not removed non removed activities' do + create :exercise, updated_at: 2.months.ago + create :content_page, updated_at: 2.months.ago + create :exercise, draft: true, updated_at: 2.months.ago + create :content_page, draft: true, updated_at: 2.months.ago + + assert_no_difference 'Exercise.count' do + assert_no_difference 'ContentPage.count' do + RemoveActivitiesJob.perform_now + end + end + end + + test 'should not remove activities updated less than 1 month ago' do + create :exercise, status: :removed, draft: true, updated_at: 2.weeks.ago + + assert_no_difference 'Exercise.count' do + RemoveActivitiesJob.perform_now + end + end + + test 'should reschedule itself' do + assert_enqueued_with(job: RemoveActivitiesJob) do + RemoveActivitiesJob.perform_now + end + end + + test 'should not remove activities that are part of an evaluation' do + e = create :exercise, status: :removed, draft: false, updated_at: 2.months.ago + create :evaluation_exercise, exercise: e + + assert_no_difference 'Exercise.count' do + RemoveActivitiesJob.perform_now + end + end +end diff --git a/yarn.lock b/yarn.lock index 7fd2f5363d..a2bf2b898f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1300,10 +1300,10 @@ "@codemirror/view" "^6.0.0" "@lezer/highlight" "^1.0.0" -"@codemirror/view@^6.0.0", "@codemirror/view@^6.0.2", "@codemirror/view@^6.17.0", "@codemirror/view@^6.21.4": - version "6.21.4" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.21.4.tgz#6ec83ea238e16b2e1fc149ef9d1a36db2b1f3863" - integrity sha512-WKVZ7nvN0lwWPfAf05WxWqTpwjC8YN3q5goj3CsSig7//DD81LULgOx3nBegqpqP0iygBqRmW8z0KSc2QTAdAg== +"@codemirror/view@^6.0.0", "@codemirror/view@^6.0.2", "@codemirror/view@^6.17.0", "@codemirror/view@^6.22.0": + version "6.22.0" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.22.0.tgz#5a5214a04f149ecf54c4803b7fec9bdac56d0d74" + integrity sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA== dependencies: "@codemirror/state" "^6.1.4" style-mod "^4.1.0" @@ -1382,10 +1382,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1397,10 +1397,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.52.0": - version "8.52.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" - integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== +"@eslint/js@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" + integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== "@humanwhocodes/config-array@^0.11.13": version "0.11.13" @@ -1709,10 +1709,10 @@ "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.0.0" -"@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.3.1", "@lezer/lr@^1.3.13", "@lezer/lr@^1.3.3": - version "1.3.13" - resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.3.13.tgz#578e06c6c52e4dc38421368904585afa3eb82ec8" - integrity sha512-RLAbau/4uSzKgIKj96mI5WUtG1qtiR0Frn0Ei9zhPj8YOkHM+1Bb8SgdVvmR/aWJCFIzjo2KFnDiRZ75Xf5NdQ== +"@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.3.1", "@lezer/lr@^1.3.14", "@lezer/lr@^1.3.3": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.3.14.tgz#59d4a3b25698bdac0ef182fa6eadab445fc4f29a" + integrity sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug== dependencies: "@lezer/common" "^1.0.0" @@ -1764,22 +1764,17 @@ "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.0.0" -"@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz#64df34e2f12e68e78ac57e571d25ec07fa460ca9" - integrity sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ== - -"@lit-labs/ssr-dom-shim@^1.1.2-pre.0": +"@lit-labs/ssr-dom-shim@^1.1.2", "@lit-labs/ssr-dom-shim@^1.1.2-pre.0": version "1.1.2" resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz#d693d972974a354034454ec1317eb6afd0b00312" integrity sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g== -"@lit/reactive-element@^1.0.0", "@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.6.3.tgz#25b4eece2592132845d303e091bad9b04cdcfe03" - integrity sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ== +"@lit/reactive-element@^1.0.0 || ^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-2.0.1.tgz#b17d8818d9c72ccc489f44e35d87cfa18a9c8c93" + integrity sha512-eu50SQXHRthFwWJMp0oAFg95Rvm6MTPjxSXWuvAu7It90WVFLFpNBoIno7XOXSDvVgTrtKnUV4OLJqys2Svn4g== dependencies: - "@lit-labs/ssr-dom-shim" "^1.0.0" + "@lit-labs/ssr-dom-shim" "^1.1.2" "@lit/reactive-element@^2.0.0": version "2.0.0" @@ -1814,22 +1809,22 @@ resolved "https://registry.yarnpkg.com/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz#b3c58f8699b197bb5e923d624c720e67c9f324d6" integrity sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA== -"@open-wc/scoped-elements@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-2.2.0.tgz#4d65d7ba796c2bb76ef7934068532ca1795ea7b6" - integrity sha512-Qe+vWsuVHFzUkdChwlmJGuQf9cA3I+QOsSHULV/6qf6wsqLM2/32svNRH+rbBIMwiPEwzZprZlkvkqQRucYnVA== +"@open-wc/scoped-elements@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@open-wc/scoped-elements/-/scoped-elements-2.2.4.tgz#081559b62d885ac0ec043546f17f1f680294d500" + integrity sha512-12X4F4QGPWcvPbxAiJ4v8wQFCOu+laZHRGfTrkoj+3JzACCtuxHG49YbuqVzQ135QPKCuhP9wA0kpGGEfUegyg== dependencies: - "@lit/reactive-element" "^1.0.0" + "@lit/reactive-element" "^1.0.0 || ^2.0.0" "@open-wc/dedupe-mixin" "^1.4.0" -"@open-wc/testing-helpers@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@open-wc/testing-helpers/-/testing-helpers-2.3.0.tgz#6ee88baaf316a6217c43e7ba536cb187d15cb6f4" - integrity sha512-wkDipkia/OMWq5Z1KkAgvqNLfIOCiPGrrtfoCKuQje8u7F0Bz9Un44EwBtWcCdYtLc40quWP7XFpFsW8poIfUA== +"@open-wc/testing-helpers@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@open-wc/testing-helpers/-/testing-helpers-2.3.2.tgz#c2bfa82cedd833608effa2d2367fe9524ddf4434" + integrity sha512-uZMGC/C1m5EiwQsff6KMmCW25TYMQlJt4ilAWIjnelWGFg9HPUiLnlFvAas3ESUP+4OXLO8Oft7p4mHvbYvAEQ== dependencies: - "@open-wc/scoped-elements" "^2.2.0" - lit "^2.0.0" - lit-html "^2.0.0" + "@open-wc/scoped-elements" "^2.2.4" + lit "^2.0.0 || ^3.0.0" + lit-html "^2.0.0 || ^3.0.0" "@polka/url@^1.0.0-next.20": version "1.0.0-next.23" @@ -3368,10 +3363,10 @@ core-js-compat@^3.31.0, core-js-compat@^3.32.2: dependencies: browserslist "^4.22.1" -core-js@^3.33.1: - version "3.33.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.1.tgz#ef3766cfa382482d0a2c2bc5cb52c6d88805da52" - integrity sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q== +core-js@^3.33.2: + version "3.33.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.2.tgz#312bbf6996a3a517c04c99b9909cdd27138d1ceb" + integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ== cosmiconfig@^7.0.0: version "7.1.0" @@ -4144,15 +4139,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.52.0: - version "8.52.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" - integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== +eslint@^8.53.0: + version "8.53.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" + integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.52.0" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.53.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5977,6 +5972,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +known-css-properties@^0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.28.0.tgz#8a8be010f368b3036fe6ab0ef4bbbed972bd6274" + integrity sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ== + known-css-properties@^0.29.0: version "0.29.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" @@ -6008,15 +6008,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lit-element@^3.3.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209" - integrity sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.1.0" - "@lit/reactive-element" "^1.3.0" - lit-html "^2.8.0" - lit-element@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.0.0.tgz#8343891bc9159a5fcb7f534914b37f2c0161e036" @@ -6026,33 +6017,17 @@ lit-element@^4.0.0: "@lit/reactive-element" "^2.0.0" lit-html "^3.0.0" -lit-html@^2.0.0, lit-html@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" - integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== - dependencies: - "@types/trusted-types" "^2.0.2" - -lit-html@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.0.0.tgz#77d6776ee488642c74c5575315ef81aa09d24ea9" - integrity sha512-DNJIE8dNY0dQF2Gs0sdMNUppMQT2/CvV4OVnSdg7BXAsGqkVwsE5bqQ04POfkYH5dBIuGnJYdFz5fYYyNnOxiA== +"lit-html@^2.0.0 || ^3.0.0", lit-html@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.0.2.tgz#25d2718b1e095a148a54c63bcd780c7550bb82f8" + integrity sha512-Q1A5lHza3bnmxoWJn6yS6vQZQdExl4fghk8W1G+jnAEdoFNYo5oeBBb/Ol7zSEdKd3TR7+r0zsJQyuWEVguiyQ== dependencies: "@types/trusted-types" "^2.0.2" -lit@^2.0.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" - integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== - dependencies: - "@lit/reactive-element" "^1.6.0" - lit-element "^3.3.0" - lit-html "^2.8.0" - -lit@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lit/-/lit-3.0.1.tgz#bc9136cf9303ae8c23d0adcf7847c971cc94aee9" - integrity sha512-CYFv7/gwrs6bfPm299O9LD/HB4dgHvsEf/yqUOI//fi469i2OrT4xaptUcmhr05DNQEgsBFecFH8EJnN5So8oQ== +"lit@^2.0.0 || ^3.0.0", lit@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lit/-/lit-3.0.2.tgz#e22e90c2cbcc3f37bf3c2558df66f3af4331c9cf" + integrity sha512-ZoVUPGgXOQocP4OvxehEOBmC4rWB4cRYDPaz7aFmH8DFytsCi/NeACbr4C6vNPGDEC07BrhUos7uVNayDKLQ2Q== dependencies: "@lit/reactive-element" "^2.0.0" lit-element "^4.0.0" @@ -6817,10 +6792,10 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== -postcss-scss@^4.0.7: - version "4.0.8" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.8.tgz#12a4991a902a782d4e9b86b1f217d5181c6c4f32" - integrity sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA== +postcss-scss@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== postcss-selector-parser@^6.0.13: version "6.0.13" @@ -7654,26 +7629,26 @@ style-search@^0.1.0: resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== -stylelint-config-recommended-scss@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.0.0.tgz#dd8c319e15a6412262cd8554e4aad9bfba1bbb11" - integrity sha512-7AmMIsHTsuwUQm7I+DD5BGeIgCvqYZ4BpeYJJpb1cUXQwrJAKjA+GBotFZgUEGP8lAM+wmd91ovzOi8xfAyWEw== +stylelint-config-recommended-scss@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.1.0.tgz#04e529ae0e9c1abb1e04de79258461c07811876f" + integrity sha512-8L5nDfd+YH6AOoBGKmhH8pLWF1dpfY816JtGMePcBqqSsLU+Ysawx44fQSlMOJ2xTfI9yTGpup5JU77c17w1Ww== dependencies: - postcss-scss "^4.0.7" + postcss-scss "^4.0.9" stylelint-config-recommended "^13.0.0" - stylelint-scss "^5.1.0" + stylelint-scss "^5.3.0" stylelint-config-recommended@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz#c48a358cc46b629ea01f22db60b351f703e00597" integrity sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ== -stylelint-config-standard-scss@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.0.0.tgz#98332b68a9c98b6fce54c7698741e103719942b5" - integrity sha512-fGE79NBOLg09a9afqGH/guJulRULCaQWWv4cv1v2bMX92B+fGb0y56WqIguwvFcliPmmUXiAhKrrnXilIeXoHA== +stylelint-config-standard-scss@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.1.0.tgz#53c2fb9423ed89c0921aa83479892a912cc1ca15" + integrity sha512-5gnBgeNTgRVdchMwiFQPuBOtj9QefYtfXiddrOMJA2pI22zxt6ddI2s+e5Oh7/6QYl7QLJujGnaUR5YyGq72ow== dependencies: - stylelint-config-recommended-scss "^13.0.0" + stylelint-config-recommended-scss "^13.1.0" stylelint-config-standard "^34.0.0" stylelint-config-standard@^34.0.0: @@ -7683,11 +7658,12 @@ stylelint-config-standard@^34.0.0: dependencies: stylelint-config-recommended "^13.0.0" -stylelint-scss@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-5.1.0.tgz#dd318bc5c65f7a11f3ecacc7b6e8b67e7f2f1df1" - integrity sha512-E+KlQFXv1Euha43qw3q+wKBSli557wxbbo6/39DWhRNXlUa9Cz+FYrcgz+PT6ag0l6UisCYjAGCNhoSl4FcwlA== +stylelint-scss@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-5.3.0.tgz#32fd2681f8934e87dfa90f5188646d07f08c59c9" + integrity sha512-Sc7S1uWqStMc99NREsHNxpxHHFRvjo2pWILNl/UCwWO8PxhODK8qbJH0GHWIALxl6BD5rwJL4cSm4jk36hi6fg== dependencies: + known-css-properties "^0.28.0" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.1" postcss-selector-parser "^6.0.13"