From b1f35e7364afe0b1d5483496136def5a24bdc183 Mon Sep 17 00:00:00 2001
From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com>
Date: Wed, 12 Jul 2023 13:08:40 +0100
Subject: [PATCH 1/5] Add rake task to remove placeholder deactivation periods
(#1770)
---
.../remove_placeholder_deactivations.rake | 22 ++++++++
.../remove_placeholder_deactivations_spec.rb | 54 +++++++++++++++++++
2 files changed, 76 insertions(+)
create mode 100644 lib/tasks/remove_placeholder_deactivations.rake
create mode 100644 spec/lib/tasks/remove_placeholder_deactivations_spec.rb
diff --git a/lib/tasks/remove_placeholder_deactivations.rake b/lib/tasks/remove_placeholder_deactivations.rake
new file mode 100644
index 000000000..013649a5c
--- /dev/null
+++ b/lib/tasks/remove_placeholder_deactivations.rake
@@ -0,0 +1,22 @@
+namespace :data_cleanup do
+ desc "Remove all the deactivations for given model with deactivation date after 2031/01/01"
+ task :remove_placeholder_deactivations, %i[model_name] => :environment do |_task, args|
+ model_name = args[:model_name]
+ raise "Usage: rake data_cleanup:remove_placeholder_deactivations['model_name']" if model_name.blank?
+
+ case model_name
+ when "location"
+ location_deactivation_periods = LocationDeactivationPeriod.where("deactivation_date >= ?", Time.zone.local(2031, 1, 1))
+ location_deactivation_periods_count = location_deactivation_periods.count
+ location_deactivation_periods.delete_all
+ Rails.logger.info("Removed #{location_deactivation_periods_count} location deactivation periods")
+ when "scheme"
+ scheme_deactivation_periods = SchemeDeactivationPeriod.where("deactivation_date >= ?", Time.zone.local(2031, 1, 1))
+ scheme_deactivation_periods_count = scheme_deactivation_periods.count
+ scheme_deactivation_periods.delete_all
+ Rails.logger.info("Removed #{scheme_deactivation_periods_count} scheme deactivation periods")
+ else
+ raise "Deactivations for #{model_name} cannot be deleted"
+ end
+ end
+end
diff --git a/spec/lib/tasks/remove_placeholder_deactivations_spec.rb b/spec/lib/tasks/remove_placeholder_deactivations_spec.rb
new file mode 100644
index 000000000..2d7d0f4c6
--- /dev/null
+++ b/spec/lib/tasks/remove_placeholder_deactivations_spec.rb
@@ -0,0 +1,54 @@
+require "rails_helper"
+require "rake"
+
+RSpec.describe "data_cleanup" do
+ describe ":remove_placeholder_deactivations", type: :task do
+ subject(:task) { Rake::Task["data_cleanup:remove_placeholder_deactivations"] }
+
+ before do
+ Rake.application.rake_require("tasks/remove_placeholder_deactivations")
+ Rake::Task.define_task(:environment)
+ task.reenable
+ end
+
+ context "when the rake task is run" do
+ context "with location model" do
+ let(:locations) { create_list(:location, 3) }
+ let!(:placeholder_location_deactivation) { create(:location_deactivation_period, deactivation_date: Time.zone.local(2031, 1, 1), location: locations[0]) }
+ let!(:placeholder_location_deactivation_two) { create(:location_deactivation_period, deactivation_date: Time.zone.local(2031, 1, 1), location: locations[1]) }
+ let!(:valid_location_deactivation) { create(:location_deactivation_period, deactivation_date: Time.zone.local(2030, 12, 31), location: locations[2]) }
+
+ it "removes location_deactivation_period with date on or after 2031/01/01" do
+ expect(Rails.logger).to receive(:info).with("Removed 2 location deactivation periods")
+ expect { task.invoke("location") }.to change(LocationDeactivationPeriod, :count).by(-2)
+ expect { placeholder_location_deactivation.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { placeholder_location_deactivation_two.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { valid_location_deactivation.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context "with scheme model" do
+ let(:schemes) { create_list(:scheme, 3) }
+ let!(:placeholder_scheme_deactivation) { create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2031, 1, 1), scheme: schemes[0]) }
+ let!(:placeholder_scheme_deactivation_two) { create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2031, 1, 1), scheme: schemes[1]) }
+ let!(:valid_scheme_deactivation) { create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2030, 12, 31), scheme: schemes[2]) }
+
+ it "removes scheme_deactivation_period with date on or after 2031/01/01" do
+ expect(Rails.logger).to receive(:info).with("Removed 2 scheme deactivation periods")
+ expect { task.invoke("scheme") }.to change(SchemeDeactivationPeriod, :count).by(-2)
+ expect { placeholder_scheme_deactivation.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { placeholder_scheme_deactivation_two.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { valid_scheme_deactivation.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ it "raises an error when no model is given" do
+ expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_cleanup:remove_placeholder_deactivations['model_name']")
+ end
+
+ it "logs an error when wrong model is given" do
+ expect { task.invoke("fake_model") }.to raise_error(RuntimeError, "Deactivations for fake_model cannot be deleted")
+ end
+ end
+ end
+end
From d5b02ddee19dd5d8967ed52cd792207685e53640 Mon Sep 17 00:00:00 2001
From: Jack <113976590+bibblobcode@users.noreply.github.com>
Date: Thu, 13 Jul 2023 10:46:18 +0200
Subject: [PATCH 2/5] Use DPC persisted data and signed_at (#1771)
---
app/controllers/organisations_controller.rb | 1 -
app/helpers/data_sharing_agreement_helper.rb | 16 ++++++++--------
...ta_protection_confirmation_import_service.rb | 1 -
.../data_sharing_agreement.html.erb | 4 ++--
lib/tasks/data_import.rake | 17 -----------------
spec/factories/data_protection_confirmation.rb | 7 +++++++
...otection_confirmation_import_service_spec.rb | 2 --
.../data_sharing_agreement.html.erb_spec.rb | 6 +++---
8 files changed, 20 insertions(+), 34 deletions(-)
diff --git a/app/controllers/organisations_controller.rb b/app/controllers/organisations_controller.rb
index 53052dd1c..0b1f1995e 100644
--- a/app/controllers/organisations_controller.rb
+++ b/app/controllers/organisations_controller.rb
@@ -170,7 +170,6 @@ class OrganisationsController < ApplicationController
@organisation.data_protection_confirmation.update!(
confirmed: true,
data_protection_officer: current_user,
- created_at: Time.zone.now,
signed_at: Time.zone.now,
organisation_name: @organisation.name,
organisation_address: @organisation.address_row,
diff --git a/app/helpers/data_sharing_agreement_helper.rb b/app/helpers/data_sharing_agreement_helper.rb
index c6a088461..662f1b30b 100644
--- a/app/helpers/data_sharing_agreement_helper.rb
+++ b/app/helpers/data_sharing_agreement_helper.rb
@@ -23,7 +23,7 @@ module DataSharingAgreementHelper
def name_for_data_sharing_agreement(data_protection_confirmation, user)
if data_protection_confirmation&.confirmed?
- data_protection_confirmation.data_protection_officer.name
+ data_protection_confirmation.data_protection_officer_name
elsif user.is_dpo?
user.name
else
@@ -33,7 +33,7 @@ module DataSharingAgreementHelper
def org_name_for_data_sharing_agreement(data_protection_confirmation, user)
if data_protection_confirmation&.confirmed?
- data_protection_confirmation.organisation.name
+ data_protection_confirmation.organisation_name
else
user.organisation.name
end
@@ -42,11 +42,11 @@ module DataSharingAgreementHelper
# rubocop:disable Rails/HelperInstanceVariable
def present_section_12_2(data_protection_confirmation:, user:, organisation:)
if data_protection_confirmation&.confirmed?
- @org_address = data_protection_confirmation.organisation.address_row
- @org_name = data_protection_confirmation.organisation.name
- @org_phone = data_protection_confirmation.organisation.phone
- @dpo_name = data_protection_confirmation.data_protection_officer.name
- @dpo_email = data_protection_confirmation.data_protection_officer.email
+ @org_address = data_protection_confirmation.organisation_address
+ @org_name = data_protection_confirmation.organisation_name
+ @org_phone = data_protection_confirmation.organisation_phone_number
+ @dpo_name = data_protection_confirmation.data_protection_officer_name
+ @dpo_email = data_protection_confirmation.data_protection_officer_email
else
@org_name = organisation.name
@org_address = organisation.address_row
@@ -83,7 +83,7 @@ private
def data_sharing_agreement_second_line(organisation:, user:)
if organisation.data_protection_confirmed?
- organisation.data_protection_confirmation.data_protection_officer.name if user.support?
+ organisation.data_protection_confirmation.data_protection_officer_name if user.support?
else
"Data protection officer must sign" unless user.is_dpo?
end
diff --git a/app/services/imports/data_protection_confirmation_import_service.rb b/app/services/imports/data_protection_confirmation_import_service.rb
index abf187f3c..0ee936433 100644
--- a/app/services/imports/data_protection_confirmation_import_service.rb
+++ b/app/services/imports/data_protection_confirmation_import_service.rb
@@ -37,7 +37,6 @@ module Imports
data_protection_officer: dp_officer,
old_id: record_field_value(xml_document, "id"),
old_org_id: record_field_value(xml_document, "institution"),
- created_at: record_field_value(xml_document, "change-date").to_time(:utc),
signed_at: record_field_value(xml_document, "change-date").to_time(:utc),
organisation_name: org.name,
organisation_address: org.address_row,
diff --git a/app/views/organisations/data_sharing_agreement.html.erb b/app/views/organisations/data_sharing_agreement.html.erb
index f60d64b7c..ea752ce7b 100644
--- a/app/views/organisations/data_sharing_agreement.html.erb
+++ b/app/views/organisations/data_sharing_agreement.html.erb
@@ -7,7 +7,7 @@
<% if @data_protection_confirmation&.confirmed? %>
- This agreement is made the <%= @data_protection_confirmation.created_at.day.ordinalize %> day of <%= @data_protection_confirmation.created_at.strftime("%B") %> <%= @data_protection_confirmation.created_at.year %>
+ This agreement is made the <%= @data_protection_confirmation.signed_at.day.ordinalize %> day of <%= @data_protection_confirmation.signed_at.strftime("%B") %> <%= @data_protection_confirmation.signed_at.year %>
<% elsif current_user.is_dpo? %>
This agreement is made the <%= Time.zone.now.day.ordinalize %> day of <%= Time.zone.now.strftime("%B") %> <%= Time.zone.now.year %>
<% else %>
@@ -16,7 +16,7 @@
between
<% if @data_protection_confirmation&.confirmed? %>
- 1) <%= @data_protection_confirmation.organisation.name %> of <%= @data_protection_confirmation.organisation.address_row %> (“CORE Data Provider”)
+ 1) <%= @data_protection_confirmation.organisation_name %> of <%= @data_protection_confirmation.organisation_address %> (“CORE Data Provider”)
<% else %>
1) <%= @organisation.name %> of <%= @organisation.address_row %> (“CORE Data Provider”)
<% end %>
diff --git a/lib/tasks/data_import.rake b/lib/tasks/data_import.rake
index 6e0fdd4b9..0dede82a3 100644
--- a/lib/tasks/data_import.rake
+++ b/lib/tasks/data_import.rake
@@ -28,21 +28,4 @@ namespace :core do
raise "Type #{type} is not supported by data_import"
end
end
-
- desc "Persist user and org data on data sharing confirmations"
- task persist_user_and_org_data_on_data_sharing_confirmations: :environment do |_task|
- DataProtectionConfirmation.all.includes(:data_protection_officer, :organisation).each do |dpc|
- dpc.update!(
- organisation_name: dpc.organisation.name,
- organisation_address: dpc.organisation.address_row,
- signed_at: dpc.created_at,
- organisation_phone_number: dpc.organisation.phone,
- data_protection_officer_email: dpc.data_protection_officer.email,
- data_protection_officer_name: dpc.data_protection_officer.name,
- )
- print "."
- end
-
- puts "done"
- end
end
diff --git a/spec/factories/data_protection_confirmation.rb b/spec/factories/data_protection_confirmation.rb
index 3646ea735..24ef504df 100644
--- a/spec/factories/data_protection_confirmation.rb
+++ b/spec/factories/data_protection_confirmation.rb
@@ -3,11 +3,18 @@ FactoryBot.define do
organisation { association :organisation, data_protection_confirmation: instance }
data_protection_officer { association :user, :data_protection_officer, organisation: (instance.organisation || organisation) }
+ organisation_name { organisation.name }
+ organisation_address { organisation.address_row }
+ organisation_phone_number { organisation.phone }
+ data_protection_officer_name { data_protection_officer.name }
+ data_protection_officer_email { data_protection_officer.email }
+
confirmed { true }
old_org_id { "7c5bd5fb549c09a2c55d7cb90d7ba84927e64618" }
old_id { "7c5bd5fb549c09a2c55d7cb90d7ba84927e64618" }
created_at { Time.zone.now }
updated_at { Time.zone.now }
+ signed_at { Time.zone.now }
end
end
diff --git a/spec/services/imports/data_protection_confirmation_import_service_spec.rb b/spec/services/imports/data_protection_confirmation_import_service_spec.rb
index 8b021cca8..fb3a1f9d2 100644
--- a/spec/services/imports/data_protection_confirmation_import_service_spec.rb
+++ b/spec/services/imports/data_protection_confirmation_import_service_spec.rb
@@ -50,7 +50,6 @@ RSpec.describe Imports::DataProtectionConfirmationImportService do
expect(confirmation.organisation_address).to eq("2 Marsham Street, London, SW1P 4DF")
expect(confirmation.organisation_name).to eq("DLUHC")
expect(confirmation.organisation_phone_number).to eq("123")
- expect(Time.zone.local_to_utc(confirmation.created_at)).to eq(Time.utc(2018, 0o6, 0o5, 10, 36, 49))
expect(Time.zone.local_to_utc(confirmation.signed_at)).to eq(Time.utc(2018, 0o6, 0o5, 10, 36, 49))
end
end
@@ -73,7 +72,6 @@ RSpec.describe Imports::DataProtectionConfirmationImportService do
expect(confirmation.organisation_address).to eq("2 Marsham Street, London, SW1P 4DF")
expect(confirmation.organisation_name).to eq("DLUHC")
expect(confirmation.organisation_phone_number).to eq("123")
- expect(Time.zone.local_to_utc(confirmation.created_at)).to eq(Time.utc(2018, 0o6, 0o5, 10, 36, 49))
expect(Time.zone.local_to_utc(confirmation.signed_at)).to eq(Time.utc(2018, 0o6, 0o5, 10, 36, 49))
end
diff --git a/spec/views/organisations/data_sharing_agreement.html.erb_spec.rb b/spec/views/organisations/data_sharing_agreement.html.erb_spec.rb
index 9fda45274..3c57dcf8a 100644
--- a/spec/views/organisations/data_sharing_agreement.html.erb_spec.rb
+++ b/spec/views/organisations/data_sharing_agreement.html.erb_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe "organisations/data_sharing_agreement.html.erb", :aggregate_failu
create(
:data_protection_confirmation,
organisation:,
- created_at: Time.zone.now - 1.day,
+ signed_at: Time.zone.now - 1.day,
)
end
@@ -85,7 +85,7 @@ RSpec.describe "organisations/data_sharing_agreement.html.erb", :aggregate_failu
create(
:data_protection_confirmation,
organisation:,
- created_at: Time.zone.now - 1.day,
+ signed_at: Time.zone.now - 1.day,
data_protection_officer: dpo,
)
end
@@ -137,7 +137,7 @@ RSpec.describe "organisations/data_sharing_agreement.html.erb", :aggregate_failu
create(
:data_protection_confirmation,
organisation:,
- created_at: Time.zone.now - 1.day,
+ signed_at: Time.zone.now - 1.day,
)
end
From 5cb022257bd905a8080cbf5a4e852729840ed9aa Mon Sep 17 00:00:00 2001
From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com>
Date: Thu, 13 Jul 2023 13:49:58 +0100
Subject: [PATCH 3/5] Bump semver from 5.7.1 to 5.7.2 and stylelint from
14.12.1 to 15.10.1 (#1774)
* Bump semver from 5.7.1 to 5.7.2
Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2)
---
updated-dependencies:
- dependency-name: semver
dependency-type: indirect
...
Signed-off-by: dependabot[bot]
* Bump stylelint from 14.12.1 to 15.10.1
Bumps [stylelint](https://github.com/stylelint/stylelint) from 14.12.1 to 15.10.1.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/14.12.1...15.10.1)
---
updated-dependencies:
- dependency-name: stylelint
dependency-type: direct:development
...
Signed-off-by: dependabot[bot]
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 380 +++++++++++++++++++++++++++------------------------
2 files changed, 199 insertions(+), 183 deletions(-)
diff --git a/package.json b/package.json
index b4f225668..16dcc2987 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
"devDependencies": {
"are-you-es5": "^2.1.2",
"standard": "^17.0.0",
- "stylelint": "^14.7.1",
+ "stylelint": "^15.10.1",
"stylelint-config-gds": "^0.2.0"
},
"browserslist": {
diff --git a/yarn.lock b/yarn.lock
index 22b9dfbcd..12d6d4408 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -983,10 +983,25 @@
"@babel/helper-validator-identifier" "^7.18.6"
to-fast-properties "^2.0.0"
-"@csstools/selector-specificity@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36"
- integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==
+"@csstools/css-parser-algorithms@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.0.tgz#0cc3a656dc2d638370ecf6f98358973bfbd00141"
+ integrity sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==
+
+"@csstools/css-tokenizer@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz#07ae11a0a06365d7ec686549db7b729bc036528e"
+ integrity sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==
+
+"@csstools/media-query-list-parser@^2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz#6ef642b728d30c1009bfbba3211c7e4c11302728"
+ integrity sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==
+
+"@csstools/selector-specificity@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz#798622546b63847e82389e473fd67f2707d82247"
+ integrity sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==
"@discoveryjs/json-ext@^0.5.0":
version "0.5.7"
@@ -1232,7 +1247,7 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
-"@types/minimist@^1.2.0":
+"@types/minimist@^1.2.2":
version "1.2.2"
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
@@ -1910,19 +1925,20 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-camelcase-keys@^6.2.2:
- version "6.2.2"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
- integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
+camelcase-keys@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252"
+ integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==
dependencies:
- camelcase "^5.3.1"
- map-obj "^4.0.0"
- quick-lru "^4.0.1"
+ camelcase "^6.3.0"
+ map-obj "^4.1.0"
+ quick-lru "^5.1.1"
+ type-fest "^1.2.1"
-camelcase@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
- integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+camelcase@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001400:
version "1.0.30001410"
@@ -2145,7 +2161,7 @@ cors@~2.8.5:
object-assign "^4"
vary "^1"
-cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
+cosmiconfig@^7.0.0:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
@@ -2156,6 +2172,16 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
path-type "^4.0.0"
yaml "^1.10.0"
+cosmiconfig@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd"
+ integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==
+ dependencies:
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -2184,6 +2210,14 @@ css-loader@^6.7.1:
postcss-value-parser "^4.2.0"
semver "^7.3.5"
+css-tree@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20"
+ integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==
+ dependencies:
+ mdn-data "2.0.30"
+ source-map-js "^1.0.1"
+
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
@@ -2230,11 +2264,16 @@ decamelize-keys@^1.1.0:
decamelize "^1.1.0"
map-obj "^1.0.0"
-decamelize@^1.1.0, decamelize@^1.2.0:
+decamelize@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+decamelize@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9"
+ integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==
+
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -2821,10 +2860,10 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.7, fast-glob@^3.2.9:
- version "3.2.12"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
- integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0"
+ integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -3267,11 +3306,6 @@ highlight.js@^11.5.0:
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a"
integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==
-hosted-git-info@^2.1.4:
- version "2.8.9"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
- integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
-
hosted-git-info@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
@@ -3279,10 +3313,10 @@ hosted-git-info@^4.0.1:
dependencies:
lru-cache "^6.0.0"
-html-tags@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961"
- integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==
+html-tags@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce"
+ integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==
html5shiv@^3.7.3:
version "3.7.3"
@@ -3346,10 +3380,10 @@ icss-utils@^5.0.0, icss-utils@^5.1.0:
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
-ignore@^5.1.1, ignore@^5.1.9, ignore@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
- integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+ignore@^5.1.1, ignore@^5.1.9, ignore@^5.2.0, ignore@^5.2.4:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
immutable@^3:
version "3.8.2"
@@ -3387,10 +3421,10 @@ imurmurhash@^0.1.4:
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
-indent-string@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
- integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+indent-string@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5"
+ integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==
inflight@^1.0.4:
version "1.0.6"
@@ -3797,10 +3831,10 @@ klona@^2.0.4:
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
-known-css-properties@^0.25.0:
- version "0.25.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776"
- integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==
+known-css-properties@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.27.0.tgz#82a9358dda5fe7f7bd12b5e7142c0a205393c0c5"
+ integrity sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==
levn@^0.4.1:
version "0.4.1"
@@ -3970,7 +4004,7 @@ map-obj@^1.0.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==
-map-obj@^4.0.0:
+map-obj@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
@@ -4058,28 +4092,33 @@ maximatch@^0.1.0:
arrify "^1.0.0"
minimatch "^3.0.0"
+mdn-data@2.0.30:
+ version "2.0.30"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc"
+ integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==
+
mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==
-meow@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
- integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
+meow@^10.1.5:
+ version "10.1.5"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.5.tgz#be52a1d87b5f5698602b0f32875ee5940904aa7f"
+ integrity sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==
dependencies:
- "@types/minimist" "^1.2.0"
- camelcase-keys "^6.2.2"
- decamelize "^1.2.0"
+ "@types/minimist" "^1.2.2"
+ camelcase-keys "^7.0.0"
+ decamelize "^5.0.0"
decamelize-keys "^1.1.0"
hard-rejection "^2.1.0"
minimist-options "4.1.0"
- normalize-package-data "^3.0.0"
- read-pkg-up "^7.0.1"
- redent "^3.0.0"
- trim-newlines "^3.0.0"
- type-fest "^0.18.0"
- yargs-parser "^20.2.3"
+ normalize-package-data "^3.0.2"
+ read-pkg-up "^8.0.0"
+ redent "^4.0.0"
+ trim-newlines "^4.0.2"
+ type-fest "^1.2.2"
+ yargs-parser "^20.2.9"
merge-stream@^2.0.0:
version "2.0.0"
@@ -4116,7 +4155,7 @@ mime@1.4.1:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
-min-indent@^1.0.0:
+min-indent@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
@@ -4209,10 +4248,10 @@ mutation-observer-inner-html-shim@^1.0.0:
resolved "https://registry.yarnpkg.com/mutation-observer-inner-html-shim/-/mutation-observer-inner-html-shim-1.0.1.tgz#84349f51dfc390d0af85011de8fa14e645fb400e"
integrity sha512-YmJPDSUWJgBhwqRJP6AMvjdfDHU1gsrT5YdgpxMit2+x1khLYhdYq9fvp4clPsYecVT3JOprBf/KjEX7IqlU+g==
-nanoid@^3.3.4:
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
- integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+nanoid@^3.3.6:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
+ integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
natural-compare@^1.4.0:
version "1.4.0"
@@ -4241,17 +4280,7 @@ nopt@^6.0.0:
dependencies:
abbrev "^1.0.0"
-normalize-package-data@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
- integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
- dependencies:
- hosted-git-info "^2.1.4"
- resolve "^1.10.0"
- semver "2 || 3 || 4 || 5"
- validate-npm-package-license "^3.0.1"
-
-normalize-package-data@^3.0.0:
+normalize-package-data@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e"
integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==
@@ -4428,7 +4457,7 @@ parse-json@^4.0.0:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
-parse-json@^5.0.0:
+parse-json@^5.0.0, parse-json@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@@ -4581,10 +4610,10 @@ postcss-scss@^4.0.2:
resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.5.tgz#8ee33c1dda8d9d4753b565ec79014803dc6edabf"
integrity sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==
-postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
- version "6.0.10"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
- integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
+postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
+ version "6.0.13"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b"
+ integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
@@ -4594,12 +4623,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^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@^8.4.16, postcss@^8.4.7:
- version "8.4.16"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c"
- integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
+postcss@^8.4.24, postcss@^8.4.7:
+ version "8.4.25"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f"
+ integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==
dependencies:
- nanoid "^3.3.4"
+ nanoid "^3.3.6"
picocolors "^1.0.0"
source-map-js "^1.0.2"
@@ -4810,10 +4839,10 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
-quick-lru@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
- integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
randombytes@^2.1.0:
version "2.1.0"
@@ -4842,24 +4871,24 @@ react-is@^16.13.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-read-pkg-up@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
- integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+read-pkg-up@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670"
+ integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==
dependencies:
- find-up "^4.1.0"
- read-pkg "^5.2.0"
- type-fest "^0.8.1"
+ find-up "^5.0.0"
+ read-pkg "^6.0.0"
+ type-fest "^1.0.1"
-read-pkg@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
- integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+read-pkg@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c"
+ integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==
dependencies:
"@types/normalize-package-data" "^2.4.0"
- normalize-package-data "^2.5.0"
- parse-json "^5.0.0"
- type-fest "^0.6.0"
+ normalize-package-data "^3.0.2"
+ parse-json "^5.2.0"
+ type-fest "^1.0.1"
readdirp@~3.6.0:
version "3.6.0"
@@ -4890,13 +4919,13 @@ recursive-copy@^2.0.14:
rimraf "^2.7.1"
slash "^1.0.0"
-redent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
- integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+redent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9"
+ integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==
dependencies:
- indent-string "^4.0.0"
- strip-indent "^3.0.0"
+ indent-string "^5.0.0"
+ strip-indent "^4.0.0"
regenerate-unicode-properties@^10.1.0:
version "10.1.0"
@@ -4992,7 +5021,7 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve@^1.10.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.9.0:
+resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.9.0:
version "1.22.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@@ -5146,19 +5175,19 @@ semver-compare@^1.0.0:
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
"semver@2 || 3 || 4 || 5", semver@^5.6.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7:
- version "7.3.7"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
- integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
dependencies:
lru-cache "^6.0.0"
@@ -5259,10 +5288,10 @@ sigmund@^1.0.1:
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==
-signal-exit@^3.0.7:
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
- integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+signal-exit@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967"
+ integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==
slash@^1.0.0:
version "1.0.0"
@@ -5328,7 +5357,7 @@ socket.io@^4.4.1:
socket.io-adapter "~2.4.0"
socket.io-parser "~4.2.0"
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@@ -5499,12 +5528,12 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
-strip-indent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
- integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+strip-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853"
+ integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==
dependencies:
- min-indent "^1.0.0"
+ min-indent "^1.0.1"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
@@ -5576,49 +5605,51 @@ stylelint-scss@^4.0.0:
postcss-selector-parser "^6.0.6"
postcss-value-parser "^4.1.0"
-stylelint@^14.7.1:
- version "14.12.1"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.12.1.tgz#7fac1578662ca12330c32a61c8583be7fad4a530"
- integrity sha512-ZEM4TuksChMBfuPadQsHUkbOoRySAT9QMfDvvYxdAchOJl0p+csTMBXOu6ORAAxKhwBmxqJiep8V88bXfNs3EQ==
+stylelint@^15.10.1:
+ version "15.10.1"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.10.1.tgz#93f189958687e330c106b010cbec0c41dcae506d"
+ integrity sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==
dependencies:
- "@csstools/selector-specificity" "^2.0.2"
+ "@csstools/css-parser-algorithms" "^2.3.0"
+ "@csstools/css-tokenizer" "^2.1.1"
+ "@csstools/media-query-list-parser" "^2.1.2"
+ "@csstools/selector-specificity" "^3.0.0"
balanced-match "^2.0.0"
colord "^2.9.3"
- cosmiconfig "^7.0.1"
+ cosmiconfig "^8.2.0"
css-functions-list "^3.1.0"
+ css-tree "^2.3.1"
debug "^4.3.4"
- fast-glob "^3.2.12"
+ fast-glob "^3.3.0"
fastest-levenshtein "^1.0.16"
file-entry-cache "^6.0.1"
global-modules "^2.0.0"
globby "^11.1.0"
globjoin "^0.1.4"
- html-tags "^3.2.0"
- ignore "^5.2.0"
+ html-tags "^3.3.1"
+ ignore "^5.2.4"
import-lazy "^4.0.0"
imurmurhash "^0.1.4"
is-plain-object "^5.0.0"
- known-css-properties "^0.25.0"
+ known-css-properties "^0.27.0"
mathml-tag-names "^2.1.3"
- meow "^9.0.0"
+ meow "^10.1.5"
micromatch "^4.0.5"
normalize-path "^3.0.0"
picocolors "^1.0.0"
- postcss "^8.4.16"
- postcss-media-query-parser "^0.2.3"
+ postcss "^8.4.24"
postcss-resolve-nested-selector "^0.1.1"
postcss-safe-parser "^6.0.0"
- postcss-selector-parser "^6.0.10"
+ postcss-selector-parser "^6.0.13"
postcss-value-parser "^4.2.0"
resolve-from "^5.0.0"
string-width "^4.2.3"
strip-ansi "^6.0.1"
style-search "^0.1.0"
- supports-hyperlinks "^2.3.0"
+ supports-hyperlinks "^3.0.0"
svg-tags "^1.0.0"
- table "^6.8.0"
- v8-compile-cache "^2.3.0"
- write-file-atomic "^4.0.2"
+ table "^6.8.1"
+ write-file-atomic "^5.0.1"
supports-color@^2.0.0:
version "2.0.0"
@@ -5646,10 +5677,10 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
-supports-hyperlinks@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
- integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
+supports-hyperlinks@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz#c711352a5c89070779b4dad54c05a2f14b15c94b"
+ integrity sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==
dependencies:
has-flag "^4.0.0"
supports-color "^7.0.0"
@@ -5669,10 +5700,10 @@ symbol-observable@1.0.1:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
integrity sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==
-table@^6.8.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
- integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
+table@^6.8.1:
+ version "6.8.1"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf"
+ integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==
dependencies:
ajv "^8.0.1"
lodash.truncate "^4.4.2"
@@ -5741,10 +5772,10 @@ token-stream@1.0.0:
resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4"
integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==
-trim-newlines@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
- integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
+trim-newlines@^4.0.2:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.1.1.tgz#28c88deb50ed10c7ba6dc2474421904a00139125"
+ integrity sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==
tsconfig-paths@^3.14.1:
version "3.14.1"
@@ -5763,11 +5794,6 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
-type-fest@^0.18.0:
- version "0.18.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
- integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
-
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
@@ -5778,15 +5804,10 @@ type-fest@^0.3.0:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
-type-fest@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
- integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
-
-type-fest@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
- integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
+ integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
typescript@^4.6.2:
version "4.8.3"
@@ -5881,11 +5902,6 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
-v8-compile-cache@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
- integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -6044,13 +6060,13 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
-write-file-atomic@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
- integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==
+write-file-atomic@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7"
+ integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==
dependencies:
imurmurhash "^0.1.4"
- signal-exit "^3.0.7"
+ signal-exit "^4.0.1"
ws@~8.2.3:
version "8.2.3"
@@ -6087,7 +6103,7 @@ yaml@^1.10.0:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
-yargs-parser@^20.2.2, yargs-parser@^20.2.3:
+yargs-parser@^20.2.2, yargs-parser@^20.2.9:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
From 483018be998edd1ba6f613845d7e10a1d1ac81e1 Mon Sep 17 00:00:00 2001
From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com>
Date: Thu, 13 Jul 2023 13:50:17 +0100
Subject: [PATCH 4/5] Update flaky test (#1773)
---
spec/requests/lettings_logs_controller_spec.rb | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb
index 2fc1ef461..bcf1210ce 100644
--- a/spec/requests/lettings_logs_controller_spec.rb
+++ b/spec/requests/lettings_logs_controller_spec.rb
@@ -469,13 +469,13 @@ RSpec.describe LettingsLogsController, type: :request do
let(:bulk_upload) { create(:bulk_upload, :lettings, user:) }
let!(:included_log) { create(:lettings_log, :in_progress, bulk_upload:, owning_organisation: organisation) }
- let!(:excluded_log) { create(:lettings_log, :in_progress, owning_organisation: organisation) }
+ let!(:excluded_log) { create(:lettings_log, :in_progress, owning_organisation: organisation, tenancycode: "fake_code") }
it "returns logs only associated with the bulk upload" do
get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}"
expect(page).to have_content(included_log.id)
- expect(page).not_to have_content(excluded_log.id)
+ expect(page).not_to have_content(excluded_log.tenancycode)
end
it "dislays how many logs remaining to fix" do
@@ -522,14 +522,16 @@ RSpec.describe LettingsLogsController, type: :request do
let(:other_user) { create(:user, organisation:) }
let(:bulk_upload) { create(:bulk_upload, :lettings, user: other_user) }
- let!(:excluded_log) { create(:lettings_log, bulk_upload:, owning_organisation: organisation) }
- let!(:also_excluded_log) { create(:lettings_log, owning_organisation: organisation) }
+ before do
+ create(:lettings_log, bulk_upload:, owning_organisation: organisation, tenancycode: "fake_code_1")
+ create(:lettings_log, owning_organisation: organisation, tenancycode: "fake_code_2")
+ end
it "does not return any logs" do
get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}"
- expect(page).not_to have_content(excluded_log.id)
- expect(page).not_to have_content(also_excluded_log.id)
+ expect(page).not_to have_content("fake_code_1")
+ expect(page).not_to have_content("fake_code_2")
end
end
From 2570c08fe7ee5933c107d0482e70ef5e759fb673 Mon Sep 17 00:00:00 2001
From: natdeanlewissoftwire
<94526761+natdeanlewissoftwire@users.noreply.github.com>
Date: Thu, 13 Jul 2023 16:43:25 +0100
Subject: [PATCH 5/5] CLDC-2241 Add filter count and clear button (#1768)
* feat: initial commit
* feat: update designs
* feat: actually clear filters
* refactor: don't use underscore in route
* refactor: make filters_count more readable
* feat: add session controller tests
* feat: add more tests
* refactor: simplification
* feat: add bulk upload id to filter count, make nil safe
* feat: add tests (and add other missing ones to sales log controller spec)
* Update flaky test (#1773)
* feat: revert db changes
* refactor: lint
---------
Co-authored-by: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com>
---
app/controllers/sessions_controller.rb | 13 +++
app/frontend/styles/_filter-layout.scss | 2 +-
app/helpers/filters_helper.rb | 30 +++++
app/views/logs/_log_filters.html.erb | 8 ++
config/routes.rb | 2 +
spec/controllers/sessions_controller_spec.rb | 33 ++++++
spec/features/lettings_log_spec.rb | 45 ++++++++
spec/features/sales_log_spec.rb | 45 ++++++++
spec/helpers/filters_helper_spec.rb | 43 ++++++-
.../requests/lettings_logs_controller_spec.rb | 6 +
spec/requests/sales_logs_controller_spec.rb | 109 ++++++++++++++++++
11 files changed, 334 insertions(+), 2 deletions(-)
create mode 100644 app/controllers/sessions_controller.rb
create mode 100644 spec/controllers/sessions_controller_spec.rb
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
new file mode 100644
index 000000000..cdcd05c9f
--- /dev/null
+++ b/app/controllers/sessions_controller.rb
@@ -0,0 +1,13 @@
+class SessionsController < ApplicationController
+ def clear_filters
+ session[session_name_for(params[:filter_type])] = "{}"
+
+ redirect_to send("#{params[:filter_type]}_path")
+ end
+
+private
+
+ def session_name_for(filter_type)
+ "#{filter_type}_filters"
+ end
+end
diff --git a/app/frontend/styles/_filter-layout.scss b/app/frontend/styles/_filter-layout.scss
index b9fb838ef..53f1a7d5a 100644
--- a/app/frontend/styles/_filter-layout.scss
+++ b/app/frontend/styles/_filter-layout.scss
@@ -5,7 +5,7 @@
.app-filter-layout__filter {
@include govuk-media-query(wide) {
float: left;
- min-width: govuk-grid-width("one-quarter");
+ width: govuk-grid-width("one-quarter");
}
}
diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb
index 34e768603..f54e91fc9 100644
--- a/app/helpers/filters_helper.rb
+++ b/app/helpers/filters_helper.rb
@@ -46,9 +46,39 @@ module FiltersHelper
{ "2023": "2023/24", "2022": "2022/23", "2021": "2021/22" }
end
+ def filters_applied_text(filter_type)
+ applied_filters_count(filter_type).zero? ? "No filters applied" : "#{pluralize(applied_filters_count(filter_type), 'filter')} applied"
+ end
+
+ def reset_filters_link(filter_type)
+ if applied_filters_count(filter_type).positive?
+ govuk_link_to "Clear", clear_filters_path(filter_type:)
+ end
+ end
+
private
+ def applied_filters_count(filter_type)
+ filters_count(applied_filters(filter_type))
+ end
+
+ def applied_filters(filter_type)
+ JSON.parse(session[session_name_for(filter_type)])
+ end
+
def session_name_for(filter_type)
"#{filter_type}_filters"
end
+
+ def filters_count(filters)
+ filters.each.sum do |category, category_filters|
+ if %w[status years bulk_upload_id].include?(category)
+ category_filters.count(&:present?)
+ elsif %w[user organisation].include?(category)
+ category_filters != "all" ? 1 : 0
+ else
+ 0
+ end
+ end
+ end
end
diff --git a/app/views/logs/_log_filters.html.erb b/app/views/logs/_log_filters.html.erb
index d8235d350..d52e25409 100644
--- a/app/views/logs/_log_filters.html.erb
+++ b/app/views/logs/_log_filters.html.erb
@@ -8,6 +8,14 @@
<%= form_with html: { method: :get } do |f| %>
<% all_or_yours = { "all": { label: "All" }, "yours": { label: "Yours" } } %>
+
+
+ <%= filters_applied_text(@filter_type) %>
+
+
+ <%= reset_filters_link(@filter_type) %>
+
+
<% if bulk_upload_options(@bulk_upload).present? %>
<%= render partial: "filters/checkbox_filter",
locals: {
diff --git a/config/routes.rb b/config/routes.rb
index 707e8e942..4da2e007e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -54,6 +54,8 @@ Rails.application.routes.draw do
get "/download-22-23-sales-bulk-upload-template", to: "start#download_22_23_sales_bulk_upload_template"
get "/download-22-23-sales-bulk-upload-specification", to: "start#download_22_23_sales_bulk_upload_specification"
+ get "clear-filters", to: "sessions#clear_filters"
+
resource :account, only: %i[show edit], controller: "users" do
get "edit/password", to: "users#edit_password"
end
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
new file mode 100644
index 000000000..4562e9a57
--- /dev/null
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -0,0 +1,33 @@
+require "rails_helper"
+
+RSpec.describe SessionsController do
+ describe "#clear_filters" do
+ context "when filter_type is lettings_logs" do
+ let(:filter_type) { "lettings_logs" }
+
+ it "clears only lettings filters" do
+ session[:lettings_logs_filters] = "{'some_category':'some_filter'}"
+ session[:sales_logs_filters] = "{'some_other_category':'some_other_filter'}"
+
+ get :clear_filters, params: { filter_type: }
+
+ expect(session[:lettings_logs_filters]).to eq("{}")
+ expect(session[:sales_logs_filters]).to eq("{'some_other_category':'some_other_filter'}")
+ end
+ end
+
+ context "when filter_type is sales_logs" do
+ let(:filter_type) { "sales_logs" }
+
+ it "clears only sales filters" do
+ session[:lettings_logs_filters] = "{'some_category':'some_filter'}"
+ session[:sales_logs_filters] = "{'some_other_category':'some_other_filter'}"
+
+ get :clear_filters, params: { filter_type: }
+
+ expect(session[:lettings_logs_filters]).to eq("{'some_category':'some_filter'}")
+ expect(session[:sales_logs_filters]).to eq("{}")
+ end
+ end
+ end
+end
diff --git a/spec/features/lettings_log_spec.rb b/spec/features/lettings_log_spec.rb
index 993c7e82c..f74091f5b 100644
--- a/spec/features/lettings_log_spec.rb
+++ b/spec/features/lettings_log_spec.rb
@@ -57,6 +57,51 @@ RSpec.describe "Lettings Log Features" do
end
end
+ context "when filtering logs" do
+ let(:user) { create(:user, last_sign_in_at: Time.zone.now) }
+
+ context "when I am signed in" do
+ before do
+ visit("/lettings-logs")
+ fill_in("user[email]", with: user.email)
+ fill_in("user[password]", with: user.password)
+ click_button("Sign in")
+ end
+
+ context "when no filters are selected" do
+ it "displays the filters component with no clear button" do
+ expect(page).to have_content("No filters applied")
+ expect(page).not_to have_content("Clear")
+ end
+ end
+
+ context "when I have selected filters" do
+ before do
+ check("Not started")
+ check("In progress")
+ choose("Yours")
+ click_button("Apply filters")
+ end
+
+ it "displays the filters component with a correct count and clear button" do
+ expect(page).to have_content("3 filters applied")
+ expect(page).to have_content("Clear")
+ end
+
+ context "when clearing the filters" do
+ before do
+ click_link("Clear")
+ end
+
+ it "clears the filters and displays the filter component as before" do
+ expect(page).to have_content("No filters applied")
+ expect(page).not_to have_content("Clear")
+ end
+ end
+ end
+ end
+ end
+
context "when the signed is user is a Support user" do
let(:organisation) { create(:organisation, name: "User org") }
let(:support_user) { create(:user, :support, last_sign_in_at: Time.zone.now, organisation:) }
diff --git a/spec/features/sales_log_spec.rb b/spec/features/sales_log_spec.rb
index 890c82786..9a2fec455 100644
--- a/spec/features/sales_log_spec.rb
+++ b/spec/features/sales_log_spec.rb
@@ -94,6 +94,51 @@ RSpec.describe "Sales Log Features" do
end
end
+ context "when filtering logs" do
+ let(:user) { create(:user, last_sign_in_at: Time.zone.now) }
+
+ context "when I am signed in" do
+ before do
+ visit("/sales-logs")
+ fill_in("user[email]", with: user.email)
+ fill_in("user[password]", with: user.password)
+ click_button("Sign in")
+ end
+
+ context "when no filters are selected" do
+ it "displays the filters component with no clear button" do
+ expect(page).to have_content("No filters applied")
+ expect(page).not_to have_content("Clear")
+ end
+ end
+
+ context "when I have selected filters" do
+ before do
+ check("Not started")
+ check("In progress")
+ choose("Yours")
+ click_button("Apply filters")
+ end
+
+ it "displays the filters component with a correct count and clear button" do
+ expect(page).to have_content("3 filters applied")
+ expect(page).to have_content("Clear")
+ end
+
+ context "when clearing the filters" do
+ before do
+ click_link("Clear")
+ end
+
+ it "clears the filters and displays the filter component as before" do
+ expect(page).to have_content("No filters applied")
+ expect(page).not_to have_content("Clear")
+ end
+ end
+ end
+ end
+ end
+
context "when signed in as a support user" do
let(:devise_notify_mailer) { DeviseNotifyMailer.new }
let(:notify_client) { instance_double(Notifications::Client) }
diff --git a/spec/helpers/filters_helper_spec.rb b/spec/helpers/filters_helper_spec.rb
index 622fd71f8..65d0c2c6b 100644
--- a/spec/helpers/filters_helper_spec.rb
+++ b/spec/helpers/filters_helper_spec.rb
@@ -132,7 +132,7 @@ RSpec.describe FiltersHelper do
end
end
- context "when a range of filters are applied" do
+ context "when a range of filters is applied" do
let(:filters) do
{
"user" => "all",
@@ -204,4 +204,45 @@ RSpec.describe FiltersHelper do
)
end
end
+
+ describe "#filters_applied_text" do
+ let(:filter_type) { "lettings_logs" }
+ let(:result) { filters_applied_text(filter_type) }
+ let(:serialised_filters) { filters&.to_json }
+ let(:filters) { nil }
+
+ before do
+ session[:lettings_logs_filters] = serialised_filters if serialised_filters
+ end
+
+ context "when no filters are applied" do
+ let(:filters) do
+ {
+ "user" => "all",
+ "status" => [""],
+ "years" => [""],
+ "organisation" => "all",
+ }
+ end
+
+ it "returns the correct filters count" do
+ expect(result).to eq "No filters applied"
+ end
+ end
+
+ context "when a range of filters is applied" do
+ let(:filters) do
+ {
+ "user" => "all",
+ "status" => %w[in_progress completed],
+ "years" => [""],
+ "organisation" => 2,
+ }
+ end
+
+ it "returns the correct filters count" do
+ expect(result).to eq "3 filters applied"
+ end
+ end
+ end
end
diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb
index bcf1210ce..46f4027a9 100644
--- a/spec/requests/lettings_logs_controller_spec.rb
+++ b/spec/requests/lettings_logs_controller_spec.rb
@@ -498,6 +498,12 @@ RSpec.describe LettingsLogsController, type: :request do
expect(page).not_to have_content("Status")
end
+ it "has correct filter count and clear button" do
+ get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).to have_content("1 filter applied")
+ expect(page).to have_content("Clear")
+ end
+
it "hides button to create a new log" do
get "/lettings-logs?bulk_upload_id[]=#{bulk_upload.id}"
expect(page).not_to have_content("Create a new lettings log")
diff --git a/spec/requests/sales_logs_controller_spec.rb b/spec/requests/sales_logs_controller_spec.rb
index 5d24e6b01..9583cf197 100644
--- a/spec/requests/sales_logs_controller_spec.rb
+++ b/spec/requests/sales_logs_controller_spec.rb
@@ -350,6 +350,115 @@ RSpec.describe SalesLogsController, type: :request do
expect(page).to have_link(sales_log_2023.id.to_s)
end
end
+
+ context "with bulk_upload_id filter" do
+ context "with bulk upload that belongs to current user" do
+ let(:organisation) { create(:organisation) }
+
+ let(:user) { create(:user, organisation:) }
+ let(:bulk_upload) { create(:bulk_upload, :sales, user:) }
+
+ let!(:included_log) { create(:sales_log, :in_progress, bulk_upload:, owning_organisation: organisation) }
+ let!(:excluded_log) { create(:sales_log, :in_progress, owning_organisation: organisation) }
+
+ it "returns logs only associated with the bulk upload" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+
+ expect(page).to have_content(included_log.id)
+ expect(page).not_to have_content(excluded_log.id)
+ end
+
+ it "dislays how many logs remaining to fix" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).to have_content("You need to fix 1 log")
+ end
+
+ it "displays filter" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).to have_content("With logs from bulk upload")
+ end
+
+ it "hides collection year filter" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).not_to have_content("Collection year")
+ end
+
+ it "hides status filter" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).not_to have_content("Status")
+ end
+
+ it "has correct filter count and clear button" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).to have_content("1 filter applied")
+ expect(page).to have_content("Clear")
+ end
+
+ it "hides button to create a new log" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).not_to have_content("Create a new sales log")
+ end
+
+ it "displays card with help info" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).to have_content("The following logs are from your recent bulk upload")
+ end
+
+ it "displays meta info about the bulk upload" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+ expect(page).to have_content(bulk_upload.filename)
+ expect(page).to have_content(bulk_upload.created_at.to_fs(:govuk_date_and_time))
+ end
+ end
+
+ context "with bulk upload that belongs to another user" do
+ let(:organisation) { create(:organisation) }
+
+ let(:user) { create(:user, organisation:) }
+ let(:other_user) { create(:user, organisation:) }
+ let(:bulk_upload) { create(:bulk_upload, :sales, user: other_user) }
+
+ let!(:excluded_log) { create(:sales_log, bulk_upload:, owning_organisation: organisation) }
+ let!(:also_excluded_log) { create(:sales_log, owning_organisation: organisation) }
+
+ it "does not return any logs" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+
+ expect(page).not_to have_content(excluded_log.id)
+ expect(page).not_to have_content(also_excluded_log.id)
+ end
+ end
+
+ context "when bulk upload has been resolved" do
+ let(:organisation) { create(:organisation) }
+
+ let(:user) { create(:user, organisation:) }
+ let(:bulk_upload) { create(:bulk_upload, :sales, user:) }
+
+ it "redirects to resume the bulk upload" do
+ get "/sales-logs?bulk_upload_id[]=#{bulk_upload.id}"
+
+ expect(response).to redirect_to(resume_bulk_upload_sales_result_path(bulk_upload))
+ end
+ end
+ end
+
+ context "without bulk_upload_id" do
+ it "does not display filter" do
+ get "/sales-logs"
+ expect(page).not_to have_content("With logs from bulk upload")
+ end
+
+ it "displays button to create a new log" do
+ get "/sales-logs"
+ expect(page).to have_content("Create a new sales log")
+ end
+
+ it "does not display card with help info" do
+ get "/sales-logs"
+ expect(page).not_to have_content("The following logs are from your recent bulk upload")
+ end
+ end
end
end