diff --git a/Gemfile b/Gemfile index 59332294205..9ac8b7f3ee4 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" } ruby "~> #{File.read(File.join(__dir__, '.ruby-version')).strip}" -gem 'rails', '~> 7.1.0' +gem 'rails', '~> 7.1.3' gem 'activerecord-postgis-adapter', '~> 9.0' gem 'ahoy_matey', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 93aacb39ea0..9b1844352da 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -68,35 +68,35 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + actioncable (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.2) - actionpack (= 7.1.2) - activejob (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + actionmailbox (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.2) - actionpack (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activesupport (= 7.1.2) + actionmailer (7.1.3.2) + actionpack (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activesupport (= 7.1.3.2) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.2) - actionview (= 7.1.2) - activesupport (= 7.1.2) + actionpack (7.1.3.2) + actionview (= 7.1.3.2) + activesupport (= 7.1.3.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -104,38 +104,38 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.2) - actionpack (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + actiontext (7.1.3.2) + actionpack (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.2) - activesupport (= 7.1.2) + actionview (7.1.3.2) + activesupport (= 7.1.3.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.2) - activesupport (= 7.1.2) + activejob (7.1.3.2) + activesupport (= 7.1.3.2) globalid (>= 0.3.6) - activemodel (7.1.2) - activesupport (= 7.1.2) - activerecord (7.1.2) - activemodel (= 7.1.2) - activesupport (= 7.1.2) + activemodel (7.1.3.2) + activesupport (= 7.1.3.2) + activerecord (7.1.3.2) + activemodel (= 7.1.3.2) + activesupport (= 7.1.3.2) timeout (>= 0.4.0) activerecord-postgis-adapter (9.0.1) activerecord (~> 7.1.0) rgeo-activerecord (~> 7.0.0) - activestorage (7.1.2) - actionpack (= 7.1.2) - activejob (= 7.1.2) - activerecord (= 7.1.2) - activesupport (= 7.1.2) + activestorage (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activesupport (= 7.1.3.2) marcel (~> 1.0) - activesupport (7.1.2) + activesupport (7.1.3.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -503,20 +503,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - rails (7.1.2) - actioncable (= 7.1.2) - actionmailbox (= 7.1.2) - actionmailer (= 7.1.2) - actionpack (= 7.1.2) - actiontext (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activemodel (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + rails (7.1.3.2) + actioncable (= 7.1.3.2) + actionmailbox (= 7.1.3.2) + actionmailer (= 7.1.3.2) + actionpack (= 7.1.3.2) + actiontext (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activemodel (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) bundler (>= 1.15.0) - railties (= 7.1.2) + railties (= 7.1.3.2) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -531,9 +531,9 @@ GEM rails-i18n (7.0.6) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + railties (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -818,7 +818,7 @@ DEPENDENCIES rack-test (>= 1.1.0) rack-timeout rack_session_access (>= 0.2.0) - rails (~> 7.1.0) + rails (~> 7.1.3) rails-controller-testing (>= 1.0.4) redacted_struct redis (>= 3.2.0) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 43c77f0d1d8..3bcbc03a965 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -257,7 +257,7 @@ def after_mfa_setup_path def user_needs_to_reactivate_account? return false if current_user.password_reset_profile.blank? return false if pending_profile_newer_than_password_reset_profile? - sp_session[:ial2] == true + resolved_authn_context_result.identity_proofing? end def pending_profile_newer_than_password_reset_profile? @@ -387,8 +387,11 @@ def set_locale I18n.locale = LocaleChooser.new(params[:locale], request).locale end - def sp_session_ial - sp_session[:ial].presence || 1 + def pii_requested_but_locked? + if resolved_authn_context_result.identity_proofing? || resolved_authn_context_result.ialmax? + current_user.identity_verified? && + !Pii::Cacher.new(current_user, user_session).exists_in_session? + end end def mfa_policy diff --git a/app/controllers/concerns/billable_event_trackable.rb b/app/controllers/concerns/billable_event_trackable.rb index 0c9784d0fde..13ac781b6f5 100644 --- a/app/controllers/concerns/billable_event_trackable.rb +++ b/app/controllers/concerns/billable_event_trackable.rb @@ -41,7 +41,7 @@ def mark_current_session_billed def session_has_been_billed_flag_key issuer = sp_session[:issuer] - if sp_session_ial == 1 + if !resolved_authn_context_result.identity_proofing? "auth_counted_#{issuer}ial1" else "auth_counted_#{issuer}" diff --git a/app/controllers/concerns/idv_session_concern.rb b/app/controllers/concerns/idv_session_concern.rb index 08f16cfb9a3..44dd58fd60b 100644 --- a/app/controllers/concerns/idv_session_concern.rb +++ b/app/controllers/concerns/idv_session_concern.rb @@ -53,13 +53,7 @@ def redirect_unless_idv_session_user def redirect_unless_sp_requested_verification return if !IdentityConfig.store.idv_sp_required return if idv_session_user.profiles.any? - - ial_context = IalContext.new( - ial: sp_session_ial, - service_provider: sp_from_sp_session, - user: idv_session_user, - ) - return if ial_context.ial2_or_greater? + return if resolved_authn_context_result.identity_proofing? redirect_to account_url end diff --git a/app/controllers/concerns/saml_idp_auth_concern.rb b/app/controllers/concerns/saml_idp_auth_concern.rb index 14b2be3d042..531cae6543d 100644 --- a/app/controllers/concerns/saml_idp_auth_concern.rb +++ b/app/controllers/concerns/saml_idp_auth_concern.rb @@ -133,7 +133,7 @@ def link_identity_from_session_data IdentityLinker. new(current_user, saml_request_service_provider). link_identity( - ial: ial_context.ial, + ial: resolved_authn_context_int_ial, rails_session_id: session.id, ) end @@ -148,9 +148,8 @@ def identity_needs_verification? def ial_context @ial_context ||= IalContext.new( - ial: requested_ial_authn_context, + ial: resolved_authn_context_int_ial, service_provider: saml_request_service_provider, - authn_context_comparison: saml_request.requested_authn_context_comparison, user: current_user, ) end diff --git a/app/controllers/concerns/verify_sp_attributes_concern.rb b/app/controllers/concerns/verify_sp_attributes_concern.rb index 6a168bb07b8..d47dbedd138 100644 --- a/app/controllers/concerns/verify_sp_attributes_concern.rb +++ b/app/controllers/concerns/verify_sp_attributes_concern.rb @@ -22,7 +22,7 @@ def update_verified_attributes current_user, current_sp, ).link_identity( - ial: sp_session_ial, + ial: linked_identity_ial, verified_attributes: sp_session[:requested_attributes], last_consented_at: Time.zone.now, clear_deleted_at: true, @@ -62,6 +62,16 @@ def verified_after_consent?(last_estimated_consent) verification_timestamp.present? && last_estimated_consent < verification_timestamp end + def linked_identity_ial + if resolved_authn_context_result.ialmax? + 0 + elsif resolved_authn_context_result.identity_proofing? + 2 + else + 1 + end + end + def find_sp_session_identity current_user&.identities&.find_by(service_provider: sp_session[:issuer]) end diff --git a/app/controllers/idv/personal_key_controller.rb b/app/controllers/idv/personal_key_controller.rb index 4df87e7b96a..c90cd6af732 100644 --- a/app/controllers/idv/personal_key_controller.rb +++ b/app/controllers/idv/personal_key_controller.rb @@ -21,11 +21,16 @@ def show analytics.idv_personal_key_visited( address_verification_method: idv_session.address_verification_mechanism, in_person_verification_pending: idv_session.profile&.in_person_verification_pending?, + encrypted_profiles_missing: pii_is_missing?, **opt_in_analytics_properties, ) - add_proofing_component - finish_idv_session + if pii_is_missing? + redirect_to_retrieve_pii + else + add_proofing_component + finish_idv_session + end end def update @@ -117,5 +122,14 @@ def in_person_enrollment? return false unless IdentityConfig.store.in_person_proofing_enabled current_user.pending_in_person_enrollment.present? end + + def pii_is_missing? + user_session[:encrypted_profiles].blank? + end + + def redirect_to_retrieve_pii + user_session[:stored_location] = request.original_fullpath + redirect_to fix_broken_personal_key_url + end end end diff --git a/app/controllers/openid_connect/authorization_controller.rb b/app/controllers/openid_connect/authorization_controller.rb index a1171123193..2fb4d9de2ce 100644 --- a/app/controllers/openid_connect/authorization_controller.rb +++ b/app/controllers/openid_connect/authorization_controller.rb @@ -189,12 +189,6 @@ def store_request ).call end - def pii_requested_but_locked? - sp_session && sp_session_ial > 1 && - current_user.identity_verified? && - !Pii::Cacher.new(current_user, user_session).exists_in_session? - end - def track_events event_ial_context = IalContext.new( ial: @authorize_form.ial, diff --git a/app/controllers/saml_idp_controller.rb b/app/controllers/saml_idp_controller.rb index e28797867d7..d3265294ac8 100644 --- a/app/controllers/saml_idp_controller.rb +++ b/app/controllers/saml_idp_controller.rb @@ -113,13 +113,6 @@ def set_devise_failure_redirect_for_concurrent_session_logout request.env['devise_session_limited_failure_redirect_url'] = request.url end - def pii_requested_but_locked? - if (sp_session && sp_session_ial > 1) || ial_context.ialmax_requested? - current_user.identity_verified? && - !Pii::Cacher.new(current_user, user_session).exists_in_session? - end - end - def capture_analytics analytics_payload = result.to_h.merge( endpoint: api_saml_auth_path(path_year: params[:path_year]), @@ -146,7 +139,9 @@ def log_external_saml_auth_request end def requested_ial - return 'ialmax' if ial_context.ialmax_requested? + requested_ial_acr = FederatedProtocols::Saml.new(saml_request).ial + requested_ial_component = Vot::LegacyComponentValues.by_name[requested_ial_acr] + return 'ialmax' if requested_ial_component&.requirements&.include?(:ialmax) saml_request&.requested_ial_authn_context || 'none' end @@ -174,9 +169,19 @@ def render_template_for(message, action_url, type) ) end + def resolved_authn_context_int_ial + if resolved_authn_context_result.ialmax? + 0 + elsif resolved_authn_context_result.identity_proofing? + 2 + else + 1 + end + end + def track_events analytics.sp_redirect_initiated( - ial: ial_context.ial, + ial: resolved_authn_context_int_ial, billed_ial: ial_context.bill_for_ial_1_or_2, sign_in_flow: session[:sign_in_flow], ) diff --git a/app/controllers/sign_up/completions_controller.rb b/app/controllers/sign_up/completions_controller.rb index 912a7ac01a7..c21f2e40510 100644 --- a/app/controllers/sign_up/completions_controller.rb +++ b/app/controllers/sign_up/completions_controller.rb @@ -3,7 +3,7 @@ class CompletionsController < ApplicationController include SecureHeadersConcern before_action :confirm_two_factor_authenticated - before_action :confirm_identity_verified, if: :ial2? + before_action :confirm_identity_verified, if: :identity_proofing_required? before_action :confirm_selfie_captured, if: :selfie_required? before_action :apply_secure_headers_override, only: [:show, :update] before_action :verify_needs_completions_screen @@ -55,16 +55,12 @@ def completions_presenter ) end - def ial2? - sp_session[:ial2] - end - - def ial_max? - sp_session[:ialmax] + def identity_proofing_required? + resolved_authn_context_result.identity_proofing? end def ial2_requested? - !!(ial2? || (ial_max? && current_user.identity_verified?)) + resolved_authn_context_result.identity_proofing_or_ialmax? && current_user.identity_verified? end def selfie_required? @@ -91,8 +87,8 @@ def sign_user_out_and_instruct_to_go_back_to_mobile_app def analytics_attributes(page_occurence) attributes = { - ial2: sp_session[:ial2], - ialmax: sp_session[:ialmax], + ial2: resolved_authn_context_result.identity_proofing?, + ialmax: resolved_authn_context_result.ialmax?, service_provider_name: decorated_sp_session.sp_name, sp_session_requested_attributes: sp_session[:requested_attributes], sp_request_requested_attributes: service_provider_request.requested_attributes, @@ -126,7 +122,7 @@ def pii end def send_in_person_completion_survey - return unless sp_session_ial == ::Idp::Constants::IAL2 + return unless resolved_authn_context_result.identity_proofing? Idv::InPerson::CompletionSurveySender.send_completion_survey( current_user, diff --git a/app/controllers/users/passwords_controller.rb b/app/controllers/users/passwords_controller.rb index 15cfcfcca77..ae838e6078e 100644 --- a/app/controllers/users/passwords_controller.rb +++ b/app/controllers/users/passwords_controller.rb @@ -3,7 +3,7 @@ class PasswordsController < ApplicationController include ReauthenticationRequiredConcern before_action :confirm_two_factor_authenticated - before_action :capture_password_if_pii_requested_but_locked + before_action :capture_password_if_pii_present_but_locked before_action :confirm_recently_authenticated_2fa def edit @@ -33,7 +33,7 @@ def update private - def capture_password_if_pii_requested_but_locked + def capture_password_if_pii_present_but_locked return unless current_user.identity_verified? && !Pii::Cacher.new(current_user, user_session).exists_in_session? user_session[:stored_location] = request.url diff --git a/app/controllers/users/piv_cac_login_controller.rb b/app/controllers/users/piv_cac_login_controller.rb index d30ba4f1787..7f627d58b9c 100644 --- a/app/controllers/users/piv_cac_login_controller.rb +++ b/app/controllers/users/piv_cac_login_controller.rb @@ -79,8 +79,7 @@ def process_valid_submission end def next_step - if ial_context.ial2_requested? && current_user.identity_verified? && - !Pii::Cacher.new(current_user, user_session).exists_in_session? + if pii_requested_but_locked? capture_password_url elsif !current_user.accepted_rules_of_use_still_valid? rules_of_use_path @@ -89,14 +88,6 @@ def next_step end end - def ial_context - @ial_context ||= IalContext.new( - ial: sp_session_ial, - service_provider: current_sp, - user: piv_cac_login_form.user, - ) - end - def process_invalid_submission session[:needs_to_setup_piv_cac_after_sign_in] = true if piv_cac_login_form.valid_token? diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb index dea8c2f9244..128187d00e7 100644 --- a/app/controllers/users/sessions_controller.rb +++ b/app/controllers/users/sessions_controller.rb @@ -23,10 +23,7 @@ def new @issuer_forced_reauthentication = issuer_forced_reauthentication?( issuer: decorated_sp_session.sp_issuer, ) - analytics.sign_in_page_visit( - flash: flash[:alert], - stored_location: session['user_return_to'], - ) + analytics.sign_in_page_visit(flash: flash[:alert]) super end @@ -134,7 +131,6 @@ def track_authentication_attempt(email) user_id: user.uuid, user_locked_out: user_locked_out?(user), bad_password_count: session[:bad_password_count].to_i, - stored_location: session['user_return_to'], sp_request_url_present: sp_session[:request_url].present?, remember_device: remember_device_cookie.present?, ) diff --git a/app/forms/frontend_error_form.rb b/app/forms/frontend_error_form.rb new file mode 100644 index 00000000000..5c8e91929f8 --- /dev/null +++ b/app/forms/frontend_error_form.rb @@ -0,0 +1,30 @@ +class FrontendErrorForm + include ActiveModel::Model + include ActionView::Helpers::TranslationHelper + + validate :validate_filename_extension + validate :validate_filename_host + + attr_reader :filename + + def submit(filename:) + @filename = filename + + FormResponse.new(success: valid?, errors:, serialize_error_details_only: true) + end + + private + + def validate_filename_extension + return if File.extname(filename.to_s) == '.js' + errors.add(:filename, :invalid_extension, message: t('errors.general')) + end + + def validate_filename_host + begin + return if URI(filename.to_s).host == IdentityConfig.store.domain_name + rescue URI::InvalidURIError; end + + errors.add(:filename, :invalid_host, message: t('errors.general')) + end +end diff --git a/app/forms/openid_connect_authorize_form.rb b/app/forms/openid_connect_authorize_form.rb index bb2c5afb04d..95f81590e00 100644 --- a/app/forms/openid_connect_authorize_form.rb +++ b/app/forms/openid_connect_authorize_form.rb @@ -100,6 +100,8 @@ def link_identity_to_service_provider(current_user, rails_session_id) rails_session_id: rails_session_id, ial: ial_context.ial, aal: aal, + acr_values: acr_values&.join(' '), + vtr: vtr, requested_aal_value: requested_aal_value, scope: scope.join(' '), code_challenge: code_challenge, diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c6decbc77da..82a3d4b7865 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -50,7 +50,7 @@ def page_with_trust? end def ial2_requested? - sp_session && sp_session[:ial2] + resolved_authn_context_result.identity_proofing? end def cancel_link_text diff --git a/app/javascript/packages/address-search/components/address-input.spec.tsx b/app/javascript/packages/address-search/components/address-input.spec.tsx index a46ad448622..c45262f2379 100644 --- a/app/javascript/packages/address-search/components/address-input.spec.tsx +++ b/app/javascript/packages/address-search/components/address-input.spec.tsx @@ -2,7 +2,7 @@ import { render } from '@testing-library/react'; import { useSandbox } from '@18f/identity-test-helpers'; import userEvent from '@testing-library/user-event'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import type { SetupServer } from 'msw/node'; import { SWRConfig } from 'swr'; import AddressInput from './address-input'; @@ -30,8 +30,8 @@ describe('AddressInput', () => { let server: SetupServer; before(() => { server = setupServer( - rest.post(LOCATIONS_URL, (_req, res, ctx) => res(ctx.json([{ name: 'Baltimore' }]))), - rest.post(ADDRESSES_URL, (_req, res, ctx) => res(ctx.json(DEFAULT_RESPONSE))), + http.post(LOCATIONS_URL, () => HttpResponse.json([{ name: 'Baltimore' }])), + http.post(ADDRESSES_URL, () => HttpResponse.json(DEFAULT_RESPONSE)), ); server.listen(); }); diff --git a/app/javascript/packages/address-search/components/full-address-search.spec.tsx b/app/javascript/packages/address-search/components/full-address-search.spec.tsx index 94be94460d6..4e7fb767dff 100644 --- a/app/javascript/packages/address-search/components/full-address-search.spec.tsx +++ b/app/javascript/packages/address-search/components/full-address-search.spec.tsx @@ -3,7 +3,7 @@ import sinon from 'sinon'; import { useSandbox } from '@18f/identity-test-helpers'; import userEvent from '@testing-library/user-event'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import type { SetupServer } from 'msw/node'; import { SWRConfig } from 'swr'; import FullAddressSearch from './full-address-search'; @@ -215,7 +215,7 @@ describe('FullAddressSearch', () => { let server: SetupServer; before(() => { server = setupServer( - rest.post(locationsURL, (_req, res, ctx) => res(ctx.json([{ name: 'Baltimore' }]))), + http.post(locationsURL, () => HttpResponse.json([{ name: 'Baltimore' }])), ); server.listen(); }); diff --git a/app/javascript/packages/address-search/hooks/use-validated-usps-locations.spec.ts b/app/javascript/packages/address-search/hooks/use-validated-usps-locations.spec.ts index 6f055c6fe83..d0cf0ca8e91 100644 --- a/app/javascript/packages/address-search/hooks/use-validated-usps-locations.spec.ts +++ b/app/javascript/packages/address-search/hooks/use-validated-usps-locations.spec.ts @@ -1,5 +1,5 @@ import { renderHook } from '@testing-library/react-hooks'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import type { SetupServer } from 'msw/node'; import useValidatedUspsLocations from './use-validated-usps-locations'; @@ -44,7 +44,7 @@ describe('useValidatedUspsLocations', () => { beforeEach(() => { server.resetHandlers(); - server.use(rest.post(locationsURL, (_req, res, ctx) => res(ctx.json(USPS_RESPONSE)))); + server.use(http.post(locationsURL, () => HttpResponse.json(USPS_RESPONSE))); }); it('returns location results', async () => { diff --git a/app/javascript/packages/build-sass/package.json b/app/javascript/packages/build-sass/package.json index 2941625c096..3af4876e61c 100644 --- a/app/javascript/packages/build-sass/package.json +++ b/app/javascript/packages/build-sass/package.json @@ -29,7 +29,7 @@ "dependencies": { "@aduth/is-dependency": "^1.0.0", "browserslist": "^4.22.3", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "lightningcss": "^1.23.0", "sass-embedded": "^1.70.0" }, diff --git a/app/javascript/packages/document-capture/components/in-person-location-full-address-entry-post-office-search-step.spec.tsx b/app/javascript/packages/document-capture/components/in-person-location-full-address-entry-post-office-search-step.spec.tsx index e7964cd0baa..5c4adab0d17 100644 --- a/app/javascript/packages/document-capture/components/in-person-location-full-address-entry-post-office-search-step.spec.tsx +++ b/app/javascript/packages/document-capture/components/in-person-location-full-address-entry-post-office-search-step.spec.tsx @@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event'; import { i18n } from '@18f/identity-i18n'; import { setupServer } from 'msw/node'; import type { SetupServer } from 'msw/node'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import { SWRConfig } from 'swr'; import { usePropertyValue } from '@18f/identity-test-helpers'; import { ComponentType } from 'react'; @@ -78,8 +78,8 @@ describe('InPersonLocationFullAddressEntryPostOfficeSearchStep', () => { server.resetHandlers(); // todo: should we return USPS_RESPONSE here? server.use( - rest.post(locationsURL, (_req, res, ctx) => res(ctx.json([{ name: 'Baltimore' }]))), - rest.put(locationsURL, (_req, res, ctx) => res(ctx.json({ success: true }))), + http.post(locationsURL, () => HttpResponse.json([{ name: 'Baltimore' }])), + http.put(locationsURL, () => HttpResponse.json({ success: true })), ); }); @@ -94,7 +94,7 @@ describe('InPersonLocationFullAddressEntryPostOfficeSearchStep', () => { context('USPS request returns an error', () => { beforeEach(() => { - server.use(rest.post(locationsURL, (_req, res, ctx) => res(ctx.status(500)))); + server.use(http.post(locationsURL, () => new HttpResponse(null, { status: 500 }))); }); it('displays a try again error message', async () => { @@ -259,7 +259,7 @@ describe('InPersonLocationFullAddressEntryPostOfficeSearchStep', () => { it('displays correct pluralization for multiple location results', async () => { server.resetHandlers(); - server.use(rest.post(locationsURL, (_req, res, ctx) => res(ctx.json(USPS_RESPONSE)))); + server.use(http.post(locationsURL, () => HttpResponse.json(USPS_RESPONSE))); const { findByLabelText, findByText } = render( , { wrapper }, diff --git a/app/javascript/packages/document-capture/components/in-person-location-post-office-search-step.spec.tsx b/app/javascript/packages/document-capture/components/in-person-location-post-office-search-step.spec.tsx index aa4e9e64582..8a3d6155bda 100644 --- a/app/javascript/packages/document-capture/components/in-person-location-post-office-search-step.spec.tsx +++ b/app/javascript/packages/document-capture/components/in-person-location-post-office-search-step.spec.tsx @@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event'; import { i18n } from '@18f/identity-i18n'; import { usePropertyValue } from '@18f/identity-test-helpers'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import type { SetupServer } from 'msw/node'; import { SWRConfig } from 'swr'; import { ComponentType } from 'react'; @@ -96,9 +96,7 @@ describe('InPersonLocationPostOfficeSearchStep', () => { context('initial ArcGIS API request throws an error', () => { beforeEach(() => { - server.use( - rest.post(addressSearchURL, (_req, res, ctx) => res(ctx.json([]), ctx.status(422))), - ); + server.use(http.post(addressSearchURL, () => HttpResponse.json([], { status: 422 }))); }); it('displays a try again error message', async () => { @@ -124,10 +122,8 @@ describe('InPersonLocationPostOfficeSearchStep', () => { context('initial USPS API request throws an error', () => { beforeEach(() => { server.use( - rest.post(addressSearchURL, (_req, res, ctx) => - res(ctx.json(DEFAULT_RESPONSE), ctx.status(200)), - ), - rest.post(locationsURL, (_req, res, ctx) => res(ctx.status(500))), + http.post(addressSearchURL, () => HttpResponse.json(DEFAULT_RESPONSE)), + http.post(locationsURL, () => new HttpResponse(null, { status: 500 })), ); }); @@ -154,10 +150,8 @@ describe('InPersonLocationPostOfficeSearchStep', () => { context('initial API request is successful', () => { beforeEach(() => { server.use( - rest.post(addressSearchURL, (_req, res, ctx) => - res(ctx.json(DEFAULT_RESPONSE), ctx.status(200)), - ), - rest.post(locationsURL, (_req, res, ctx) => res(ctx.json([{ name: 'Baltimore' }]))), + http.post(addressSearchURL, () => HttpResponse.json(DEFAULT_RESPONSE)), + http.post(locationsURL, () => HttpResponse.json([{ name: 'Baltimore' }])), ); }); @@ -273,10 +267,8 @@ describe('InPersonLocationPostOfficeSearchStep', () => { it('displays correct pluralization for multiple location results', async () => { server.resetHandlers(); server.use( - rest.post(addressSearchURL, (_req, res, ctx) => - res(ctx.json(DEFAULT_RESPONSE), ctx.status(200)), - ), - rest.post(locationsURL, (_req, res, ctx) => res(ctx.json(MULTI_LOCATION_RESPONSE))), + http.post(addressSearchURL, () => HttpResponse.json(DEFAULT_RESPONSE)), + http.post(locationsURL, () => HttpResponse.json(MULTI_LOCATION_RESPONSE)), ); const { findByLabelText, findByText } = render( , @@ -303,10 +295,8 @@ describe('InPersonLocationPostOfficeSearchStep', () => { context('subsequent network failures clear results', () => { beforeEach(() => { server.use( - rest.post(addressSearchURL, (_req, res, ctx) => - res(ctx.json(DEFAULT_RESPONSE), ctx.status(200)), - ), - rest.post(locationsURL, (_req, res, ctx) => res(ctx.json([{ name: 'Baltimore' }]))), + http.post(addressSearchURL, () => HttpResponse.json(DEFAULT_RESPONSE)), + http.post(locationsURL, () => HttpResponse.json([{ name: 'Baltimore' }])), ); }); @@ -328,25 +318,22 @@ describe('InPersonLocationPostOfficeSearchStep', () => { expect(result).to.exist(); server.use( - rest.post(addressSearchURL, (_req, res, ctx) => - res( - ctx.json([ - { - address: '500 Main St E, Bronwood, Georgia, 39826', - location: { - latitude: 31.831686000000005, - longitude: -84.363768, - }, - street_address: '500 Main St E', - city: 'Bronwood', - state: 'GA', - zip_code: '39826', + http.post(addressSearchURL, () => + HttpResponse.json([ + { + address: '500 Main St E, Bronwood, Georgia, 39826', + location: { + latitude: 31.831686000000005, + longitude: -84.363768, }, - ]), - ctx.status(200), - ), + street_address: '500 Main St E', + city: 'Bronwood', + state: 'GA', + zip_code: '39826', + }, + ]), ), - rest.post(locationsURL, (_req, res, ctx) => res(ctx.status(500))), + http.post(locationsURL, () => new HttpResponse(null, { status: 500 })), ); await userEvent.type( @@ -365,11 +352,9 @@ describe('InPersonLocationPostOfficeSearchStep', () => { context('user deletes text from searchbox after location results load', () => { beforeEach(() => { server.use( - rest.post(addressSearchURL, (_req, res, ctx) => - res(ctx.json(DEFAULT_RESPONSE), ctx.status(200)), - ), - rest.post(locationsURL, (_req, res, ctx) => res(ctx.json([{ name: 'Baltimore' }]))), - rest.put(locationsURL, (_req, res, ctx) => res(ctx.json({ success: true }))), + http.post(addressSearchURL, () => HttpResponse.json(DEFAULT_RESPONSE)), + http.post(locationsURL, () => HttpResponse.json([{ name: 'Baltimore' }])), + http.put(locationsURL, () => HttpResponse.json({ success: true })), ); }); diff --git a/app/javascript/packages/manageable-authenticator/manageable-authenticator-element.spec.ts b/app/javascript/packages/manageable-authenticator/manageable-authenticator-element.spec.ts index 16094f50b2f..3489537ed05 100644 --- a/app/javascript/packages/manageable-authenticator/manageable-authenticator-element.spec.ts +++ b/app/javascript/packages/manageable-authenticator/manageable-authenticator-element.spec.ts @@ -1,7 +1,7 @@ import quibble from 'quibble'; import { screen, waitFor } from '@testing-library/dom'; import baseUserEvent from '@testing-library/user-event'; -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import type { SetupServer } from 'msw/node'; import type { SinonStub } from 'sinon'; @@ -226,11 +226,7 @@ describe('ManageableAuthenticatorElement', () => { context('successful response from server when submitting rename', () => { beforeEach(() => { - server.use( - rest.put('/api/manage', (_req, res, ctx) => - res(ctx.json({ success: true }), ctx.status(200)), - ), - ); + server.use(http.put('/api/manage', () => HttpResponse.json({ success: true }))); }); it('returns the user to summary details with new name for successful save', async () => { @@ -278,9 +274,7 @@ describe('ManageableAuthenticatorElement', () => { context('failed response from server when submitting rename', () => { beforeEach(() => { server.use( - rest.put('/api/manage', (_req, res, ctx) => - res(ctx.json({ error: 'Uh oh!' }), ctx.status(400)), - ), + http.put('/api/manage', () => HttpResponse.json({ error: 'Uh oh!' }, { status: 400 })), ); }); @@ -360,11 +354,7 @@ describe('ManageableAuthenticatorElement', () => { context('successful response from server when deleting', () => { beforeEach(() => { - server.use( - rest.delete('/api/manage', (_req, res, ctx) => - res(ctx.json({ success: true }), ctx.status(200)), - ), - ); + server.use(http.delete('/api/manage', () => HttpResponse.json({ success: true }))); }); it('deletes the authenticator and displays a confirmation message', async () => { @@ -395,9 +385,7 @@ describe('ManageableAuthenticatorElement', () => { context('failed response from server when deleting', () => { beforeEach(() => { server.use( - rest.delete('/api/manage', (_req, res, ctx) => - res(ctx.json({ error: 'Uh oh!' }), ctx.status(400)), - ), + http.delete('/api/manage', () => HttpResponse.json({ error: 'Uh oh!' }, { status: 400 })), ); }); diff --git a/app/javascript/packages/session/requests.spec.ts b/app/javascript/packages/session/requests.spec.ts index f2d078bb59f..2793584b50a 100644 --- a/app/javascript/packages/session/requests.spec.ts +++ b/app/javascript/packages/session/requests.spec.ts @@ -1,4 +1,4 @@ -import { rest } from 'msw'; +import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import type { SetupServer } from 'msw/node'; import { SESSIONS_URL, requestSessionStatus, extendSession } from './requests'; @@ -10,8 +10,8 @@ describe('requestSessionStatus', () => { context('session inactive', () => { before(() => { server = setupServer( - rest.get<{}, {}, SessionTimedOutStatusResponse>(SESSIONS_URL, (_req, res, ctx) => - res(ctx.json({ live: false, timeout: null })), + http.get<{}, {}, SessionTimedOutStatusResponse>(SESSIONS_URL, () => + HttpResponse.json({ live: false, timeout: null }), ), ); server.listen(); @@ -34,8 +34,8 @@ describe('requestSessionStatus', () => { before(() => { timeout = new Date(Date.now() + 1000).toISOString(); server = setupServer( - rest.get<{}, {}, SessionLiveStatusResponse>(SESSIONS_URL, (_req, res, ctx) => - res(ctx.json({ live: true, timeout })), + http.get<{}, {}, SessionLiveStatusResponse>(SESSIONS_URL, () => + HttpResponse.json({ live: true, timeout }), ), ); server.listen(); @@ -55,7 +55,7 @@ describe('requestSessionStatus', () => { context('server responds with 401', () => { before(() => { server = setupServer( - rest.get<{}, {}>(SESSIONS_URL, (_req, res, ctx) => res(ctx.status(401))), + http.get<{}, {}>(SESSIONS_URL, () => new HttpResponse(null, { status: 401 })), ); server.listen(); }); @@ -74,7 +74,7 @@ describe('requestSessionStatus', () => { context('server responds with 500', () => { before(() => { server = setupServer( - rest.get<{}, {}>(SESSIONS_URL, (_req, res, ctx) => res(ctx.status(500))), + http.get<{}, {}>(SESSIONS_URL, () => new HttpResponse(null, { status: 500 })), ); server.listen(); }); @@ -97,8 +97,8 @@ describe('extendSession', () => { before(() => { server = setupServer( - rest.put<{}, {}, SessionLiveStatusResponse>(SESSIONS_URL, (_req, res, ctx) => - res(ctx.json({ live: true, timeout })), + http.put<{}, {}, SessionLiveStatusResponse>(SESSIONS_URL, () => + HttpResponse.json({ live: true, timeout }), ), ); server.listen(); @@ -118,7 +118,7 @@ describe('extendSession', () => { context('server responds with 401', () => { before(() => { server = setupServer( - rest.put<{}, {}>(SESSIONS_URL, (_req, res, ctx) => res(ctx.status(401))), + http.put<{}, {}>(SESSIONS_URL, () => new HttpResponse(null, { status: 401 })), ); server.listen(); }); @@ -137,7 +137,7 @@ describe('extendSession', () => { context('server responds with 500', () => { before(() => { server = setupServer( - rest.put<{}, {}>(SESSIONS_URL, (_req, res, ctx) => res(ctx.status(500))), + http.put<{}, {}>(SESSIONS_URL, () => new HttpResponse(null, { status: 500 })), ); server.listen(); }); diff --git a/app/javascript/packages/stylelint-config/CHANGELOG.md b/app/javascript/packages/stylelint-config/CHANGELOG.md index 0f30db00501..58b43111e43 100644 --- a/app/javascript/packages/stylelint-config/CHANGELOG.md +++ b/app/javascript/packages/stylelint-config/CHANGELOG.md @@ -1,3 +1,16 @@ +## 4.0.0 + +### Breaking Changes + +- Breaking changes included in updated dependencies: + - Dropped support for `stylelint` versions below `v16.0.2`. + - Dropped support for Node.js versions below `v18.12.0`. + - For full details, refer to release notes for affected dependencies: + - [`stylelint-prettier`](https://github.com/prettier/stylelint-prettier/blob/main/CHANGELOG.md) + - [`stylelint-config-recommended-scss`](https://github.com/stylelint-scss/stylelint-config-recommended-scss/blob/master/CHANGELOG.md) + - [`stylelint-scss`](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md) + - [`stylelint-config-recommended`](https://github.com/stylelint/stylelint-config-recommended/blob/main/CHANGELOG.md) + ## 3.0.0 ### Breaking Changes diff --git a/app/javascript/packages/stylelint-config/package.json b/app/javascript/packages/stylelint-config/package.json index 62cefac4729..2a7c76beb72 100644 --- a/app/javascript/packages/stylelint-config/package.json +++ b/app/javascript/packages/stylelint-config/package.json @@ -1,6 +1,6 @@ { "name": "@18f/identity-stylelint-config", - "version": "3.0.0", + "version": "4.0.0", "private": false, "description": "Stylelint shareable configuration for Login.gov CSS/SASS standards", "repository": { @@ -17,12 +17,12 @@ }, "homepage": "https://github.com/18f/identity-idp", "dependencies": { - "stylelint-config-recommended-scss": "^13.1.0", - "stylelint-prettier": "^4.0.2" + "stylelint-config-recommended-scss": "^14.0.0", + "stylelint-prettier": "^5.0.0" }, "peerDependencies": { "prettier": ">=3.0.0", - "stylelint": ">=15.10.0" + "stylelint": ">=16.0.2" }, "sideEffects": false } diff --git a/app/models/federated_protocols/saml.rb b/app/models/federated_protocols/saml.rb index 7659d466abd..1187b133d36 100644 --- a/app/models/federated_protocols/saml.rb +++ b/app/models/federated_protocols/saml.rb @@ -9,7 +9,11 @@ def issuer end def ial - request.requested_ial_authn_context || default_authn_context + if ialmax_requested_with_authn_context_comparison? + ::Saml::Idp::Constants::IALMAX_AUTHN_CONTEXT_CLASSREF + else + request.requested_ial_authn_context || default_authn_context + end end def aal @@ -54,5 +58,29 @@ def current_service_provider return @current_service_provider if defined?(@current_service_provider) @current_service_provider = ServiceProvider.find_by(issuer: issuer) end + + ## + # A ServiceProvider can request an IAL authn context with a mimimum context comparison . In this + # case the IdP is expected to return a result with that IAL or a higher one. + # + # If a SP requests IAL1 with the mimium context comparison then the IdP can response with a + # IAL2 response. In order for this to happen the following need to be true: + # + # - The service provider is authorized to make IAL2 requests + # - The user has a verified account + # + # This methods checks that we are in a situation where the authn context comparison situation + # described above exists and the SP requirements are met (the requirement that the user is + # verified occurs as part of the IALMax functionality). + # + def ialmax_requested_with_authn_context_comparison? + return unless (current_service_provider&.ial || 1) > 1 + + acr_component_value = Vot::LegacyComponentValues.by_name[request.requested_ial_authn_context] + return unless acr_component_value.present? + + !acr_component_value.requirements.include?(:identity_proofing) && + request.requested_authn_context_comparison == 'minimum' + end end end diff --git a/app/presenters/saml_request_presenter.rb b/app/presenters/saml_request_presenter.rb index 7b8833f30cc..32f1433409b 100644 --- a/app/presenters/saml_request_presenter.rb +++ b/app/presenters/saml_request_presenter.rb @@ -41,7 +41,8 @@ def ial2_authn_context? end def ialmax_authn_context? - ial_context.ialmax_requested? + ial_acr_value = FederatedProtocols::Saml.new(request).ial + Vot::LegacyComponentValues.by_name[ial_acr_value]&.requirements&.include?(:ialmax) end def authn_context @@ -52,7 +53,6 @@ def ial_context @ial_context ||= IalContext.new( ial: request.requested_ial_authn_context || default_ial_context, service_provider: service_provider, - authn_context_comparison: request.requested_authn_context_comparison, ) end diff --git a/app/services/analytics_events.rb b/app/services/analytics_events.rb index ff382d0c375..1f42066a428 100644 --- a/app/services/analytics_events.rb +++ b/app/services/analytics_events.rb @@ -353,7 +353,6 @@ def edit_password_visit # @param [String] user_id # @param [Boolean] user_locked_out if the user is currently locked out of their second factor # @param [String] bad_password_count represents number of prior login failures - # @param [String] stored_location the URL to return to after signing in # @param [Boolean] sp_request_url_present if was an SP request URL in the session # @param [Boolean] remember_device if the remember device cookie was present # Tracks authentication attempts at the email/password screen @@ -362,7 +361,6 @@ def email_and_password_auth( user_id:, user_locked_out:, bad_password_count:, - stored_location:, sp_request_url_present:, remember_device:, **extra @@ -373,7 +371,6 @@ def email_and_password_auth( user_id: user_id, user_locked_out: user_locked_out, bad_password_count: bad_password_count, - stored_location: stored_location, sp_request_url_present: sp_request_url_present, remember_device: remember_device, **extra, @@ -4365,15 +4362,9 @@ def session_total_duration_timeout end # @param [String] flash - # @param [String] stored_location # tracks when a user visits the sign in page - def sign_in_page_visit(flash:, stored_location:, **extra) - track_event( - 'Sign in page visited', - flash: flash, - stored_location: stored_location, - **extra, - ) + def sign_in_page_visit(flash:, **extra) + track_event('Sign in page visited', flash:, **extra) end # @param [Boolean] success diff --git a/app/services/attribute_asserter.rb b/app/services/attribute_asserter.rb index d55d0322c5a..b1238b4d091 100644 --- a/app/services/attribute_asserter.rb +++ b/app/services/attribute_asserter.rb @@ -34,7 +34,7 @@ def build attrs = default_attrs add_email(attrs) if bundle.include? :email add_all_emails(attrs) if bundle.include? :all_emails - add_bundle(attrs) if user.active_profile.present? && ial_context.ial2_or_greater? + add_bundle(attrs) if should_add_proofed_attributes? add_verified_at(attrs) if bundle.include?(:verified_at) && ial_context.ial2_service_provider? add_aal(attrs) add_ial(attrs) if authn_request.requested_ial_authn_context || !service_provider.ial.nil? @@ -51,12 +51,21 @@ def build :decrypted_pii, :user_session + def should_add_proofed_attributes? + return false if !user.active_profile.present? + ial_context.ial2_or_greater? || ial_max_requested? + end + + def ial_max_requested? + ial_acr_value = FederatedProtocols::Saml.new(authn_request).ial + Vot::LegacyComponentValues.by_name[ial_acr_value]&.requirements&.include?(:ialmax) + end + def ial_context @ial_context ||= IalContext.new( ial: authn_context, service_provider: service_provider, user: user, - authn_context_comparison: authn_request&.requested_authn_context_comparison, ) end @@ -126,14 +135,19 @@ def add_aal(attrs) def add_ial(attrs) requested_context = authn_request.requested_ial_authn_context - context = if ial_context.ialmax_requested? && ial_context.ial2_requested? - sp_ial # IAL2 since IALMAX only works for IAL2 SPs + context = if ialmax_requested_and_fullfilable? + # IAL2 since IALMAX only works for IAL2 SPs + sp_ial else requested_context.presence || sp_ial end attrs[:ial] = { getter: ial_getter_function(context) } if context end + def ialmax_requested_and_fullfilable? + ial_max_requested? && user.active_profile.present? + end + def sp_ial Saml::Idp::Constants::AUTHN_CONTEXT_IAL_TO_CLASSREF[service_provider.ial] end diff --git a/app/services/doc_auth/lexis_nexis/requests/true_id_request.rb b/app/services/doc_auth/lexis_nexis/requests/true_id_request.rb index aa4e1e49ec6..bfe0213e211 100644 --- a/app/services/doc_auth/lexis_nexis/requests/true_id_request.rb +++ b/app/services/doc_auth/lexis_nexis/requests/true_id_request.rb @@ -23,6 +23,12 @@ def initialize( @liveness_checking_required = liveness_checking_required end + def request_context + { + workflow: workflow, + } + end + private def body @@ -43,6 +49,7 @@ def handle_http_response(http_response) http_response, config, include_liveness?, + request_context, ) end diff --git a/app/services/doc_auth/lexis_nexis/responses/true_id_response.rb b/app/services/doc_auth/lexis_nexis/responses/true_id_response.rb index bfa3acb7a82..aa68c94268d 100644 --- a/app/services/doc_auth/lexis_nexis/responses/true_id_response.rb +++ b/app/services/doc_auth/lexis_nexis/responses/true_id_response.rb @@ -11,9 +11,11 @@ class TrueIdResponse < DocAuth::Response attr_reader :config, :http_response - def initialize(http_response, config, liveness_checking_enabled = false) + def initialize(http_response, config, liveness_checking_enabled = false, + request_context = {}) @config = config @http_response = http_response + @request_context = request_context @liveness_checking_enabled = liveness_checking_enabled @pii_from_doc = read_pii(true_id_product) super( @@ -28,7 +30,10 @@ def initialize(http_response, config, liveness_checking_enabled = false) success: false, errors: { network: true }, exception: e, - extra: { backtrace: e.backtrace }, + extra: { + backtrace: e.backtrace, + reference: reference, + }, ) end @@ -191,6 +196,7 @@ def basic_logging_info reference: reference, vendor: 'TrueID', billed: billed?, + workflow: @request_context&.dig(:workflow), } end diff --git a/app/services/doc_auth/mock/result_response.rb b/app/services/doc_auth/mock/result_response.rb index 52bd4699761..b1778865ada 100644 --- a/app/services/doc_auth/mock/result_response.rb +++ b/app/services/doc_auth/mock/result_response.rb @@ -23,6 +23,7 @@ def initialize(uploaded_file, config, selfie_required = false) portrait_match_results: portrait_match_results, billed: true, classification_info: classification_info, + workflow: workflow, liveness_checking_required: @selfie_required, }.compact, ) @@ -148,6 +149,10 @@ def selfie_status end end + def workflow + selfie_check_performed? ? 'test_liveness_workflow' : 'test_non_liveness_workflow' + end + private def parsed_alerts diff --git a/app/services/frontend_error_logger.rb b/app/services/frontend_error_logger.rb index fd5a08ae8c5..d292ab2a57a 100644 --- a/app/services/frontend_error_logger.rb +++ b/app/services/frontend_error_logger.rb @@ -2,6 +2,8 @@ class FrontendErrorLogger class FrontendError < StandardError; end def self.track_error(name:, message:, stack:, filename:) + return unless FrontendErrorForm.new.submit(filename:).success? + NewRelic::Agent.notice_error( FrontendError.new, expected: true, diff --git a/app/services/ial_context.rb b/app/services/ial_context.rb index ceeed8c283c..a0db10a9727 100644 --- a/app/services/ial_context.rb +++ b/app/services/ial_context.rb @@ -2,16 +2,15 @@ # Wraps up logic for querying the IAL level of an authorization request class IalContext - attr_reader :ial, :service_provider, :user, :authn_context_comparison + attr_reader :ial, :service_provider, :user # @param ial [String, Integer] IAL level as either an integer (see ::Idp::Constants::IAL2, etc) # or a string see Saml::Idp::Constants contexts # @param service_provider [ServiceProvider, nil] - def initialize(ial:, service_provider:, user: nil, authn_context_comparison: nil) - @authn_context_comparison = authn_context_comparison + def initialize(ial:, service_provider:, user: nil) @service_provider = service_provider @user = user - @ial = int_ial(ial) + @ial = convert_ial_to_int(ial) end def ial2_service_provider? @@ -44,19 +43,6 @@ def ial2_or_greater? private - def int_ial(input) - return 0 if saml_ialmax?(input) - - convert_ial_to_int(input) - end - - def saml_ialmax?(input) - int_ial_from_request = convert_ial_to_int(input) - return false unless int_ial_from_request.present? - - service_provider&.ial == 2 && authn_context_comparison == 'minimum' && int_ial_from_request < 2 - end - def convert_ial_to_int(input) Integer(input) rescue TypeError # input was nil diff --git a/app/services/identity_linker.rb b/app/services/identity_linker.rb index 388524abf97..75a7e4b50dc 100644 --- a/app/services/identity_linker.rb +++ b/app/services/identity_linker.rb @@ -6,6 +6,8 @@ def initialize(user, service_provider) @service_provider = service_provider @ial = nil @aal = nil + @acr_values = nil + @vtr = nil @requested_aal_value = nil end @@ -13,6 +15,8 @@ def link_identity( code_challenge: nil, ial: nil, aal: nil, + acr_values: nil, + vtr: nil, requested_aal_value: nil, nonce: nil, rails_session_id: nil, @@ -30,6 +34,8 @@ def link_identity( code_challenge: code_challenge, ial: ial, aal: aal, + acr_values: acr_values, + vtr: vtr, requested_aal_value: requested_aal_value, nonce: nonce, rails_session_id: rails_session_id, diff --git a/app/services/vot/parser.rb b/app/services/vot/parser.rb index 5f9eeffde03..95e162c498e 100644 --- a/app/services/vot/parser.rb +++ b/app/services/vot/parser.rb @@ -21,6 +21,10 @@ def self.no_sp_result ialmax?: false, ) end + + def identity_proofing_or_ialmax? + identity_proofing? || ialmax? + end end attr_reader :vector_of_trust, :acr_values diff --git a/bin/oncall/email-deliveries b/bin/oncall/email-deliveries index 486f489bd00..2be5c445f9b 100755 --- a/bin/oncall/email-deliveries +++ b/bin/oncall/email-deliveries @@ -6,6 +6,7 @@ Dir.chdir(__dir__) { require 'bundler/setup' } require 'active_support' require 'active_support/core_ext/enumerable' # index_by require 'active_support/core_ext/integer/time' +require 'active_support/core_ext/string/access' require 'optparse' require 'terminal-table' @@ -60,14 +61,15 @@ class EmailDeliveries results = query_data(uuids) table = Terminal::Table.new - table << %w[user_id timestamp message_id email_action events] + table << %w[user_id email_address_id timestamp message_id email_action events] table << :separator results.each do |result| table << [ result.user_id, + result.email_address_id, result.timestamp, - result.message_id, + result.message_id.reverse.truncate(27).reverse, result.email_action, result.events.join(', '), ] @@ -78,6 +80,7 @@ class EmailDeliveries Result = Struct.new( :user_id, + :email_address_id, :timestamp, :message_id, :email_action, @@ -93,6 +96,7 @@ class EmailDeliveries fields @timestamp , properties.user_id AS user_id + , properties.event_properties.email_address_id AS email_address_id , properties.event_properties.ses_message_id AS ses_message_id , properties.event_properties.action AS email_action | filter name = 'Email Sent' @@ -127,6 +131,7 @@ class EmailDeliveries map do |message_id, events| Result.new( user_id: events_by_message_id[message_id]['user_id'], + email_address_id: events_by_message_id[message_id]['email_address_id'], email_action: events_by_message_id[message_id]['email_action'], timestamp: events_by_message_id[message_id]['@timestamp'], message_id: message_id, diff --git a/lib/cleanup/destroyable_records.rb b/lib/cleanup/destroyable_records.rb index 47746e7ba6b..a329b1a3cd9 100644 --- a/lib/cleanup/destroyable_records.rb +++ b/lib/cleanup/destroyable_records.rb @@ -26,7 +26,7 @@ def print_data stdout.puts '********' stdout.puts 'Integration:' - if integration.blank? + if integration.nil? stdout.puts 'No associated integration' else stdout.puts integration.attributes.to_yaml @@ -58,15 +58,14 @@ def print_data end def destroy_records - stdout.puts 'Destroying integration usages' - integration_usages.each do |integration_usage| - integration_usage.destroy! + if integration.present? + stdout.puts 'Destroying integration usages' + integration_usages.destroy_all + integration.reload + stdout.puts "Destroying integration with issuer #{integration.issuer}" + integration.destroy! + service_provider.reload end - integration.reload - - stdout.puts "Destroying integration with issuer #{integration.issuer}" - integration.destroy! - service_provider.reload stdout.puts "Destroying service provider issuer #{service_provider.issuer}" service_provider.destroy! @@ -79,11 +78,11 @@ def destroy_records private def integration_usages - integration&.integration_usages || [] + integration&.integration_usages end def iaa_orders - integration&.iaa_orders || [] + integration&.iaa_orders end def in_person_enrollments diff --git a/package.json b/package.json index 2fba5d67906..b6af7717477 100644 --- a/package.json +++ b/package.json @@ -81,13 +81,13 @@ "jsdom": "^22.1.0", "mocha": "^10.0.0", "mq-polyfill": "^1.1.8", - "msw": "^1.3.2", + "msw": "^2.2.1", "prettier": "^3.1.0", "quibble": "^0.9.1", "react-test-renderer": "^17.0.2", "sinon": "^14.0.0", "sinon-chai": "^3.7.0", - "stylelint": "^15.10.1", + "stylelint": "^16.2.1", "svgo": "^3.2.0", "swr": "^2.0.0", "typescript": "^5.2.2", diff --git a/spec/bin/oncall/email-deliveries_spec.rb b/spec/bin/oncall/email-deliveries_spec.rb index 136506978e4..3892c4de863 100644 --- a/spec/bin/oncall/email-deliveries_spec.rb +++ b/spec/bin/oncall/email-deliveries_spec.rb @@ -58,8 +58,8 @@ # rubocop:disable Layout/LineLength let(:events_log) do [ - { '@timestamp' => '2023-01-01 00:00:01', 'user_id' => 'abc123', 'email_action' => 'forgot_password', 'ses_message_id' => 'message-1' }, - { '@timestamp' => '2023-01-01 00:00:02', 'user_id' => 'def456', 'email_action' => 'forgot_password', 'ses_message_id' => 'message-2' }, + { '@timestamp' => '2023-01-01 00:00:01', 'user_id' => 'abc123', 'email_action' => 'forgot_password', 'ses_message_id' => 'message-1', 'email_address_id' => '1' }, + { '@timestamp' => '2023-01-01 00:00:02', 'user_id' => 'def456', 'email_action' => 'forgot_password', 'ses_message_id' => 'message-2', 'email_address_id' => '2' }, ] end @@ -80,9 +80,9 @@ expect(table).to eq( [ - ['user_id', 'timestamp', 'message_id', 'email_action', 'events'], - ['abc123', '2023-01-01 00:00:01', 'message-1', 'forgot_password', 'Send, Delivery'], - ['def456', '2023-01-01 00:00:02', 'message-2', 'forgot_password', + ['user_id', 'email_address_id', 'timestamp', 'message_id', 'email_action', 'events'], + ['abc123', '1', '2023-01-01 00:00:01', 'message-1', 'forgot_password', 'Send, Delivery'], + ['def456', '2', '2023-01-01 00:00:02', 'message-2', 'forgot_password', 'Send, Bounce-Transient-MailboxFull'], ], ) diff --git a/spec/controllers/concerns/billable_event_trackable_spec.rb b/spec/controllers/concerns/billable_event_trackable_spec.rb index f8cc8f9bc4b..a7ee097981e 100644 --- a/spec/controllers/concerns/billable_event_trackable_spec.rb +++ b/spec/controllers/concerns/billable_event_trackable_spec.rb @@ -9,7 +9,7 @@ :request_id, :user_session, :sp_session, - :sp_session_ial, + :resolved_authn_context_result, :session, ) do include BillableEventTrackable @@ -33,7 +33,7 @@ current_user:, request_id:, user_session: {}, - sp_session_ial: 1, + resolved_authn_context_result: double(identity_proofing?: false), sp_session: { issuer: current_sp.issuer, }, diff --git a/spec/controllers/frontend_log_controller_spec.rb b/spec/controllers/frontend_log_controller_spec.rb index 9ca398cedbb..35f4aed8324 100644 --- a/spec/controllers/frontend_log_controller_spec.rb +++ b/spec/controllers/frontend_log_controller_spec.rb @@ -206,6 +206,8 @@ end it 'notices the error to NewRelic instead of analytics logger' do + allow_any_instance_of(FrontendErrorForm).to receive(:submit). + and_return(FormResponse.new(success: true)) expect(fake_analytics).not_to receive(:track_event) expect(NewRelic::Agent).to receive(:notice_error).with( FrontendErrorLogger::FrontendError.new, diff --git a/spec/controllers/idv/image_uploads_controller_spec.rb b/spec/controllers/idv/image_uploads_controller_spec.rb index b47ac427b08..4a45e0ed0c8 100644 --- a/spec/controllers/idv/image_uploads_controller_spec.rb +++ b/spec/controllers/idv/image_uploads_controller_spec.rb @@ -461,6 +461,7 @@ transaction_reason_code: nil, transaction_status: nil, vendor: nil, + workflow: an_instance_of(String), ) expect(@analytics).to receive(:track_event).with( @@ -1218,6 +1219,7 @@ transaction_reason_code: nil, transaction_status: nil, vendor: nil, + workflow: an_instance_of(String), ) action diff --git a/spec/controllers/idv/personal_key_controller_spec.rb b/spec/controllers/idv/personal_key_controller_spec.rb index 93e919f8665..14b335d22b3 100644 --- a/spec/controllers/idv/personal_key_controller_spec.rb +++ b/spec/controllers/idv/personal_key_controller_spec.rb @@ -45,6 +45,8 @@ def assert_personal_key_generated_for_profiles(*profile_pii_pairs) let(:threatmetrix_review_status) { nil } + let(:pii_cacher) { Pii::Cacher.new(user, controller.user_session) } + before do stub_analytics stub_attempts_tracker @@ -190,6 +192,18 @@ def assert_personal_key_generated_for_profiles(*profile_pii_pairs) end describe '#show' do + context 'when we have no personal key or encrypted profiles in the session' do + it 'redirects to get the users password and fetch the PII' do + controller.idv_session.personal_key = nil + controller.user_session[:encrypted_profiles] = nil + + response = get :show + + expect(controller.user_session[:stored_location]).to eq(idv_personal_key_path) + expect(response).to redirect_to(capture_password_path) + end + end + context 'profile has been created from idv_session' do it 'does not redirect' do get :show @@ -215,8 +229,17 @@ def assert_personal_key_generated_for_profiles(*profile_pii_pairs) end context 'but a profile is pending from a different session' do + before { pii_cacher.save(password, pending_profile) } + context 'due to fraud review' do - let!(:pending_profile) { create(:profile, :fraud_review_pending, user: user) } + let!(:pending_profile) do + create( + :profile, + :fraud_review_pending, + :with_pii, + user: user, + ) + end it 'does not redirect' do get :show @@ -225,7 +248,14 @@ def assert_personal_key_generated_for_profiles(*profile_pii_pairs) end context 'due to in person proofing' do - let!(:pending_profile) { create(:profile, :in_person_verification_pending, user: user) } + let!(:pending_profile) do + create( + :profile, + :in_person_verification_pending, + :with_pii, + user: user, + ) + end it 'does not redirect' do get :show @@ -389,7 +419,7 @@ def assert_personal_key_generated_for_profiles(*profile_pii_pairs) describe '#update' do context 'user selected phone verification' do it 'redirects to sign up completed for an sp' do - subject.session[:sp] = { ial2: true } + subject.session[:sp] = { issuer: create(:service_provider).issuer } patch :update expect(response).to redirect_to sign_up_completed_url diff --git a/spec/controllers/idv_controller_spec.rb b/spec/controllers/idv_controller_spec.rb index 03cf1467c77..ca92d38cd8c 100644 --- a/spec/controllers/idv_controller_spec.rb +++ b/spec/controllers/idv_controller_spec.rb @@ -194,13 +194,13 @@ describe 'SP for IdV requirement' do let(:current_sp) { create(:service_provider) } - let(:ial) { 2 } + let(:acr_values) { Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF } let(:user) { build(:user, password: ControllerHelper::VALID_PASSWORD) } before do stub_sign_in(user) if current_sp.present? - session[:sp] = { issuer: current_sp.issuer, ial: ial } + session[:sp] = { issuer: current_sp.issuer, acr_values: acr_values } else session[:sp] = {} end @@ -237,7 +237,7 @@ end context 'with an SP context that does not require IdV' do - let(:ial) { 1 } + let(:acr_values) { Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF } context 'when an SP is required' do let(:idv_sp_required) { true } @@ -266,7 +266,7 @@ end context 'with an SP context that requires IdV' do - let(:ial) { 2 } + let(:acr_values) { Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF } context 'when an SP is required' do let(:idv_sp_required) { true } diff --git a/spec/controllers/sign_up/completions_controller_spec.rb b/spec/controllers/sign_up/completions_controller_spec.rb index bc6fe2fc3f4..17d953e9c5b 100644 --- a/spec/controllers/sign_up/completions_controller_spec.rb +++ b/spec/controllers/sign_up/completions_controller_spec.rb @@ -17,6 +17,7 @@ stub_sign_in(user) subject.session[:sp] = { issuer: current_sp.issuer, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, } get :show @@ -31,7 +32,7 @@ stub_sign_in(user) subject.session[:sp] = { issuer: current_sp.issuer, - ial2: false, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, requested_attributes: [:email], request_url: 'http://localhost:3000', } @@ -42,7 +43,7 @@ expect(@analytics).to have_received(:track_event).with( 'User registration: agency handoff visited', ial2: false, - ialmax: nil, + ialmax: false, service_provider_name: subject.decorated_sp_session.sp_name, page_occurence: '', needs_completion_screen_reason: :new_sp, @@ -67,7 +68,7 @@ stub_sign_in(user) subject.session[:sp] = { issuer: current_sp.issuer, - ial2: true, + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, requested_attributes: [:email], request_url: 'http://localhost:3000', } @@ -80,7 +81,7 @@ expect(@analytics).to have_received(:track_event).with( 'User registration: agency handoff visited', ial2: true, - ialmax: nil, + ialmax: false, service_provider_name: subject.decorated_sp_session.sp_name, page_occurence: '', needs_completion_screen_reason: :new_sp, @@ -141,8 +142,7 @@ stub_sign_in(user) subject.session[:sp] = { issuer: current_sp.issuer, - ial2: false, - ialmax: true, + acr_values: Saml::Idp::Constants::IALMAX_AUTHN_CONTEXT_CLASSREF, requested_attributes: [:email], request_url: 'http://localhost:3000', } @@ -218,10 +218,13 @@ user = create(:user) sp = create(:service_provider, issuer: 'https://awesome') stub_sign_in(user) - subject.session[:sp] = { issuer: sp.issuer, - ial2: false, - requested_attributes: [:email], - request_url: 'http://localhost:3000' } + subject.session[:sp] = { + issuer: sp.issuer, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, + requested_attributes: [:email], + request_url: 'http://localhost:3000', + } + get :show expect(response).to render_template(:show) @@ -245,7 +248,7 @@ it 'tracks analytics' do stub_sign_in(user) subject.session[:sp] = { - ial2: false, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, issuer: 'foo', request_url: 'http://example.com', } @@ -256,7 +259,7 @@ expect(@analytics).to have_received(:track_event).with( 'User registration: complete', ial2: false, - ialmax: nil, + ialmax: false, service_provider_name: subject.decorated_sp_session.sp_name, page_occurence: 'agency-page', needs_completion_screen_reason: :new_sp, @@ -271,7 +274,7 @@ stub_sign_in(user) subject.session[:sp] = { issuer: 'foo', - ial: 1, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, request_url: 'http://example.com', requested_attributes: ['email'], } @@ -290,7 +293,7 @@ it 'redirects to account page if the session request_url is removed' do stub_sign_in(user) subject.session[:sp] = { - ial2: false, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, issuer: 'foo', requested_attributes: ['email'], } @@ -306,7 +309,7 @@ DisposableEmailDomain.create(name: 'temporary.com') stub_sign_in(user) subject.session[:sp] = { - ial2: false, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, issuer: 'foo', request_url: 'http://example.com', } @@ -317,7 +320,7 @@ expect(@analytics).to have_received(:track_event).with( 'User registration: complete', ial2: false, - ialmax: nil, + ialmax: false, service_provider_name: subject.decorated_sp_session.sp_name, page_occurence: 'agency-page', needs_completion_screen_reason: :new_sp, @@ -343,7 +346,7 @@ sp = create(:service_provider, issuer: 'https://awesome') subject.session[:sp] = { issuer: sp.issuer, - ial2: true, + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, request_url: 'http://example.com', requested_attributes: ['email'], } @@ -354,7 +357,7 @@ expect(@analytics).to have_received(:track_event).with( 'User registration: complete', ial2: true, - ialmax: nil, + ialmax: false, service_provider_name: subject.decorated_sp_session.sp_name, page_occurence: 'agency-page', needs_completion_screen_reason: :new_sp, @@ -371,7 +374,7 @@ sp = create(:service_provider, issuer: 'https://awesome') subject.session[:sp] = { issuer: sp.issuer, - ial: 2, + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, request_url: 'http://example.com', requested_attributes: %w[email first_name verified_at], } @@ -395,12 +398,11 @@ sp = create(:service_provider, issuer: 'https://awesome') subject.session[:sp] = { issuer: sp.issuer, - ial: 2, + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, request_url: 'http://example.com', requested_attributes: %w[email first_name verified_at], } allow(@linker).to receive(:link_identity).with( - ial: 2, verified_attributes: %w[email first_name verified_at], last_consented_at: now, clear_deleted_at: true, @@ -425,9 +427,9 @@ xit 'does not log a reproofing event during initial proofing' do stub_sign_in(user) subject.session[:sp] = { - ial2: false, issuer: 'foo', request_url: 'http://example.com', + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, } patch :update end @@ -438,9 +440,9 @@ stub_sign_in(user) subject.session[:sp] = { - ial2: false, issuer: 'foo', request_url: 'http://example.com', + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, } expect(original_profile.activated_at).to be_present @@ -466,8 +468,8 @@ user.profiles.create(verified_at: Time.zone.now, active: true, activated_at: Time.zone.now) stub_sign_in(user) subject.session[:sp] = { - ial2: false, request_url: 'http://example.com', + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, } patch :update diff --git a/spec/controllers/users/personal_keys_controller_spec.rb b/spec/controllers/users/personal_keys_controller_spec.rb index 8064cd1d980..cb4d43c46b5 100644 --- a/spec/controllers/users/personal_keys_controller_spec.rb +++ b/spec/controllers/users/personal_keys_controller_spec.rb @@ -72,7 +72,10 @@ context 'user needs to reactive account' do it 'redirects to the sign up completed url for ial 1' do - controller.session[:sp] = { ial2: false } + controller.session[:sp] = { + issuer: create(:service_provider).issuer, + acr_values: Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF, + } user = create(:user, :fully_registered) create(:profile, :active, :verified, user: user, pii: { first_name: 'Jane' }) @@ -86,7 +89,10 @@ end it 'redirects to the reactivate account url for ial 2' do - controller.session[:sp] = { ial2: true } + controller.session[:sp] = { + issuer: create(:service_provider).issuer, + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, + } user = create(:user, :fully_registered) create(:profile, :active, :verified, user: user, pii: { first_name: 'Jane' }) diff --git a/spec/controllers/users/piv_cac_login_controller_spec.rb b/spec/controllers/users/piv_cac_login_controller_spec.rb index 3210a464570..220184e2027 100644 --- a/spec/controllers/users/piv_cac_login_controller_spec.rb +++ b/spec/controllers/users/piv_cac_login_controller_spec.rb @@ -44,7 +44,12 @@ context 'with a valid token' do let(:service_provider) { create(:service_provider) } - let(:sp_session) { { ial: 1, issuer: service_provider.issuer } } + let(:sp_session) do + { + acr_values: Saml::Idp::Constants::AAL2_AUTHN_CONTEXT_CLASSREF, + issuer: service_provider.issuer, + } + end let(:nonce) { SecureRandom.base64(20) } let(:data) do { @@ -175,7 +180,12 @@ end context 'ial2 service_level' do - let(:sp_session) { { ial: Idp::Constants::IAL2, issuer: service_provider.issuer } } + let(:sp_session) do + { + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, + issuer: service_provider.issuer, + } + end it 'redirects to account' do expect(response).to redirect_to(account_url) @@ -184,7 +194,10 @@ context 'ial_max service level' do let(:sp_session) do - { ial: Idp::Constants::IAL_MAX, issuer: service_provider.issuer } + { + acr_values: Saml::Idp::Constants::IALMAX_AUTHN_CONTEXT_CLASSREF, + issuer: service_provider.issuer, + } end it 'redirects to the after_sign_in_path_for' do @@ -203,7 +216,12 @@ end context 'ial2 service_level' do - let(:sp_session) { { ial: Idp::Constants::IAL2, issuer: service_provider.issuer } } + let(:sp_session) do + { + acr_values: Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF, + issuer: service_provider.issuer, + } + end it 'redirects to the capture_password_url' do expect(response).to redirect_to(capture_password_url) @@ -212,7 +230,10 @@ context 'ial_max service_level' do let(:sp_session) do - { ial: Idp::Constants::IAL_MAX, issuer: service_provider.issuer } + { + acr_values: Saml::Idp::Constants::IALMAX_AUTHN_CONTEXT_CLASSREF, + issuer: service_provider.issuer, + } end it 'redirects to the capture_password_url' do diff --git a/spec/controllers/users/sessions_controller_spec.rb b/spec/controllers/users/sessions_controller_spec.rb index cb740e54dfb..da59e990a77 100644 --- a/spec/controllers/users/sessions_controller_spec.rb +++ b/spec/controllers/users/sessions_controller_spec.rb @@ -43,7 +43,6 @@ it 'tracks the successful authentication for existing user' do user = create(:user, :fully_registered) - subject.session['user_return_to'] = mock_valid_site stub_analytics stub_attempts_tracker @@ -52,7 +51,6 @@ user_id: user.uuid, user_locked_out: false, bad_password_count: 0, - stored_location: mock_valid_site, sp_request_url_present: false, remember_device: false, } @@ -76,7 +74,6 @@ user_id: user.uuid, user_locked_out: false, bad_password_count: 1, - stored_location: nil, sp_request_url_present: false, remember_device: false, } @@ -96,7 +93,6 @@ user_id: 'anonymous-uuid', user_locked_out: false, bad_password_count: 1, - stored_location: nil, sp_request_url_present: false, remember_device: false, } @@ -135,7 +131,6 @@ user_id: user.uuid, user_locked_out: true, bad_password_count: 0, - stored_location: nil, sp_request_url_present: false, remember_device: false, } @@ -159,7 +154,6 @@ user_id: user.uuid, user_locked_out: false, bad_password_count: 2, - stored_location: nil, sp_request_url_present: false, remember_device: false, } @@ -178,7 +172,6 @@ user_id: 'anonymous-uuid', user_locked_out: false, bad_password_count: 1, - stored_location: nil, sp_request_url_present: true, remember_device: false, } @@ -253,7 +246,6 @@ user_id: user.uuid, user_locked_out: false, bad_password_count: 0, - stored_location: nil, sp_request_url_present: false, remember_device: false, } @@ -380,7 +372,6 @@ user_id: user.uuid, user_locked_out: false, bad_password_count: 0, - stored_location: nil, sp_request_url_present: false, remember_device: true, } @@ -406,7 +397,6 @@ user_id: user.uuid, user_locked_out: false, bad_password_count: 0, - stored_location: nil, sp_request_url_present: false, remember_device: true, } @@ -513,12 +503,10 @@ it 'tracks page visit, any alert flashes, and the Devise stored location' do stub_analytics allow(controller).to receive(:flash).and_return(alert: 'hello') - subject.session['user_return_to'] = mock_valid_site expect(@analytics).to receive(:track_event).with( 'Sign in page visited', flash: 'hello', - stored_location: mock_valid_site, ) get :new diff --git a/spec/features/idv/analytics_spec.rb b/spec/features/idv/analytics_spec.rb index 28c244165c4..ffa7aa1cf13 100644 --- a/spec/features/idv/analytics_spec.rb +++ b/spec/features/idv/analytics_spec.rb @@ -129,7 +129,7 @@ proofing_components: { document_check: 'mock', document_type: 'state_id', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' } }, 'IdV: personal key visited' => { - address_verification_method: 'phone', in_person_verification_pending: false, + address_verification_method: 'phone', encrypted_profiles_missing: false, in_person_verification_pending: false, proofing_components: { document_check: 'mock', document_type: 'state_id', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' } }, 'IdV: personal key acknowledgment toggled' => { @@ -237,7 +237,7 @@ proofing_components: { document_check: 'mock', document_type: 'state_id', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' } }, 'IdV: personal key visited' => { - address_verification_method: 'phone', in_person_verification_pending: false, + address_verification_method: 'phone', encrypted_profiles_missing: false, in_person_verification_pending: false, proofing_components: { document_check: 'mock', document_type: 'state_id', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' } }, 'IdV: personal key acknowledgment toggled' => { @@ -448,7 +448,9 @@ }, 'IdV: personal key visited' => { in_person_verification_pending: true, - proofing_components: { document_check: 'usps', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' }, address_verification_method: 'phone' + address_verification_method: 'phone', + encrypted_profiles_missing: false, + proofing_components: { document_check: 'usps', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' }, }, 'IdV: personal key acknowledgment toggled' => { checked: true, @@ -563,7 +565,7 @@ proofing_components: { document_check: 'mock', document_type: 'state_id', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' } }, 'IdV: personal key visited' => { - address_verification_method: 'phone', in_person_verification_pending: false, + address_verification_method: 'phone', in_person_verification_pending: false, encrypted_profiles_missing: false, proofing_components: { document_check: 'mock', document_type: 'state_id', source_check: 'aamva', resolution_check: 'lexis_nexis', threatmetrix: threatmetrix, threatmetrix_review_status: 'pass', address_check: 'lexis_nexis_address' } }, 'IdV: personal key acknowledgment toggled' => { diff --git a/spec/forms/frontend_error_form_spec.rb b/spec/forms/frontend_error_form_spec.rb new file mode 100644 index 00000000000..d800d1fe0df --- /dev/null +++ b/spec/forms/frontend_error_form_spec.rb @@ -0,0 +1,69 @@ +require 'rails_helper' + +RSpec.describe FrontendErrorForm do + let(:filename) { 'https://example.com/foo.js' } + + subject(:form) { described_class.new } + + before do + allow(IdentityConfig.store).to receive(:domain_name).and_return('example.com') + end + + describe '#submit' do + subject(:result) { form.submit(filename:) } + + context 'with valid filename' do + let(:filename) { 'https://example.com/foo.js' } + + it 'is successful' do + expect(result.success?).to eq(true) + expect(result.errors).to eq({}) + end + end + + context 'without filename' do + let(:filename) { nil } + + it 'is unsuccessful' do + expect(result.success?).to eq(false) + expect(result.errors).to eq(filename: [t('errors.general'), t('errors.general')]) + end + end + + context 'with filename without extension' do + let(:filename) { 'https://example.com/foo' } + + it 'is unsuccessful' do + expect(result.success?).to eq(false) + expect(result.errors).to eq(filename: [t('errors.general')]) + end + end + + context 'with filename having extension other than js' do + let(:filename) { 'https://example.com/foo.txt' } + + it 'is unsuccessful' do + expect(result.success?).to eq(false) + expect(result.errors).to eq(filename: [t('errors.general')]) + end + end + + context 'with filename from a different host' do + let(:filename) { 'https://wrong.example.com/foo.js' } + + it 'is unsuccessful' do + expect(result.success?).to eq(false) + expect(result.errors).to eq(filename: [t('errors.general')]) + end + end + + context 'with filename that cannot be parsed as url' do + let(:filename) { '{' } + + it 'is unsuccessful' do + expect(result.success?).to eq(false) + expect(result.errors).to eq(filename: [t('errors.general'), t('errors.general')]) + end + end + end +end diff --git a/spec/forms/idv/api_image_upload_form_spec.rb b/spec/forms/idv/api_image_upload_form_spec.rb index 4df0335f9ed..74fe6d69902 100644 --- a/spec/forms/idv/api_image_upload_form_spec.rb +++ b/spec/forms/idv/api_image_upload_form_spec.rb @@ -184,6 +184,7 @@ vendor: nil, transaction_status: nil, transaction_reason_code: nil, + workflow: 'test_non_liveness_workflow', ) end @@ -299,6 +300,7 @@ vendor: nil, transaction_status: nil, transaction_reason_code: nil, + workflow: 'test_liveness_workflow', ) end diff --git a/spec/forms/openid_connect_authorize_form_spec.rb b/spec/forms/openid_connect_authorize_form_spec.rb index 3b8128759e0..38fd71ba28e 100644 --- a/spec/forms/openid_connect_authorize_form_spec.rb +++ b/spec/forms/openid_connect_authorize_form_spec.rb @@ -831,6 +831,8 @@ expect(identity.code_challenge).to eq(code_challenge) expect(identity.nonce).to eq(nonce) expect(identity.ial).to eq(1) + expect(identity.acr_values).to eq '' + expect(identity.vtr).to eq ['C1'].to_json end end end diff --git a/spec/lib/cleanup/destroyable_records_spec.rb b/spec/lib/cleanup/destroyable_records_spec.rb index 269379bf495..752430df2ef 100644 --- a/spec/lib/cleanup/destroyable_records_spec.rb +++ b/spec/lib/cleanup/destroyable_records_spec.rb @@ -106,16 +106,27 @@ expect(iaa_order.integrations.include? integration).to be false end - describe 'integration without usages or iaa_orders' do - let!(:empty_integration) { create(:integration) } - let!(:service_provider) { empty_integration.service_provider } + context 'integration without integration usages' do + # int factory has no usages by default + let!(:integration) { create(:integration) } + let!(:service_provider) { integration.service_provider } it 'destroys the integration' do - deleted_int = Agreements::Integration.find_by(id: empty_integration.id) + deleted_int = Agreements::Integration.find_by(id: integration.id) expect(deleted_int).to be nil end end + context 'no integration' do + # sp factory has no integrations by default + let!(:service_provider) { create(:service_provider) } + + it 'destroys the service provider' do + deleted_sp = ServiceProvider.find_by(id: service_provider.id) + expect(deleted_sp).to be nil + end + end + it 'does not delete unrelated objects' do iu2.reload iaa_order.reload diff --git a/spec/presenters/saml_request_presenter_spec.rb b/spec/presenters/saml_request_presenter_spec.rb index 3517308d1fa..1db55365b71 100644 --- a/spec/presenters/saml_request_presenter_spec.rb +++ b/spec/presenters/saml_request_presenter_spec.rb @@ -21,6 +21,11 @@ phone address1 address2 city state zipcode foo ] service_provider = ServiceProvider.new(attribute_bundle: all_attributes) + allow(request).to receive( + :service_provider, + ).and_return( + double(identifier: service_provider.issuer), + ) presenter = SamlRequestPresenter.new(request: request, service_provider: service_provider) expect(presenter.requested_attributes).to eq(%i[email all_emails verified_at]) @@ -43,6 +48,11 @@ sp_attributes = %w[email first_name last_name ssn zipcode] service_provider = ServiceProvider.new(attribute_bundle: sp_attributes, ial: 2) + allow(request).to receive( + :service_provider, + ).and_return( + double(identifier: service_provider.issuer), + ) presenter = SamlRequestPresenter.new(request: request, service_provider: service_provider) expect(presenter.requested_attributes).to eq( @@ -67,6 +77,11 @@ sp_attributes = %w[email first_name last_name ssn zipcode all_emails] service_provider = ServiceProvider.new(attribute_bundle: sp_attributes, ial: 1) + allow(request).to receive( + :service_provider, + ).and_return( + double(identifier: service_provider.issuer), + ) presenter = SamlRequestPresenter.new(request: request, service_provider: service_provider) expect(presenter.requested_attributes).to eq(%i[email all_emails]) @@ -86,6 +101,11 @@ email first_name last_name dob foo ssn phone verified_at ], ) + allow(request).to receive( + :service_provider, + ).and_return( + double(identifier: service_provider.issuer), + ) presenter = SamlRequestPresenter.new(request: request, service_provider: service_provider) valid_attributes = %i[ email given_name family_name birthdate social_security_number phone verified_at @@ -106,6 +126,11 @@ service_provider = ServiceProvider.new( attribute_bundle: %w[address1 address2 city state zipcode], ) + allow(request).to receive( + :service_provider, + ).and_return( + double(identifier: service_provider.issuer), + ) presenter = SamlRequestPresenter.new(request: request, service_provider: service_provider) expect(presenter.requested_attributes).to eq([:address]) diff --git a/spec/services/attribute_asserter_spec.rb b/spec/services/attribute_asserter_spec.rb index 60eca6b7f96..f991fe6d162 100644 --- a/spec/services/attribute_asserter_spec.rb +++ b/spec/services/attribute_asserter_spec.rb @@ -544,9 +544,14 @@ expected_ial = Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF expect(user.asserted_attributes[:ial][:getter].call(user)).to eq expected_ial end + + it 'does not include proofed attributes' do + expect(user.asserted_attributes[:first_name]).to eq(nil) + expect(user.asserted_attributes[:phone]).to eq(nil) + end end - context 'service provider requests IALMAX with IAL2 user' do + context 'IAL2 service provider requests IALMAX with IAL2 user' do let(:service_provider_ial) { 2 } let(:subject) do described_class.new( @@ -563,6 +568,7 @@ user.identities << identity allow(service_provider.metadata).to receive(:[]).with(:attribute_bundle). and_return(%w[email phone first_name]) + ServiceProvider.find_by(issuer: sp1_issuer).update!(ial: 2) subject.build end @@ -574,6 +580,47 @@ expected_ial = Saml::Idp::Constants::IAL2_AUTHN_CONTEXT_CLASSREF expect(user.asserted_attributes[:ial][:getter].call(user)).to eq expected_ial end + + it 'includes proofed attributes' do + expect(user.asserted_attributes[:first_name][:getter].call(user)).to eq('Jåné') + expect(user.asserted_attributes[:phone][:getter].call(user)).to eq('+18888675309') + end + end + end + + context 'non-IAL2 service provider requests IALMAX with IAL2 user' do + let(:service_provider_ial) { 1 } + let(:subject) do + described_class.new( + user: user, + name_id_format: name_id_format, + service_provider: service_provider, + authn_request: ialmax_authn_request, + decrypted_pii: decrypted_pii, + user_session: user_session, + ) + end + + before do + user.identities << identity + allow(service_provider.metadata).to receive(:[]).with(:attribute_bundle). + and_return(%w[email phone first_name]) + ServiceProvider.find_by(issuer: sp1_issuer).update!(ial: 1) + subject.build + end + + it 'includes ial' do + expect(user.asserted_attributes.keys).to include(:ial) + end + + it 'creates a getter function for ial attribute' do + expected_ial = Saml::Idp::Constants::IAL1_AUTHN_CONTEXT_CLASSREF + expect(user.asserted_attributes[:ial][:getter].call(user)).to eq expected_ial + end + + it 'includes proofed attributes' do + expect(user.asserted_attributes[:first_name]).to eq(nil) + expect(user.asserted_attributes[:phone]).to eq(nil) end end diff --git a/spec/services/doc_auth/lexis_nexis/requests/true_id_request_spec.rb b/spec/services/doc_auth/lexis_nexis/requests/true_id_request_spec.rb index 56f97ea60e3..2bc01966414 100644 --- a/spec/services/doc_auth/lexis_nexis/requests/true_id_request_spec.rb +++ b/spec/services/doc_auth/lexis_nexis/requests/true_id_request_spec.rb @@ -219,6 +219,13 @@ def include_liveness_expected expect(response.network_error?).to eq(true) end end + describe '#request_context' do + it 'returns needed information including workflow' do + expect(subject.request_context).to include( + workflow: an_instance_of(String), + ) + end + end end def response_body(include_liveness) diff --git a/spec/services/doc_auth/lexis_nexis/responses/true_id_response_spec.rb b/spec/services/doc_auth/lexis_nexis/responses/true_id_response_spec.rb index bc20b791e96..382015c3b32 100644 --- a/spec/services/doc_auth/lexis_nexis/responses/true_id_response_spec.rb +++ b/spec/services/doc_auth/lexis_nexis/responses/true_id_response_spec.rb @@ -50,9 +50,17 @@ let(:config) do DocAuth::LexisNexis::Config.new end - + let(:liveness_enabled) { false } + let(:workflow) { 'default_workflow' } + let(:request_context) do + { + workflow: workflow, + } + end context 'when the response is a success' do - let(:response) { described_class.new(success_response, config) } + let(:response) do + described_class.new(success_response, config, liveness_enabled, request_context) + end it 'is a successful result' do expect(response.successful_result?).to eq(true) @@ -65,6 +73,8 @@ extra_attributes = response.extra_attributes expect(extra_attributes).not_to be_empty expect(extra_attributes[:classification_info]).to include(:Front, :Back) + expect(extra_attributes).to have_key(:workflow) + expect(extra_attributes).to have_key(:reference) end it 'has PII data' do # This is the minimum expected by doc_pii_form in the core IDP @@ -141,6 +151,7 @@ selfie_live: true, selfie_quality_good: true, liveness_enabled: false, + workflow: anything, ) passed_alerts = response_hash.dig(:processed_alerts, :passed) passed_alerts.each do |alert| @@ -329,7 +340,10 @@ def get_decision_product(resp) end it 'produces expected hash output' do - output = described_class.new(failure_response_with_all_failures, config).to_h + output = described_class.new( + failure_response_with_all_failures, config, liveness_enabled, + request_context + ).to_h expect(output).to match( success: false, @@ -385,6 +399,7 @@ def get_decision_product(resp) selfie_live: true, selfie_quality_good: false, liveness_enabled: false, + workflow: anything, ) end it 'produces appropriate errors with document tampering' do @@ -422,7 +437,10 @@ def get_decision_product(resp) end it 'produces reasonable output for a TrueID failure without details' do - output = described_class.new(failure_response_empty, config).to_h + output = described_class.new( + failure_response_empty, config, liveness_enabled, + request_context + ).to_h expect(output[:success]).to eq(false) expect(output[:errors]).to eq( @@ -431,15 +449,20 @@ def get_decision_product(resp) ) expect(output).to include(:lexis_nexis_status, :lexis_nexis_info, :exception) expect(output[:vendor]).to eq('TrueID') + expect(output[:reference]).to match(a_kind_of(String)) end it 'produces reasonable output for a malformed TrueID response' do allow(NewRelic::Agent).to receive(:notice_error) - output = described_class.new(failure_response_malformed, config).to_h + output = described_class.new( + failure_response_malformed, config, liveness_enabled, + request_context + ).to_h expect(output[:success]).to eq(false) expect(output[:errors]).to eq(network: true) expect(output).to include(:backtrace) + expect(output[:reference]).to be_truthy end it 'is not billed' do @@ -677,10 +700,20 @@ def get_decision_product(resp) context 'when selfie check is enabled' do context 'whe missing selfie result in response' do - let(:response) { described_class.new(success_response, config, true) } + let(:request_context) do + { + workflow: 'selfie_workflow', + } + end + let(:response) { described_class.new(success_response, config, true, request_context) } it 'returns :not_processed when missing selfie in response' do expect(response.selfie_status).to eq(:not_processed) end + it 'includes workflow in extra_attributes' do + expect(response.extra_attributes).to include( + workflow: 'selfie_workflow', + ) + end end context 'when selfie passed' do let(:response) { described_class.new(success_with_liveness_response, config, true) } diff --git a/spec/services/doc_auth/mock/result_response_spec.rb b/spec/services/doc_auth/mock/result_response_spec.rb index 15ca9496f72..5a731eb2201 100644 --- a/spec/services/doc_auth/mock/result_response_spec.rb +++ b/spec/services/doc_auth/mock/result_response_spec.rb @@ -303,6 +303,7 @@ doc_auth_result: DocAuth::Acuant::ResultCodes::PASSED.name, billed: true, classification_info: {}, + workflow: 'test_non_liveness_workflow', liveness_checking_required: false, ) expect(response.doc_auth_success?).to eq(true) @@ -334,6 +335,7 @@ billed: true, classification_info: {}, liveness_checking_required: false, + workflow: 'test_non_liveness_workflow', ) end end @@ -360,6 +362,7 @@ billed: true, classification_info: {}, liveness_checking_required: false, + workflow: 'test_non_liveness_workflow', ) end end @@ -407,6 +410,7 @@ billed: true, classification_info: {}, liveness_checking_required: false, + workflow: 'test_non_liveness_workflow', ) end end diff --git a/spec/services/frontend_error_logger_spec.rb b/spec/services/frontend_error_logger_spec.rb index 33c570b5ce3..7f1922e35eb 100644 --- a/spec/services/frontend_error_logger_spec.rb +++ b/spec/services/frontend_error_logger_spec.rb @@ -1,6 +1,13 @@ require 'rails_helper' RSpec.describe FrontendErrorLogger do + let(:valid) { true } + + before do + allow_any_instance_of(FrontendErrorForm).to receive(:submit). + and_return(FormResponse.new(success: valid)) + end + describe '.track_event' do it 'notices an expected error to NewRelic with custom parameters' do expect(NewRelic::Agent).to receive(:notice_error).with( @@ -11,7 +18,7 @@ name: 'name', message: 'message', stack: 'stack', - filename: 'filename', + filename: 'filename.js', }, }, ) @@ -20,8 +27,23 @@ name: 'name', message: 'message', stack: 'stack', - filename: 'filename', + filename: 'filename.js', ) end + + context 'with unsuccessful validation of request parameters' do + let(:valid) { false } + + it 'does not notice an error' do + expect(NewRelic::Agent).not_to receive(:notice_error) + + FrontendErrorLogger.track_error( + name: 'name', + message: 'message', + stack: 'stack', + filename: 'filename.js', + ) + end + end end end diff --git a/spec/services/ial_context_spec.rb b/spec/services/ial_context_spec.rb index b90564c4e91..9d379376b8d 100644 --- a/spec/services/ial_context_spec.rb +++ b/spec/services/ial_context_spec.rb @@ -10,14 +10,12 @@ ) end let(:user) { nil } - let(:authn_context_comparison) { nil } subject(:ial_context) do IalContext.new( ial: ial, service_provider: service_provider, user: user, - authn_context_comparison: authn_context_comparison, ) end @@ -120,27 +118,6 @@ it { expect(ial_context.ialmax_requested?).to eq(true) } end - context 'when ial 1 is requested without Comparison=minimum and ial 2 SP' do - let(:ial) { Idp::Constants::IAL1 } - let(:authn_context_comparison) { 'exact' } - let(:sp_ial) { 2 } - it { expect(ial_context.ialmax_requested?).to eq(false) } - end - - context 'when ial 1 is requested with Comparison=minimum and ial 2 SP' do - let(:ial) { Idp::Constants::IAL1 } - let(:authn_context_comparison) { 'minimum' } - let(:sp_ial) { 2 } - it { expect(ial_context.ialmax_requested?).to eq(true) } - end - - context 'when ial 1 is requested with Comparison=minimum and ial 1 SP' do - let(:ial) { Idp::Constants::IAL1 } - let(:authn_context_comparison) { 'minimum' } - let(:sp_ial) { 1 } - it { expect(ial_context.ialmax_requested?).to eq(false) } - end - context 'when ial 2 is requested' do let(:ial) { Idp::Constants::IAL2 } it { expect(ial_context.ialmax_requested?).to eq(false) } diff --git a/spec/services/identity_linker_spec.rb b/spec/services/identity_linker_spec.rb index 9e50e8e2211..99f1922f395 100644 --- a/spec/services/identity_linker_spec.rb +++ b/spec/services/identity_linker_spec.rb @@ -30,6 +30,8 @@ rails_session_id = SecureRandom.hex nonce = SecureRandom.hex ial = 3 + acr_values = 'http://idmanagement.gov/ns/assurance/aal/1' + vtr = ['C2.Pb'].to_json scope = 'openid profile email' code_challenge = SecureRandom.hex verified_attributes = %w[address email] @@ -38,6 +40,8 @@ rails_session_id: rails_session_id, nonce: nonce, ial: ial, + acr_values: acr_values, + vtr: vtr, scope: scope, code_challenge: code_challenge, verified_attributes: verified_attributes.map(&:to_sym), @@ -48,6 +52,8 @@ expect(last_identity.nonce).to eq(nonce) expect(last_identity.rails_session_id).to eq(rails_session_id) expect(last_identity.ial).to eq(ial) + expect(last_identity.acr_values).to eq(acr_values) + expect(last_identity.vtr).to eq(vtr) expect(last_identity.scope).to eq(scope) expect(last_identity.code_challenge).to eq(code_challenge) expect(last_identity.verified_attributes).to eq(verified_attributes) diff --git a/spec/support/features/session_helper.rb b/spec/support/features/session_helper.rb index 70f3ba3a267..782e14e00fc 100644 --- a/spec/support/features/session_helper.rb +++ b/spec/support/features/session_helper.rb @@ -148,20 +148,6 @@ def sign_up_with_backup_codes user end - def begin_sign_up_with_sp_and_ial(ial2:) - user = create(:user) - login_as(user, scope: :user, run_callbacks: false) - - Warden.on_next_request do |proxy| - session = proxy.env['rack.session'] - sp = ServiceProvider.find_by(issuer: 'http://localhost:3000') - session[:sp] = { ial2: ial2, issuer: sp.issuer, request_id: '123' } - end - - visit account_path - user - end - def sign_up_and_set_password user = sign_up user.password = VALID_PASSWORD @@ -370,25 +356,6 @@ def enter_personal_key(personal_key:, selector: 'input[type="text"]') field.set(personal_key) end - def ial1_sp_session - Warden.on_next_request do |proxy| - session = proxy.env['rack.session'] - sp = ServiceProvider.find_by(issuer: 'http://localhost:3000') - session[:sp] = { - ial2: false, - issuer: sp.issuer, - requested_attributes: [:email], - } - end - end - - def ial2_sp_session(request_url: 'http://localhost:3000') - Warden.on_next_request do |proxy| - session = proxy.env['rack.session'] - session[:sp] = { ial2: true, request_url: request_url } - end - end - def cookies page.driver.browser.rack_mock_session.cookie_jar.instance_variable_get(:@cookies) end diff --git a/spec/support/shared_examples/password_strength.rb b/spec/support/shared_examples/password_strength.rb index 288b261d5d0..311d44f0bd5 100644 --- a/spec/support/shared_examples/password_strength.rb +++ b/spec/support/shared_examples/password_strength.rb @@ -42,13 +42,11 @@ expect(result.extra).to include(user_id: '123') if result.extra.present? end - # This test is disabled for now because zxcvbn doesn't support this - # feature yet. See: https://github.com/dropbox/zxcvbn/issues/227 - xit 'does not allow a password containing words from the user email' do - user = build_stubbed(:user, email: 'janedoe@gmail.com', uuid: '123') + it 'does not allow a password equal to a word from the user email' do + user = build_stubbed(:user, email: 'janedoelongname@example.com', uuid: '123') allow(user).to receive(:reset_password_period_valid?).and_return(true) form = form_class.constantize.new(user) - password = 'janedoe gmail' + password = 'janedoelongname' errors = { password: ['Your password is not strong enough.' \ ' Add another word or two.' \ diff --git a/yarn.lock b/yarn.lock index 16b74664e85..6313b6499fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1031,25 +1031,39 @@ resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.3.3.tgz#814562a5db0233a1ececda97b930c2dde5897de8" integrity sha512-AoHSiIpTFF97SQgmQni4c+Tyr0CDhkaRaR2qGEJTEbauqQwLRpLrd9yVv//wVHOSxr/b4FJcL54VchhY6710xA== -"@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== +"@bundled-es-modules/cookie@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz#c3b82703969a61cf6a46e959a012b2c257f6b164" + integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw== + dependencies: + cookie "^0.5.0" -"@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== +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" -"@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/css-parser-algorithms@^2.5.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz#b45d3c7cbdd4214261724c82f96e33c746fedd58" + integrity sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ== -"@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== +"@csstools/css-tokenizer@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz#b099d543ea57b64f495915a095ead583866c50c6" + integrity sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg== + +"@csstools/media-query-list-parser@^2.1.7": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.8.tgz#36157fbe54ea30d5f2b1767c69fcdf92048a7b1d" + integrity sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g== + +"@csstools/selector-specificity@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz#ea61ba7bb24be3502c6aaa3190ed231f4633a81e" + integrity sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg== "@discoveryjs/json-ext@^0.5.0": version "0.5.6" @@ -1107,6 +1121,51 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@inquirer/confirm@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.0.0.tgz#6e1e35d18675fe659752d11021f9fddf547950b7" + integrity sha512-LHeuYP1D8NmQra1eR4UqvZMXwxEdDXyElJmmZfU44xdNLL6+GcQBS0uE16vyfZVjH8c22p9e+DStROfE/hyHrg== + dependencies: + "@inquirer/core" "^7.0.0" + "@inquirer/type" "^1.2.0" + +"@inquirer/core@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-7.0.0.tgz#18d2d2bb5cc6858765b4dcf3dce544ad15898e81" + integrity sha512-g13W5yEt9r1sEVVriffJqQ8GWy94OnfxLCreNSOTw0HPVcszmc/If1KIf7YBmlwtX4klmvwpZHnQpl3N7VX2xA== + dependencies: + "@inquirer/type" "^1.2.0" + "@types/mute-stream" "^0.0.4" + "@types/node" "^20.11.16" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + figures "^3.2.0" + mute-stream "^1.0.0" + run-async "^3.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + +"@inquirer/type@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.2.0.tgz#a569613628a881c2104289ca868a7def54e5c49d" + integrity sha512-/vvkUkYhrjbm+RolU7V1aUFDydZVKNKqKHR5TsE+j5DXgXFwrsOPcoGUJ02K0O7q7O53CU2DOTMYCHeGZ25WHA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -1163,27 +1222,22 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@mswjs/cookies@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" - integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== - dependencies: - "@types/set-cookie-parser" "^2.4.0" - set-cookie-parser "^2.4.6" - -"@mswjs/interceptors@^0.17.10": - version "0.17.10" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" - integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== - dependencies: - "@open-draft/until" "^1.0.3" - "@types/debug" "^4.1.7" - "@xmldom/xmldom" "^0.8.3" - debug "^4.3.3" - headers-polyfill "3.2.5" +"@mswjs/cookies@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-1.1.0.tgz#1528eb43630caf83a1d75d5332b30e75e9bb1b5b" + integrity sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw== + +"@mswjs/interceptors@^0.25.16": + version "0.25.16" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.25.16.tgz#7955fbb8da479bc691df117dd4c8d889e507ecc2" + integrity sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" outvariant "^1.2.1" - strict-event-emitter "^0.2.4" - web-encoding "^1.1.5" + strict-event-emitter "^0.5.1" "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -1211,10 +1265,28 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@open-draft/until@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" - integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@pkgr/utils@^2.3.1": version "2.4.2" @@ -1369,17 +1441,10 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/dirty-chai@^2.0.2": version "2.0.2" @@ -1485,11 +1550,6 @@ dependencies: "@types/sizzle" "*" -"@types/js-levenshtein@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz#ba05426a43f9e4e30b631941e0aa17bf0c890ed5" - integrity sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g== - "@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.13" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" @@ -1510,20 +1570,17 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== -"@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== - "@types/mocha@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.0.tgz#3d9018c575f0e3f7386c1de80ee66cc21fbb7a52" integrity sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg== -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" "@types/node-forge@^1.3.0": version "1.3.11" @@ -1532,15 +1589,12 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^20.2.5": - version "20.2.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" - integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/node@*", "@types/node@^20.11.16", "@types/node@^20.2.5": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + dependencies: + undici-types "~5.26.4" "@types/prop-types@*": version "15.7.3" @@ -1619,13 +1673,6 @@ "@types/mime" "*" "@types/node" "*" -"@types/set-cookie-parser@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz#b6a955219b54151bfebd4521170723df5e13caad" - integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== - dependencies: - "@types/node" "*" - "@types/sinon-chai@^3.2.8": version "3.2.8" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" @@ -1658,6 +1705,11 @@ dependencies: "@types/node" "*" +"@types/statuses@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.4.tgz#041143ba4a918e8f080f8b0ffbe3d4cb514e2315" + integrity sha512-eqNDvZsCNY49OAXB0Firg/Sc2BgoWsntsLUdybGFOhAfCD6QJ2n9HXUIHGqt5qjrxmMv4wS8WLAw43ZkKcJ8Pw== + "@types/testing-library__react-hooks@^3.4.0": version "3.4.1" resolved "https://registry.yarnpkg.com/@types/testing-library__react-hooks/-/testing-library__react-hooks-3.4.1.tgz#b8d7311c6c1f7db3103e94095fe901f8fef6e433" @@ -1665,6 +1717,11 @@ dependencies: "@types/react-test-renderer" "*" +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/ws@^8.5.5": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -1975,11 +2032,6 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== -"@xmldom/xmldom@^0.8.3": - version "0.8.6" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" - integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -1990,11 +2042,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2074,7 +2121,7 @@ ansi-colors@4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1: +ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2091,6 +2138,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2110,6 +2162,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2185,11 +2242,6 @@ array.prototype.flatmap@^1.3.0, array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -2282,11 +2334,6 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -2302,15 +2349,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -2396,14 +2434,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bundle-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" @@ -2434,17 +2464,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -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 "^6.3.0" - map-obj "^4.1.0" - quick-lru "^5.1.1" - type-fest "^1.2.1" - -camelcase@^6.0.0, camelcase@^6.3.0: +camelcase@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -2483,7 +2503,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2491,11 +2511,6 @@ chalk@^4.0, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - check-error@^1.0.2, check-error@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" @@ -2503,7 +2518,7 @@ check-error@^1.0.2, check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -2518,6 +2533,21 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.4.0, chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -2533,22 +2563,15 @@ cleave.js@^1.6.0: resolved "https://registry.yarnpkg.com/cleave.js/-/cleave.js-1.6.0.tgz#0e4e011943bdd70c67c9dcf4ff800ce710529171" integrity sha512-ivqesy3j5hQVG3gywPfwKPbi/7ZSftY/UNp5uphnqjr25yI2CP8FS2ODQPzuLXXnNLi29e2+PgPkkiKUXLs/Nw== -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" +cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== -cli-spinners@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== clipboard-polyfill@^3.0.3: version "3.0.3" @@ -2582,11 +2605,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2725,16 +2743,11 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: +cookie@0.5.0, cookie@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.21.0: version "3.31.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" @@ -2757,17 +2770,17 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -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== +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: - import-fresh "^3.2.1" + env-paths "^2.2.1" + import-fresh "^3.3.0" js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" + parse-json "^5.2.0" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.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" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2776,10 +2789,10 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-functions-list@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b" - integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== +css-functions-list@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" + integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== css-select@^5.1.0: version "5.1.0" @@ -2865,7 +2878,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2879,29 +2892,11 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - decamelize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -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== - decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -2949,13 +2944,6 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -3089,6 +3077,11 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.3" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3132,6 +3125,11 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + envinfo@^7.7.3: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" @@ -3483,7 +3481,7 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0, events@^3.3.0: +events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -3555,15 +3553,6 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3574,10 +3563,10 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -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== +fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3614,7 +3603,7 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -figures@^3.0.0: +figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -3628,6 +3617,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3697,15 +3693,24 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.0.tgz#d12437636f83bb8a12b8f300c36fd1614e1c7224" + integrity sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + rimraf "^5.0.5" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== +flatted@^3.1.0, flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== focus-trap@^6.7.1: version "6.7.1" @@ -3726,6 +3731,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3858,6 +3871,17 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.1.3, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -3949,11 +3973,6 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -4012,17 +4031,10 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -headers-polyfill@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" - integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== - -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" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" +headers-polyfill@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.2.tgz#9115a76eee3ce8fbf95b6e3c6bf82d936785b44a" + integrity sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw== hpack.js@^2.1.6: version "2.1.6" @@ -4129,7 +4141,7 @@ human-signals@^4.3.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4143,22 +4155,17 @@ iconv-lite@0.6.3, iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -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== +ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== immutable@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -4166,11 +4173,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -4184,11 +4186,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -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" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4197,7 +4194,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4212,27 +4209,6 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^8.2.0: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -4262,14 +4238,6 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -4311,7 +4279,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.2.0, is-core-module@^2.5.0: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.2.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== @@ -4345,13 +4313,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4366,11 +4327,6 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -4398,11 +4354,6 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -4469,7 +4420,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -4519,6 +4470,15 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -4528,11 +4488,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4584,6 +4539,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -4634,16 +4594,18 @@ keyboardevent-key-polyfill@^1.0.2: resolved "https://registry.yarnpkg.com/keyboardevent-key-polyfill/-/keyboardevent-key-polyfill-1.1.0.tgz#8a319d8e45a13172fca56286372f90c1d4c7014c" integrity sha512-NTDqo7XhzL1fqmUzYroiyK2qGua7sOMzLav35BfNA/mPUSCtw8pZghHFMTYR9JdnJ23IQz695FcaM6EE6bpbFQ== -kind-of@^6.0.2, kind-of@^6.0.3: +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -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== - 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" @@ -4813,7 +4775,7 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0, log-symbols@^4.1.0: +log-symbols@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -4849,6 +4811,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -4869,16 +4836,6 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -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== - matches-selector@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/matches-selector/-/matches-selector-1.2.0.tgz#d1814e7e8f43e69d22ac33c9af727dc884ecf12a" @@ -4911,23 +4868,10 @@ memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" -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.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.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" +meow@^13.1.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== merge-descriptors@1.0.1: version "1.0.1" @@ -4984,11 +4928,6 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== -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== - minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -5008,20 +4947,23 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" + brace-expansion "^2.0.1" minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + mocha@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" @@ -5070,30 +5012,28 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msw@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.2.tgz#35e0271293e893fc3c55116e90aad5d955c66899" - integrity sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA== - dependencies: - "@mswjs/cookies" "^0.2.2" - "@mswjs/interceptors" "^0.17.10" - "@open-draft/until" "^1.0.3" - "@types/cookie" "^0.4.1" - "@types/js-levenshtein" "^1.1.1" - chalk "^4.1.1" - chokidar "^3.4.2" - cookie "^0.4.2" +msw@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.2.1.tgz#5ece7ee81331aabe632fe331f07e71e8a3949499" + integrity sha512-DCsZAQwan+2onEcpD86fiEnCKW4IvYzqcwDq/2TIoeNrmBqNp/mJW4wHQyxcoYrRPwgujin7wDFflqiSO1iT/w== + dependencies: + "@bundled-es-modules/cookie" "^2.0.0" + "@bundled-es-modules/statuses" "^1.0.1" + "@inquirer/confirm" "^3.0.0" + "@mswjs/cookies" "^1.1.0" + "@mswjs/interceptors" "^0.25.16" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + chalk "^4.1.2" graphql "^16.8.1" - headers-polyfill "3.2.5" - inquirer "^8.2.0" + headers-polyfill "^4.0.2" is-node-process "^1.2.0" - js-levenshtein "^1.1.6" - node-fetch "^2.6.7" - outvariant "^1.4.0" + outvariant "^1.4.2" path-to-regexp "^6.2.0" - strict-event-emitter "^0.4.3" - type-fest "^2.19.0" - yargs "^17.3.1" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" multicast-dns@^7.2.5: version "7.2.5" @@ -5103,10 +5043,10 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nanoid@3.3.3: version "3.3.3" @@ -5114,9 +5054,9 @@ nanoid@3.3.3: integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 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== + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" @@ -5144,13 +5084,6 @@ nise@^5.1.1: just-extend "^4.0.2" path-to-regexp "^1.7.0" -node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -5166,16 +5099,6 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== -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== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5291,7 +5214,7 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -5336,30 +5259,10 @@ optionator@^0.9.1: prelude-ls "^1.2.1" type-check "^0.4.0" -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -outvariant@^1.2.1, outvariant@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.0.tgz#e742e4bda77692da3eca698ef5bfac62d9fba06e" - integrity sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw== +outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" + integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" @@ -5416,7 +5319,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.0.0, parse-json@^5.2.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== @@ -5468,6 +5371,14 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -5541,20 +5452,20 @@ postcss-resolve-nested-selector@^0.1.1: resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= -postcss-safe-parser@^6.0.0: - version "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-safe-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz#6273d4e5149e286db5a45bc6cf6eafcad464014a" + integrity sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg== 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" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== +postcss-selector-parser@^6.0.15: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5564,7 +5475,7 @@ 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.31, postcss@^8.4.24: +postcss@8.4.31, postcss@^8.4.33: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -5666,11 +5577,6 @@ quibble@^0.9.1: lodash "^4.17.21" resolve "^1.22.8" -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== - rambda@^7.1.0: version "7.2.1" resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.2.1.tgz#c533f6e2def4edcd59f967df938ace5dd6da56af" @@ -5743,25 +5649,6 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" -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 "^5.0.0" - read-pkg "^6.0.0" - type-fest "^1.0.1" - -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 "^3.0.2" - parse-json "^5.2.0" - type-fest "^1.0.1" - readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -5775,7 +5662,7 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.4.0: +readable-stream@^3.0.6: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -5808,14 +5695,6 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" -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 "^5.0.0" - strip-indent "^4.0.0" - regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -5932,14 +5811,6 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -5957,6 +5828,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + rrweb-cssom@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" @@ -5969,10 +5847,10 @@ run-applescript@^5.0.0: dependencies: execa "^5.0.0" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== run-parallel@^1.1.9: version "1.2.0" @@ -5981,7 +5859,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.4.0, rxjs@^7.5.5, rxjs@^7.8.1: +rxjs@^7.4.0, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -6178,7 +6056,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.7, semver@^7.5.4: +semver@^7.3.7, semver@^7.5.4: 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== @@ -6234,11 +6112,6 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-cookie-parser@^2.4.6: - version "2.5.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" - integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -6287,10 +6160,10 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^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== +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sinon-chai@^3.7.0: version "3.7.0" @@ -6379,32 +6252,6 @@ spawn-command@0.0.2: resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -6428,7 +6275,7 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -statuses@2.0.1: +statuses@2.0.1, statuses@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== @@ -6438,19 +6285,12 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -strict-event-emitter@^0.2.4: - version "0.2.8" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" - integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== - dependencies: - events "^3.3.0" - -strict-event-emitter@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" - integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6459,6 +6299,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" @@ -6514,13 +6363,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -6536,96 +6392,82 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -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.1" - strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" - integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= - -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== +stylelint-config-recommended-scss@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz#d3482c9817dada80b5ec01685b38fc8af8f7263f" + integrity sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw== dependencies: postcss-scss "^4.0.9" - stylelint-config-recommended "^13.0.0" - stylelint-scss "^5.3.0" + stylelint-config-recommended "^14.0.0" + stylelint-scss "^6.0.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-recommended@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz#b395c7014838d2aaca1755eebd914d0bb5274994" + integrity sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ== -stylelint-prettier@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/stylelint-prettier/-/stylelint-prettier-4.0.2.tgz#9d82f5ab77781429f0049dede44665ee603f4986" - integrity sha512-EoHnR2PiaWgpGtoI4VW7AzneMfwmwQsNwQ+3/E2k/a+ju5yO6rfPfop4vzPQKcJN4ZM1YbspEOPu88D8538sbg== +stylelint-prettier@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/stylelint-prettier/-/stylelint-prettier-5.0.0.tgz#515a87800228f6bea603966462f7119755ee9b82" + integrity sha512-RHfSlRJIsaVg5Br94gZVdWlz/rBTyQzZflNE6dXvSxt/GthWMY3gEHsWZEBaVGg7GM+XrtVSp4RznFlB7i0oyw== dependencies: prettier-linter-helpers "^1.0.0" -stylelint-scss@^5.3.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-5.3.1.tgz#7f0f5f06d0a2a3c515aa71d3a8de3548045e03e1" - integrity sha512-5I9ZDIm77BZrjOccma5WyW2nJEKjXDd4Ca8Kk+oBapSO4pewSlno3n+OyimcyVJJujQZkBN2D+xuMkIamSc6hA== +stylelint-scss@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.1.0.tgz#b7ef162c417132e8df2b69d1759ae07395d54fb5" + integrity sha512-kCfK8TQzthGwb4vaZniZgxRsVbCM4ZckmT1b/H5m4FU3I8Dz0id9llKsy1NMp3XXqC8+OPD4rVKtUbSxXlJb5g== dependencies: known-css-properties "^0.29.0" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.1" - postcss-selector-parser "^6.0.13" + postcss-selector-parser "^6.0.15" postcss-value-parser "^4.2.0" -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== +stylelint@^16.2.1: + version "16.2.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.2.1.tgz#895d6d42523c5126ec0895f0ca2a58febeb77e89" + integrity sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA== dependencies: - "@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" + "@csstools/css-parser-algorithms" "^2.5.0" + "@csstools/css-tokenizer" "^2.2.3" + "@csstools/media-query-list-parser" "^2.1.7" + "@csstools/selector-specificity" "^3.0.1" balanced-match "^2.0.0" colord "^2.9.3" - cosmiconfig "^8.2.0" - css-functions-list "^3.1.0" + cosmiconfig "^9.0.0" + css-functions-list "^3.2.1" css-tree "^2.3.1" debug "^4.3.4" - fast-glob "^3.3.0" + fast-glob "^3.3.2" fastest-levenshtein "^1.0.16" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" html-tags "^3.3.1" - ignore "^5.2.4" - import-lazy "^4.0.0" + ignore "^5.3.0" imurmurhash "^0.1.4" is-plain-object "^5.0.0" - known-css-properties "^0.27.0" + known-css-properties "^0.29.0" mathml-tag-names "^2.1.3" - meow "^10.1.5" + meow "^13.1.0" micromatch "^4.0.5" normalize-path "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.24" + postcss "^8.4.33" postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.0.13" + postcss-safe-parser "^7.0.0" + postcss-selector-parser "^6.0.15" 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" + strip-ansi "^7.1.0" supports-hyperlinks "^3.0.0" svg-tags "^1.0.0" table "^6.8.1" @@ -6750,11 +6592,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -6765,13 +6602,6 @@ titleize@^3.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6806,21 +6636,11 @@ tr46@^4.1.1: dependencies: punycode "^2.3.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -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== - ts-api-utils@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" @@ -6875,15 +6695,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -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== - -type-fest@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^4.9.0: + version "4.10.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.10.2.tgz#3abdb144d93c5750432aac0d73d3e85fcab45738" + integrity sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw== type-is@~1.6.18: version "1.6.18" @@ -6917,6 +6732,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -6988,17 +6808,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@^0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -7009,14 +6818,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -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" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - varint@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" @@ -7049,27 +6850,6 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-encoding@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -7238,14 +7018,6 @@ whatwg-url@^12.0.0, whatwg-url@^12.0.1: tr46 "^4.1.1" webidl-conversions "^7.0.0" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -7257,7 +7029,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== @@ -7293,7 +7065,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -7302,6 +7074,24 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7355,7 +7145,7 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^20.2.2, yargs-parser@^20.2.9: +yargs-parser@^20.2.2: 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== @@ -7388,7 +7178,7 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.7.2: +yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==